msm_gem.c 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (C) 2013 Red Hat
  4. * Author: Rob Clark <robdclark@gmail.com>
  5. */
  6. #include <linux/dma-map-ops.h>
  7. #include <linux/vmalloc.h>
  8. #include <linux/spinlock.h>
  9. #include <linux/shmem_fs.h>
  10. #include <linux/dma-buf.h>
  11. #include <linux/pfn_t.h>
  12. #include <drm/drm_prime.h>
  13. #include <drm/drm_file.h>
  14. #include <trace/events/gpu_mem.h>
  15. #include "msm_drv.h"
  16. #include "msm_fence.h"
  17. #include "msm_gem.h"
  18. #include "msm_gpu.h"
  19. #include "msm_mmu.h"
  20. static dma_addr_t physaddr(struct drm_gem_object *obj)
  21. {
  22. struct msm_gem_object *msm_obj = to_msm_bo(obj);
  23. struct msm_drm_private *priv = obj->dev->dev_private;
  24. return (((dma_addr_t)msm_obj->vram_node->start) << PAGE_SHIFT) +
  25. priv->vram.paddr;
  26. }
  27. static bool use_pages(struct drm_gem_object *obj)
  28. {
  29. struct msm_gem_object *msm_obj = to_msm_bo(obj);
  30. return !msm_obj->vram_node;
  31. }
  32. static void update_device_mem(struct msm_drm_private *priv, ssize_t size)
  33. {
  34. uint64_t total_mem = atomic64_add_return(size, &priv->total_mem);
  35. trace_gpu_mem_total(0, 0, total_mem);
  36. }
  37. static void update_ctx_mem(struct drm_file *file, ssize_t size)
  38. {
  39. struct msm_file_private *ctx = file->driver_priv;
  40. uint64_t ctx_mem = atomic64_add_return(size, &ctx->ctx_mem);
  41. rcu_read_lock(); /* Locks file->pid! */
  42. trace_gpu_mem_total(0, pid_nr(rcu_dereference(file->pid)), ctx_mem);
  43. rcu_read_unlock();
  44. }
  45. static int msm_gem_open(struct drm_gem_object *obj, struct drm_file *file)
  46. {
  47. update_ctx_mem(file, obj->size);
  48. return 0;
  49. }
  50. static void msm_gem_close(struct drm_gem_object *obj, struct drm_file *file)
  51. {
  52. update_ctx_mem(file, -obj->size);
  53. }
  54. /*
  55. * Cache sync.. this is a bit over-complicated, to fit dma-mapping
  56. * API. Really GPU cache is out of scope here (handled on cmdstream)
  57. * and all we need to do is invalidate newly allocated pages before
  58. * mapping to CPU as uncached/writecombine.
  59. *
  60. * On top of this, we have the added headache, that depending on
  61. * display generation, the display's iommu may be wired up to either
  62. * the toplevel drm device (mdss), or to the mdp sub-node, meaning
  63. * that here we either have dma-direct or iommu ops.
  64. *
  65. * Let this be a cautionary tail of abstraction gone wrong.
  66. */
  67. static void sync_for_device(struct msm_gem_object *msm_obj)
  68. {
  69. struct device *dev = msm_obj->base.dev->dev;
  70. dma_map_sgtable(dev, msm_obj->sgt, DMA_BIDIRECTIONAL, 0);
  71. }
  72. static void sync_for_cpu(struct msm_gem_object *msm_obj)
  73. {
  74. struct device *dev = msm_obj->base.dev->dev;
  75. dma_unmap_sgtable(dev, msm_obj->sgt, DMA_BIDIRECTIONAL, 0);
  76. }
  77. static void update_lru_active(struct drm_gem_object *obj)
  78. {
  79. struct msm_drm_private *priv = obj->dev->dev_private;
  80. struct msm_gem_object *msm_obj = to_msm_bo(obj);
  81. GEM_WARN_ON(!msm_obj->pages);
  82. if (msm_obj->pin_count) {
  83. drm_gem_lru_move_tail_locked(&priv->lru.pinned, obj);
  84. } else if (msm_obj->madv == MSM_MADV_WILLNEED) {
  85. drm_gem_lru_move_tail_locked(&priv->lru.willneed, obj);
  86. } else {
  87. GEM_WARN_ON(msm_obj->madv != MSM_MADV_DONTNEED);
  88. drm_gem_lru_move_tail_locked(&priv->lru.dontneed, obj);
  89. }
  90. }
  91. static void update_lru_locked(struct drm_gem_object *obj)
  92. {
  93. struct msm_drm_private *priv = obj->dev->dev_private;
  94. struct msm_gem_object *msm_obj = to_msm_bo(obj);
  95. msm_gem_assert_locked(&msm_obj->base);
  96. if (!msm_obj->pages) {
  97. GEM_WARN_ON(msm_obj->pin_count);
  98. drm_gem_lru_move_tail_locked(&priv->lru.unbacked, obj);
  99. } else {
  100. update_lru_active(obj);
  101. }
  102. }
  103. static void update_lru(struct drm_gem_object *obj)
  104. {
  105. struct msm_drm_private *priv = obj->dev->dev_private;
  106. mutex_lock(&priv->lru.lock);
  107. update_lru_locked(obj);
  108. mutex_unlock(&priv->lru.lock);
  109. }
  110. /* allocate pages from VRAM carveout, used when no IOMMU: */
  111. static struct page **get_pages_vram(struct drm_gem_object *obj, int npages)
  112. {
  113. struct msm_gem_object *msm_obj = to_msm_bo(obj);
  114. struct msm_drm_private *priv = obj->dev->dev_private;
  115. dma_addr_t paddr;
  116. struct page **p;
  117. int ret, i;
  118. p = kvmalloc_array(npages, sizeof(struct page *), GFP_KERNEL);
  119. if (!p)
  120. return ERR_PTR(-ENOMEM);
  121. spin_lock(&priv->vram.lock);
  122. ret = drm_mm_insert_node(&priv->vram.mm, msm_obj->vram_node, npages);
  123. spin_unlock(&priv->vram.lock);
  124. if (ret) {
  125. kvfree(p);
  126. return ERR_PTR(ret);
  127. }
  128. paddr = physaddr(obj);
  129. for (i = 0; i < npages; i++) {
  130. p[i] = pfn_to_page(__phys_to_pfn(paddr));
  131. paddr += PAGE_SIZE;
  132. }
  133. return p;
  134. }
  135. static struct page **get_pages(struct drm_gem_object *obj)
  136. {
  137. struct msm_gem_object *msm_obj = to_msm_bo(obj);
  138. msm_gem_assert_locked(obj);
  139. if (!msm_obj->pages) {
  140. struct drm_device *dev = obj->dev;
  141. struct page **p;
  142. int npages = obj->size >> PAGE_SHIFT;
  143. if (use_pages(obj))
  144. p = drm_gem_get_pages(obj);
  145. else
  146. p = get_pages_vram(obj, npages);
  147. if (IS_ERR(p)) {
  148. DRM_DEV_ERROR(dev->dev, "could not get pages: %ld\n",
  149. PTR_ERR(p));
  150. return p;
  151. }
  152. update_device_mem(dev->dev_private, obj->size);
  153. msm_obj->pages = p;
  154. msm_obj->sgt = drm_prime_pages_to_sg(obj->dev, p, npages);
  155. if (IS_ERR(msm_obj->sgt)) {
  156. void *ptr = ERR_CAST(msm_obj->sgt);
  157. DRM_DEV_ERROR(dev->dev, "failed to allocate sgt\n");
  158. msm_obj->sgt = NULL;
  159. return ptr;
  160. }
  161. /* For non-cached buffers, ensure the new pages are clean
  162. * because display controller, GPU, etc. are not coherent:
  163. */
  164. if (msm_obj->flags & MSM_BO_WC)
  165. sync_for_device(msm_obj);
  166. update_lru(obj);
  167. }
  168. return msm_obj->pages;
  169. }
  170. static void put_pages_vram(struct drm_gem_object *obj)
  171. {
  172. struct msm_gem_object *msm_obj = to_msm_bo(obj);
  173. struct msm_drm_private *priv = obj->dev->dev_private;
  174. spin_lock(&priv->vram.lock);
  175. drm_mm_remove_node(msm_obj->vram_node);
  176. spin_unlock(&priv->vram.lock);
  177. kvfree(msm_obj->pages);
  178. }
  179. static void put_pages(struct drm_gem_object *obj)
  180. {
  181. struct msm_gem_object *msm_obj = to_msm_bo(obj);
  182. if (msm_obj->pages) {
  183. if (msm_obj->sgt) {
  184. /* For non-cached buffers, ensure the new
  185. * pages are clean because display controller,
  186. * GPU, etc. are not coherent:
  187. */
  188. if (msm_obj->flags & MSM_BO_WC)
  189. sync_for_cpu(msm_obj);
  190. sg_free_table(msm_obj->sgt);
  191. kfree(msm_obj->sgt);
  192. msm_obj->sgt = NULL;
  193. }
  194. update_device_mem(obj->dev->dev_private, -obj->size);
  195. if (use_pages(obj))
  196. drm_gem_put_pages(obj, msm_obj->pages, true, false);
  197. else
  198. put_pages_vram(obj);
  199. msm_obj->pages = NULL;
  200. update_lru(obj);
  201. }
  202. }
  203. static struct page **msm_gem_get_pages_locked(struct drm_gem_object *obj,
  204. unsigned madv)
  205. {
  206. struct msm_gem_object *msm_obj = to_msm_bo(obj);
  207. msm_gem_assert_locked(obj);
  208. if (msm_obj->madv > madv) {
  209. DRM_DEV_DEBUG_DRIVER(obj->dev->dev, "Invalid madv state: %u vs %u\n",
  210. msm_obj->madv, madv);
  211. return ERR_PTR(-EBUSY);
  212. }
  213. return get_pages(obj);
  214. }
  215. /*
  216. * Update the pin count of the object, call under lru.lock
  217. */
  218. void msm_gem_pin_obj_locked(struct drm_gem_object *obj)
  219. {
  220. struct msm_drm_private *priv = obj->dev->dev_private;
  221. msm_gem_assert_locked(obj);
  222. to_msm_bo(obj)->pin_count++;
  223. drm_gem_lru_move_tail_locked(&priv->lru.pinned, obj);
  224. }
  225. static void pin_obj_locked(struct drm_gem_object *obj)
  226. {
  227. struct msm_drm_private *priv = obj->dev->dev_private;
  228. mutex_lock(&priv->lru.lock);
  229. msm_gem_pin_obj_locked(obj);
  230. mutex_unlock(&priv->lru.lock);
  231. }
  232. struct page **msm_gem_pin_pages_locked(struct drm_gem_object *obj)
  233. {
  234. struct page **p;
  235. msm_gem_assert_locked(obj);
  236. p = msm_gem_get_pages_locked(obj, MSM_MADV_WILLNEED);
  237. if (!IS_ERR(p))
  238. pin_obj_locked(obj);
  239. return p;
  240. }
  241. void msm_gem_unpin_pages_locked(struct drm_gem_object *obj)
  242. {
  243. msm_gem_assert_locked(obj);
  244. msm_gem_unpin_locked(obj);
  245. }
  246. static pgprot_t msm_gem_pgprot(struct msm_gem_object *msm_obj, pgprot_t prot)
  247. {
  248. if (msm_obj->flags & MSM_BO_WC)
  249. return pgprot_writecombine(prot);
  250. return prot;
  251. }
  252. static vm_fault_t msm_gem_fault(struct vm_fault *vmf)
  253. {
  254. struct vm_area_struct *vma = vmf->vma;
  255. struct drm_gem_object *obj = vma->vm_private_data;
  256. struct msm_gem_object *msm_obj = to_msm_bo(obj);
  257. struct page **pages;
  258. unsigned long pfn;
  259. pgoff_t pgoff;
  260. int err;
  261. vm_fault_t ret;
  262. /*
  263. * vm_ops.open/drm_gem_mmap_obj and close get and put
  264. * a reference on obj. So, we dont need to hold one here.
  265. */
  266. err = msm_gem_lock_interruptible(obj);
  267. if (err) {
  268. ret = VM_FAULT_NOPAGE;
  269. goto out;
  270. }
  271. if (GEM_WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED)) {
  272. msm_gem_unlock(obj);
  273. return VM_FAULT_SIGBUS;
  274. }
  275. /* make sure we have pages attached now */
  276. pages = get_pages(obj);
  277. if (IS_ERR(pages)) {
  278. ret = vmf_error(PTR_ERR(pages));
  279. goto out_unlock;
  280. }
  281. /* We don't use vmf->pgoff since that has the fake offset: */
  282. pgoff = (vmf->address - vma->vm_start) >> PAGE_SHIFT;
  283. pfn = page_to_pfn(pages[pgoff]);
  284. VERB("Inserting %p pfn %lx, pa %lx", (void *)vmf->address,
  285. pfn, pfn << PAGE_SHIFT);
  286. ret = vmf_insert_pfn(vma, vmf->address, pfn);
  287. out_unlock:
  288. msm_gem_unlock(obj);
  289. out:
  290. return ret;
  291. }
  292. /** get mmap offset */
  293. static uint64_t mmap_offset(struct drm_gem_object *obj)
  294. {
  295. struct drm_device *dev = obj->dev;
  296. int ret;
  297. msm_gem_assert_locked(obj);
  298. /* Make it mmapable */
  299. ret = drm_gem_create_mmap_offset(obj);
  300. if (ret) {
  301. DRM_DEV_ERROR(dev->dev, "could not allocate mmap offset\n");
  302. return 0;
  303. }
  304. return drm_vma_node_offset_addr(&obj->vma_node);
  305. }
  306. uint64_t msm_gem_mmap_offset(struct drm_gem_object *obj)
  307. {
  308. uint64_t offset;
  309. msm_gem_lock(obj);
  310. offset = mmap_offset(obj);
  311. msm_gem_unlock(obj);
  312. return offset;
  313. }
  314. static struct msm_gem_vma *add_vma(struct drm_gem_object *obj,
  315. struct msm_gem_address_space *aspace)
  316. {
  317. struct msm_gem_object *msm_obj = to_msm_bo(obj);
  318. struct msm_gem_vma *vma;
  319. msm_gem_assert_locked(obj);
  320. vma = msm_gem_vma_new(aspace);
  321. if (!vma)
  322. return ERR_PTR(-ENOMEM);
  323. list_add_tail(&vma->list, &msm_obj->vmas);
  324. return vma;
  325. }
  326. static struct msm_gem_vma *lookup_vma(struct drm_gem_object *obj,
  327. struct msm_gem_address_space *aspace)
  328. {
  329. struct msm_gem_object *msm_obj = to_msm_bo(obj);
  330. struct msm_gem_vma *vma;
  331. msm_gem_assert_locked(obj);
  332. list_for_each_entry(vma, &msm_obj->vmas, list) {
  333. if (vma->aspace == aspace)
  334. return vma;
  335. }
  336. return NULL;
  337. }
  338. static void del_vma(struct msm_gem_vma *vma)
  339. {
  340. if (!vma)
  341. return;
  342. list_del(&vma->list);
  343. kfree(vma);
  344. }
  345. /*
  346. * If close is true, this also closes the VMA (releasing the allocated
  347. * iova range) in addition to removing the iommu mapping. In the eviction
  348. * case (!close), we keep the iova allocated, but only remove the iommu
  349. * mapping.
  350. */
  351. static void
  352. put_iova_spaces(struct drm_gem_object *obj, bool close)
  353. {
  354. struct msm_gem_object *msm_obj = to_msm_bo(obj);
  355. struct msm_gem_vma *vma;
  356. msm_gem_assert_locked(obj);
  357. list_for_each_entry(vma, &msm_obj->vmas, list) {
  358. if (vma->aspace) {
  359. msm_gem_vma_purge(vma);
  360. if (close)
  361. msm_gem_vma_close(vma);
  362. }
  363. }
  364. }
  365. /* Called with msm_obj locked */
  366. static void
  367. put_iova_vmas(struct drm_gem_object *obj)
  368. {
  369. struct msm_gem_object *msm_obj = to_msm_bo(obj);
  370. struct msm_gem_vma *vma, *tmp;
  371. msm_gem_assert_locked(obj);
  372. list_for_each_entry_safe(vma, tmp, &msm_obj->vmas, list) {
  373. del_vma(vma);
  374. }
  375. }
  376. static struct msm_gem_vma *get_vma_locked(struct drm_gem_object *obj,
  377. struct msm_gem_address_space *aspace,
  378. u64 range_start, u64 range_end)
  379. {
  380. struct msm_gem_vma *vma;
  381. msm_gem_assert_locked(obj);
  382. vma = lookup_vma(obj, aspace);
  383. if (!vma) {
  384. int ret;
  385. vma = add_vma(obj, aspace);
  386. if (IS_ERR(vma))
  387. return vma;
  388. ret = msm_gem_vma_init(vma, obj->size,
  389. range_start, range_end);
  390. if (ret) {
  391. del_vma(vma);
  392. return ERR_PTR(ret);
  393. }
  394. } else {
  395. GEM_WARN_ON(vma->iova < range_start);
  396. GEM_WARN_ON((vma->iova + obj->size) > range_end);
  397. }
  398. return vma;
  399. }
  400. int msm_gem_pin_vma_locked(struct drm_gem_object *obj, struct msm_gem_vma *vma)
  401. {
  402. struct msm_gem_object *msm_obj = to_msm_bo(obj);
  403. struct page **pages;
  404. int prot = IOMMU_READ;
  405. if (!(msm_obj->flags & MSM_BO_GPU_READONLY))
  406. prot |= IOMMU_WRITE;
  407. if (msm_obj->flags & MSM_BO_MAP_PRIV)
  408. prot |= IOMMU_PRIV;
  409. if (msm_obj->flags & MSM_BO_CACHED_COHERENT)
  410. prot |= IOMMU_CACHE;
  411. msm_gem_assert_locked(obj);
  412. pages = msm_gem_get_pages_locked(obj, MSM_MADV_WILLNEED);
  413. if (IS_ERR(pages))
  414. return PTR_ERR(pages);
  415. return msm_gem_vma_map(vma, prot, msm_obj->sgt, obj->size);
  416. }
  417. void msm_gem_unpin_locked(struct drm_gem_object *obj)
  418. {
  419. struct msm_drm_private *priv = obj->dev->dev_private;
  420. struct msm_gem_object *msm_obj = to_msm_bo(obj);
  421. msm_gem_assert_locked(obj);
  422. mutex_lock(&priv->lru.lock);
  423. msm_obj->pin_count--;
  424. GEM_WARN_ON(msm_obj->pin_count < 0);
  425. update_lru_locked(obj);
  426. mutex_unlock(&priv->lru.lock);
  427. }
  428. /* Special unpin path for use in fence-signaling path, avoiding the need
  429. * to hold the obj lock by only depending on things that a protected by
  430. * the LRU lock. In particular we know that that we already have backing
  431. * and and that the object's dma_resv has the fence for the current
  432. * submit/job which will prevent us racing against page eviction.
  433. */
  434. void msm_gem_unpin_active(struct drm_gem_object *obj)
  435. {
  436. struct msm_gem_object *msm_obj = to_msm_bo(obj);
  437. msm_obj->pin_count--;
  438. GEM_WARN_ON(msm_obj->pin_count < 0);
  439. update_lru_active(obj);
  440. }
  441. struct msm_gem_vma *msm_gem_get_vma_locked(struct drm_gem_object *obj,
  442. struct msm_gem_address_space *aspace)
  443. {
  444. return get_vma_locked(obj, aspace, 0, U64_MAX);
  445. }
  446. static int get_and_pin_iova_range_locked(struct drm_gem_object *obj,
  447. struct msm_gem_address_space *aspace, uint64_t *iova,
  448. u64 range_start, u64 range_end)
  449. {
  450. struct msm_gem_vma *vma;
  451. int ret;
  452. msm_gem_assert_locked(obj);
  453. vma = get_vma_locked(obj, aspace, range_start, range_end);
  454. if (IS_ERR(vma))
  455. return PTR_ERR(vma);
  456. ret = msm_gem_pin_vma_locked(obj, vma);
  457. if (!ret) {
  458. *iova = vma->iova;
  459. pin_obj_locked(obj);
  460. }
  461. return ret;
  462. }
  463. /*
  464. * get iova and pin it. Should have a matching put
  465. * limits iova to specified range (in pages)
  466. */
  467. int msm_gem_get_and_pin_iova_range(struct drm_gem_object *obj,
  468. struct msm_gem_address_space *aspace, uint64_t *iova,
  469. u64 range_start, u64 range_end)
  470. {
  471. int ret;
  472. msm_gem_lock(obj);
  473. ret = get_and_pin_iova_range_locked(obj, aspace, iova, range_start, range_end);
  474. msm_gem_unlock(obj);
  475. return ret;
  476. }
  477. /* get iova and pin it. Should have a matching put */
  478. int msm_gem_get_and_pin_iova(struct drm_gem_object *obj,
  479. struct msm_gem_address_space *aspace, uint64_t *iova)
  480. {
  481. return msm_gem_get_and_pin_iova_range(obj, aspace, iova, 0, U64_MAX);
  482. }
  483. /*
  484. * Get an iova but don't pin it. Doesn't need a put because iovas are currently
  485. * valid for the life of the object
  486. */
  487. int msm_gem_get_iova(struct drm_gem_object *obj,
  488. struct msm_gem_address_space *aspace, uint64_t *iova)
  489. {
  490. struct msm_gem_vma *vma;
  491. int ret = 0;
  492. msm_gem_lock(obj);
  493. vma = get_vma_locked(obj, aspace, 0, U64_MAX);
  494. if (IS_ERR(vma)) {
  495. ret = PTR_ERR(vma);
  496. } else {
  497. *iova = vma->iova;
  498. }
  499. msm_gem_unlock(obj);
  500. return ret;
  501. }
  502. static int clear_iova(struct drm_gem_object *obj,
  503. struct msm_gem_address_space *aspace)
  504. {
  505. struct msm_gem_vma *vma = lookup_vma(obj, aspace);
  506. if (!vma)
  507. return 0;
  508. msm_gem_vma_purge(vma);
  509. msm_gem_vma_close(vma);
  510. del_vma(vma);
  511. return 0;
  512. }
  513. /*
  514. * Get the requested iova but don't pin it. Fails if the requested iova is
  515. * not available. Doesn't need a put because iovas are currently valid for
  516. * the life of the object.
  517. *
  518. * Setting an iova of zero will clear the vma.
  519. */
  520. int msm_gem_set_iova(struct drm_gem_object *obj,
  521. struct msm_gem_address_space *aspace, uint64_t iova)
  522. {
  523. int ret = 0;
  524. msm_gem_lock(obj);
  525. if (!iova) {
  526. ret = clear_iova(obj, aspace);
  527. } else {
  528. struct msm_gem_vma *vma;
  529. vma = get_vma_locked(obj, aspace, iova, iova + obj->size);
  530. if (IS_ERR(vma)) {
  531. ret = PTR_ERR(vma);
  532. } else if (GEM_WARN_ON(vma->iova != iova)) {
  533. clear_iova(obj, aspace);
  534. ret = -EBUSY;
  535. }
  536. }
  537. msm_gem_unlock(obj);
  538. return ret;
  539. }
  540. /*
  541. * Unpin a iova by updating the reference counts. The memory isn't actually
  542. * purged until something else (shrinker, mm_notifier, destroy, etc) decides
  543. * to get rid of it
  544. */
  545. void msm_gem_unpin_iova(struct drm_gem_object *obj,
  546. struct msm_gem_address_space *aspace)
  547. {
  548. struct msm_gem_vma *vma;
  549. msm_gem_lock(obj);
  550. vma = lookup_vma(obj, aspace);
  551. if (!GEM_WARN_ON(!vma)) {
  552. msm_gem_unpin_locked(obj);
  553. }
  554. msm_gem_unlock(obj);
  555. }
  556. int msm_gem_dumb_create(struct drm_file *file, struct drm_device *dev,
  557. struct drm_mode_create_dumb *args)
  558. {
  559. args->pitch = align_pitch(args->width, args->bpp);
  560. args->size = PAGE_ALIGN(args->pitch * args->height);
  561. return msm_gem_new_handle(dev, file, args->size,
  562. MSM_BO_SCANOUT | MSM_BO_WC, &args->handle, "dumb");
  563. }
  564. int msm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
  565. uint32_t handle, uint64_t *offset)
  566. {
  567. struct drm_gem_object *obj;
  568. int ret = 0;
  569. /* GEM does all our handle to object mapping */
  570. obj = drm_gem_object_lookup(file, handle);
  571. if (obj == NULL) {
  572. ret = -ENOENT;
  573. goto fail;
  574. }
  575. *offset = msm_gem_mmap_offset(obj);
  576. drm_gem_object_put(obj);
  577. fail:
  578. return ret;
  579. }
  580. static void *get_vaddr(struct drm_gem_object *obj, unsigned madv)
  581. {
  582. struct msm_gem_object *msm_obj = to_msm_bo(obj);
  583. struct page **pages;
  584. int ret = 0;
  585. msm_gem_assert_locked(obj);
  586. if (obj->import_attach)
  587. return ERR_PTR(-ENODEV);
  588. pages = msm_gem_get_pages_locked(obj, madv);
  589. if (IS_ERR(pages))
  590. return ERR_CAST(pages);
  591. pin_obj_locked(obj);
  592. /* increment vmap_count *before* vmap() call, so shrinker can
  593. * check vmap_count (is_vunmapable()) outside of msm_obj lock.
  594. * This guarantees that we won't try to msm_gem_vunmap() this
  595. * same object from within the vmap() call (while we already
  596. * hold msm_obj lock)
  597. */
  598. msm_obj->vmap_count++;
  599. if (!msm_obj->vaddr) {
  600. msm_obj->vaddr = vmap(pages, obj->size >> PAGE_SHIFT,
  601. VM_MAP, msm_gem_pgprot(msm_obj, PAGE_KERNEL));
  602. if (msm_obj->vaddr == NULL) {
  603. ret = -ENOMEM;
  604. goto fail;
  605. }
  606. }
  607. return msm_obj->vaddr;
  608. fail:
  609. msm_obj->vmap_count--;
  610. msm_gem_unpin_locked(obj);
  611. return ERR_PTR(ret);
  612. }
  613. void *msm_gem_get_vaddr_locked(struct drm_gem_object *obj)
  614. {
  615. return get_vaddr(obj, MSM_MADV_WILLNEED);
  616. }
  617. void *msm_gem_get_vaddr(struct drm_gem_object *obj)
  618. {
  619. void *ret;
  620. msm_gem_lock(obj);
  621. ret = msm_gem_get_vaddr_locked(obj);
  622. msm_gem_unlock(obj);
  623. return ret;
  624. }
  625. /*
  626. * Don't use this! It is for the very special case of dumping
  627. * submits from GPU hangs or faults, were the bo may already
  628. * be MSM_MADV_DONTNEED, but we know the buffer is still on the
  629. * active list.
  630. */
  631. void *msm_gem_get_vaddr_active(struct drm_gem_object *obj)
  632. {
  633. return get_vaddr(obj, __MSM_MADV_PURGED);
  634. }
  635. void msm_gem_put_vaddr_locked(struct drm_gem_object *obj)
  636. {
  637. struct msm_gem_object *msm_obj = to_msm_bo(obj);
  638. msm_gem_assert_locked(obj);
  639. GEM_WARN_ON(msm_obj->vmap_count < 1);
  640. msm_obj->vmap_count--;
  641. msm_gem_unpin_locked(obj);
  642. }
  643. void msm_gem_put_vaddr(struct drm_gem_object *obj)
  644. {
  645. msm_gem_lock(obj);
  646. msm_gem_put_vaddr_locked(obj);
  647. msm_gem_unlock(obj);
  648. }
  649. /* Update madvise status, returns true if not purged, else
  650. * false or -errno.
  651. */
  652. int msm_gem_madvise(struct drm_gem_object *obj, unsigned madv)
  653. {
  654. struct msm_drm_private *priv = obj->dev->dev_private;
  655. struct msm_gem_object *msm_obj = to_msm_bo(obj);
  656. msm_gem_lock(obj);
  657. mutex_lock(&priv->lru.lock);
  658. if (msm_obj->madv != __MSM_MADV_PURGED)
  659. msm_obj->madv = madv;
  660. madv = msm_obj->madv;
  661. /* If the obj is inactive, we might need to move it
  662. * between inactive lists
  663. */
  664. update_lru_locked(obj);
  665. mutex_unlock(&priv->lru.lock);
  666. msm_gem_unlock(obj);
  667. return (madv != __MSM_MADV_PURGED);
  668. }
  669. void msm_gem_purge(struct drm_gem_object *obj)
  670. {
  671. struct drm_device *dev = obj->dev;
  672. struct msm_drm_private *priv = obj->dev->dev_private;
  673. struct msm_gem_object *msm_obj = to_msm_bo(obj);
  674. msm_gem_assert_locked(obj);
  675. GEM_WARN_ON(!is_purgeable(msm_obj));
  676. /* Get rid of any iommu mapping(s): */
  677. put_iova_spaces(obj, true);
  678. msm_gem_vunmap(obj);
  679. drm_vma_node_unmap(&obj->vma_node, dev->anon_inode->i_mapping);
  680. put_pages(obj);
  681. put_iova_vmas(obj);
  682. mutex_lock(&priv->lru.lock);
  683. /* A one-way transition: */
  684. msm_obj->madv = __MSM_MADV_PURGED;
  685. mutex_unlock(&priv->lru.lock);
  686. drm_gem_free_mmap_offset(obj);
  687. /* Our goal here is to return as much of the memory as
  688. * is possible back to the system as we are called from OOM.
  689. * To do this we must instruct the shmfs to drop all of its
  690. * backing pages, *now*.
  691. */
  692. shmem_truncate_range(file_inode(obj->filp), 0, (loff_t)-1);
  693. invalidate_mapping_pages(file_inode(obj->filp)->i_mapping,
  694. 0, (loff_t)-1);
  695. }
  696. /*
  697. * Unpin the backing pages and make them available to be swapped out.
  698. */
  699. void msm_gem_evict(struct drm_gem_object *obj)
  700. {
  701. struct drm_device *dev = obj->dev;
  702. struct msm_gem_object *msm_obj = to_msm_bo(obj);
  703. msm_gem_assert_locked(obj);
  704. GEM_WARN_ON(is_unevictable(msm_obj));
  705. /* Get rid of any iommu mapping(s): */
  706. put_iova_spaces(obj, false);
  707. drm_vma_node_unmap(&obj->vma_node, dev->anon_inode->i_mapping);
  708. put_pages(obj);
  709. }
  710. void msm_gem_vunmap(struct drm_gem_object *obj)
  711. {
  712. struct msm_gem_object *msm_obj = to_msm_bo(obj);
  713. msm_gem_assert_locked(obj);
  714. if (!msm_obj->vaddr || GEM_WARN_ON(!is_vunmapable(msm_obj)))
  715. return;
  716. vunmap(msm_obj->vaddr);
  717. msm_obj->vaddr = NULL;
  718. }
  719. bool msm_gem_active(struct drm_gem_object *obj)
  720. {
  721. msm_gem_assert_locked(obj);
  722. if (to_msm_bo(obj)->pin_count)
  723. return true;
  724. return !dma_resv_test_signaled(obj->resv, dma_resv_usage_rw(true));
  725. }
  726. int msm_gem_cpu_prep(struct drm_gem_object *obj, uint32_t op, ktime_t *timeout)
  727. {
  728. bool write = !!(op & MSM_PREP_WRITE);
  729. unsigned long remain =
  730. op & MSM_PREP_NOSYNC ? 0 : timeout_to_jiffies(timeout);
  731. long ret;
  732. if (op & MSM_PREP_BOOST) {
  733. dma_resv_set_deadline(obj->resv, dma_resv_usage_rw(write),
  734. ktime_get());
  735. }
  736. ret = dma_resv_wait_timeout(obj->resv, dma_resv_usage_rw(write),
  737. true, remain);
  738. if (ret == 0)
  739. return remain == 0 ? -EBUSY : -ETIMEDOUT;
  740. else if (ret < 0)
  741. return ret;
  742. /* TODO cache maintenance */
  743. return 0;
  744. }
  745. int msm_gem_cpu_fini(struct drm_gem_object *obj)
  746. {
  747. /* TODO cache maintenance */
  748. return 0;
  749. }
  750. #ifdef CONFIG_DEBUG_FS
  751. void msm_gem_describe(struct drm_gem_object *obj, struct seq_file *m,
  752. struct msm_gem_stats *stats)
  753. {
  754. struct msm_gem_object *msm_obj = to_msm_bo(obj);
  755. struct dma_resv *robj = obj->resv;
  756. struct msm_gem_vma *vma;
  757. uint64_t off = drm_vma_node_start(&obj->vma_node);
  758. const char *madv;
  759. if (!msm_gem_trylock(obj))
  760. return;
  761. stats->all.count++;
  762. stats->all.size += obj->size;
  763. if (msm_gem_active(obj)) {
  764. stats->active.count++;
  765. stats->active.size += obj->size;
  766. }
  767. if (msm_obj->pages) {
  768. stats->resident.count++;
  769. stats->resident.size += obj->size;
  770. }
  771. switch (msm_obj->madv) {
  772. case __MSM_MADV_PURGED:
  773. stats->purged.count++;
  774. stats->purged.size += obj->size;
  775. madv = " purged";
  776. break;
  777. case MSM_MADV_DONTNEED:
  778. stats->purgeable.count++;
  779. stats->purgeable.size += obj->size;
  780. madv = " purgeable";
  781. break;
  782. case MSM_MADV_WILLNEED:
  783. default:
  784. madv = "";
  785. break;
  786. }
  787. seq_printf(m, "%08x: %c %2d (%2d) %08llx %p",
  788. msm_obj->flags, msm_gem_active(obj) ? 'A' : 'I',
  789. obj->name, kref_read(&obj->refcount),
  790. off, msm_obj->vaddr);
  791. seq_printf(m, " %08zu %9s %-32s\n", obj->size, madv, msm_obj->name);
  792. if (!list_empty(&msm_obj->vmas)) {
  793. seq_puts(m, " vmas:");
  794. list_for_each_entry(vma, &msm_obj->vmas, list) {
  795. const char *name, *comm;
  796. if (vma->aspace) {
  797. struct msm_gem_address_space *aspace = vma->aspace;
  798. struct task_struct *task =
  799. get_pid_task(aspace->pid, PIDTYPE_PID);
  800. if (task) {
  801. comm = kstrdup(task->comm, GFP_KERNEL);
  802. put_task_struct(task);
  803. } else {
  804. comm = NULL;
  805. }
  806. name = aspace->name;
  807. } else {
  808. name = comm = NULL;
  809. }
  810. seq_printf(m, " [%s%s%s: aspace=%p, %08llx,%s]",
  811. name, comm ? ":" : "", comm ? comm : "",
  812. vma->aspace, vma->iova,
  813. vma->mapped ? "mapped" : "unmapped");
  814. kfree(comm);
  815. }
  816. seq_puts(m, "\n");
  817. }
  818. dma_resv_describe(robj, m);
  819. msm_gem_unlock(obj);
  820. }
  821. void msm_gem_describe_objects(struct list_head *list, struct seq_file *m)
  822. {
  823. struct msm_gem_stats stats = {};
  824. struct msm_gem_object *msm_obj;
  825. seq_puts(m, " flags id ref offset kaddr size madv name\n");
  826. list_for_each_entry(msm_obj, list, node) {
  827. struct drm_gem_object *obj = &msm_obj->base;
  828. seq_puts(m, " ");
  829. msm_gem_describe(obj, m, &stats);
  830. }
  831. seq_printf(m, "Total: %4d objects, %9zu bytes\n",
  832. stats.all.count, stats.all.size);
  833. seq_printf(m, "Active: %4d objects, %9zu bytes\n",
  834. stats.active.count, stats.active.size);
  835. seq_printf(m, "Resident: %4d objects, %9zu bytes\n",
  836. stats.resident.count, stats.resident.size);
  837. seq_printf(m, "Purgeable: %4d objects, %9zu bytes\n",
  838. stats.purgeable.count, stats.purgeable.size);
  839. seq_printf(m, "Purged: %4d objects, %9zu bytes\n",
  840. stats.purged.count, stats.purged.size);
  841. }
  842. #endif
  843. /* don't call directly! Use drm_gem_object_put() */
  844. static void msm_gem_free_object(struct drm_gem_object *obj)
  845. {
  846. struct msm_gem_object *msm_obj = to_msm_bo(obj);
  847. struct drm_device *dev = obj->dev;
  848. struct msm_drm_private *priv = dev->dev_private;
  849. mutex_lock(&priv->obj_lock);
  850. list_del(&msm_obj->node);
  851. mutex_unlock(&priv->obj_lock);
  852. put_iova_spaces(obj, true);
  853. if (obj->import_attach) {
  854. GEM_WARN_ON(msm_obj->vaddr);
  855. /* Don't drop the pages for imported dmabuf, as they are not
  856. * ours, just free the array we allocated:
  857. */
  858. kvfree(msm_obj->pages);
  859. put_iova_vmas(obj);
  860. drm_prime_gem_destroy(obj, msm_obj->sgt);
  861. } else {
  862. msm_gem_vunmap(obj);
  863. put_pages(obj);
  864. put_iova_vmas(obj);
  865. }
  866. drm_gem_object_release(obj);
  867. kfree(msm_obj->metadata);
  868. kfree(msm_obj);
  869. }
  870. static int msm_gem_object_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
  871. {
  872. struct msm_gem_object *msm_obj = to_msm_bo(obj);
  873. vm_flags_set(vma, VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP);
  874. vma->vm_page_prot = msm_gem_pgprot(msm_obj, vm_get_page_prot(vma->vm_flags));
  875. return 0;
  876. }
  877. /* convenience method to construct a GEM buffer object, and userspace handle */
  878. int msm_gem_new_handle(struct drm_device *dev, struct drm_file *file,
  879. uint32_t size, uint32_t flags, uint32_t *handle,
  880. char *name)
  881. {
  882. struct drm_gem_object *obj;
  883. int ret;
  884. obj = msm_gem_new(dev, size, flags);
  885. if (IS_ERR(obj))
  886. return PTR_ERR(obj);
  887. if (name)
  888. msm_gem_object_set_name(obj, "%s", name);
  889. ret = drm_gem_handle_create(file, obj, handle);
  890. /* drop reference from allocate - handle holds it now */
  891. drm_gem_object_put(obj);
  892. return ret;
  893. }
  894. static enum drm_gem_object_status msm_gem_status(struct drm_gem_object *obj)
  895. {
  896. struct msm_gem_object *msm_obj = to_msm_bo(obj);
  897. enum drm_gem_object_status status = 0;
  898. if (msm_obj->pages)
  899. status |= DRM_GEM_OBJECT_RESIDENT;
  900. if (msm_obj->madv == MSM_MADV_DONTNEED)
  901. status |= DRM_GEM_OBJECT_PURGEABLE;
  902. return status;
  903. }
  904. static const struct vm_operations_struct vm_ops = {
  905. .fault = msm_gem_fault,
  906. .open = drm_gem_vm_open,
  907. .close = drm_gem_vm_close,
  908. };
  909. static const struct drm_gem_object_funcs msm_gem_object_funcs = {
  910. .free = msm_gem_free_object,
  911. .open = msm_gem_open,
  912. .close = msm_gem_close,
  913. .pin = msm_gem_prime_pin,
  914. .unpin = msm_gem_prime_unpin,
  915. .get_sg_table = msm_gem_prime_get_sg_table,
  916. .vmap = msm_gem_prime_vmap,
  917. .vunmap = msm_gem_prime_vunmap,
  918. .mmap = msm_gem_object_mmap,
  919. .status = msm_gem_status,
  920. .vm_ops = &vm_ops,
  921. };
  922. static int msm_gem_new_impl(struct drm_device *dev,
  923. uint32_t size, uint32_t flags,
  924. struct drm_gem_object **obj)
  925. {
  926. struct msm_drm_private *priv = dev->dev_private;
  927. struct msm_gem_object *msm_obj;
  928. switch (flags & MSM_BO_CACHE_MASK) {
  929. case MSM_BO_CACHED:
  930. case MSM_BO_WC:
  931. break;
  932. case MSM_BO_CACHED_COHERENT:
  933. if (priv->has_cached_coherent)
  934. break;
  935. fallthrough;
  936. default:
  937. DRM_DEV_DEBUG(dev->dev, "invalid cache flag: %x\n",
  938. (flags & MSM_BO_CACHE_MASK));
  939. return -EINVAL;
  940. }
  941. msm_obj = kzalloc(sizeof(*msm_obj), GFP_KERNEL);
  942. if (!msm_obj)
  943. return -ENOMEM;
  944. msm_obj->flags = flags;
  945. msm_obj->madv = MSM_MADV_WILLNEED;
  946. INIT_LIST_HEAD(&msm_obj->node);
  947. INIT_LIST_HEAD(&msm_obj->vmas);
  948. *obj = &msm_obj->base;
  949. (*obj)->funcs = &msm_gem_object_funcs;
  950. return 0;
  951. }
  952. struct drm_gem_object *msm_gem_new(struct drm_device *dev, uint32_t size, uint32_t flags)
  953. {
  954. struct msm_drm_private *priv = dev->dev_private;
  955. struct msm_gem_object *msm_obj;
  956. struct drm_gem_object *obj = NULL;
  957. bool use_vram = false;
  958. int ret;
  959. size = PAGE_ALIGN(size);
  960. if (!msm_use_mmu(dev))
  961. use_vram = true;
  962. else if ((flags & (MSM_BO_STOLEN | MSM_BO_SCANOUT)) && priv->vram.size)
  963. use_vram = true;
  964. if (GEM_WARN_ON(use_vram && !priv->vram.size))
  965. return ERR_PTR(-EINVAL);
  966. /* Disallow zero sized objects as they make the underlying
  967. * infrastructure grumpy
  968. */
  969. if (size == 0)
  970. return ERR_PTR(-EINVAL);
  971. ret = msm_gem_new_impl(dev, size, flags, &obj);
  972. if (ret)
  973. return ERR_PTR(ret);
  974. msm_obj = to_msm_bo(obj);
  975. if (use_vram) {
  976. struct msm_gem_vma *vma;
  977. struct page **pages;
  978. drm_gem_private_object_init(dev, obj, size);
  979. msm_gem_lock(obj);
  980. vma = add_vma(obj, NULL);
  981. msm_gem_unlock(obj);
  982. if (IS_ERR(vma)) {
  983. ret = PTR_ERR(vma);
  984. goto fail;
  985. }
  986. to_msm_bo(obj)->vram_node = &vma->node;
  987. msm_gem_lock(obj);
  988. pages = get_pages(obj);
  989. msm_gem_unlock(obj);
  990. if (IS_ERR(pages)) {
  991. ret = PTR_ERR(pages);
  992. goto fail;
  993. }
  994. vma->iova = physaddr(obj);
  995. } else {
  996. ret = drm_gem_object_init(dev, obj, size);
  997. if (ret)
  998. goto fail;
  999. /*
  1000. * Our buffers are kept pinned, so allocating them from the
  1001. * MOVABLE zone is a really bad idea, and conflicts with CMA.
  1002. * See comments above new_inode() why this is required _and_
  1003. * expected if you're going to pin these pages.
  1004. */
  1005. mapping_set_gfp_mask(obj->filp->f_mapping, GFP_HIGHUSER);
  1006. }
  1007. drm_gem_lru_move_tail(&priv->lru.unbacked, obj);
  1008. mutex_lock(&priv->obj_lock);
  1009. list_add_tail(&msm_obj->node, &priv->objects);
  1010. mutex_unlock(&priv->obj_lock);
  1011. ret = drm_gem_create_mmap_offset(obj);
  1012. if (ret)
  1013. goto fail;
  1014. return obj;
  1015. fail:
  1016. drm_gem_object_put(obj);
  1017. return ERR_PTR(ret);
  1018. }
  1019. struct drm_gem_object *msm_gem_import(struct drm_device *dev,
  1020. struct dma_buf *dmabuf, struct sg_table *sgt)
  1021. {
  1022. struct msm_drm_private *priv = dev->dev_private;
  1023. struct msm_gem_object *msm_obj;
  1024. struct drm_gem_object *obj;
  1025. uint32_t size;
  1026. int ret, npages;
  1027. /* if we don't have IOMMU, don't bother pretending we can import: */
  1028. if (!msm_use_mmu(dev)) {
  1029. DRM_DEV_ERROR(dev->dev, "cannot import without IOMMU\n");
  1030. return ERR_PTR(-EINVAL);
  1031. }
  1032. size = PAGE_ALIGN(dmabuf->size);
  1033. ret = msm_gem_new_impl(dev, size, MSM_BO_WC, &obj);
  1034. if (ret)
  1035. return ERR_PTR(ret);
  1036. drm_gem_private_object_init(dev, obj, size);
  1037. npages = size / PAGE_SIZE;
  1038. msm_obj = to_msm_bo(obj);
  1039. msm_gem_lock(obj);
  1040. msm_obj->sgt = sgt;
  1041. msm_obj->pages = kvmalloc_array(npages, sizeof(struct page *), GFP_KERNEL);
  1042. if (!msm_obj->pages) {
  1043. msm_gem_unlock(obj);
  1044. ret = -ENOMEM;
  1045. goto fail;
  1046. }
  1047. ret = drm_prime_sg_to_page_array(sgt, msm_obj->pages, npages);
  1048. if (ret) {
  1049. msm_gem_unlock(obj);
  1050. goto fail;
  1051. }
  1052. msm_gem_unlock(obj);
  1053. drm_gem_lru_move_tail(&priv->lru.pinned, obj);
  1054. mutex_lock(&priv->obj_lock);
  1055. list_add_tail(&msm_obj->node, &priv->objects);
  1056. mutex_unlock(&priv->obj_lock);
  1057. ret = drm_gem_create_mmap_offset(obj);
  1058. if (ret)
  1059. goto fail;
  1060. return obj;
  1061. fail:
  1062. drm_gem_object_put(obj);
  1063. return ERR_PTR(ret);
  1064. }
  1065. void *msm_gem_kernel_new(struct drm_device *dev, uint32_t size,
  1066. uint32_t flags, struct msm_gem_address_space *aspace,
  1067. struct drm_gem_object **bo, uint64_t *iova)
  1068. {
  1069. void *vaddr;
  1070. struct drm_gem_object *obj = msm_gem_new(dev, size, flags);
  1071. int ret;
  1072. if (IS_ERR(obj))
  1073. return ERR_CAST(obj);
  1074. if (iova) {
  1075. ret = msm_gem_get_and_pin_iova(obj, aspace, iova);
  1076. if (ret)
  1077. goto err;
  1078. }
  1079. vaddr = msm_gem_get_vaddr(obj);
  1080. if (IS_ERR(vaddr)) {
  1081. msm_gem_unpin_iova(obj, aspace);
  1082. ret = PTR_ERR(vaddr);
  1083. goto err;
  1084. }
  1085. if (bo)
  1086. *bo = obj;
  1087. return vaddr;
  1088. err:
  1089. drm_gem_object_put(obj);
  1090. return ERR_PTR(ret);
  1091. }
  1092. void msm_gem_kernel_put(struct drm_gem_object *bo,
  1093. struct msm_gem_address_space *aspace)
  1094. {
  1095. if (IS_ERR_OR_NULL(bo))
  1096. return;
  1097. msm_gem_put_vaddr(bo);
  1098. msm_gem_unpin_iova(bo, aspace);
  1099. drm_gem_object_put(bo);
  1100. }
  1101. void msm_gem_object_set_name(struct drm_gem_object *bo, const char *fmt, ...)
  1102. {
  1103. struct msm_gem_object *msm_obj = to_msm_bo(bo);
  1104. va_list ap;
  1105. if (!fmt)
  1106. return;
  1107. va_start(ap, fmt);
  1108. vsnprintf(msm_obj->name, sizeof(msm_obj->name), fmt, ap);
  1109. va_end(ap);
  1110. }