amdgpu_object.c 35 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394
  1. /*
  2. * Copyright 2009 Jerome Glisse.
  3. * All Rights Reserved.
  4. *
  5. * Permission is hereby granted, free of charge, to any person obtaining a
  6. * copy of this software and associated documentation files (the
  7. * "Software"), to deal in the Software without restriction, including
  8. * without limitation the rights to use, copy, modify, merge, publish,
  9. * distribute, sub license, and/or sell copies of the Software, and to
  10. * permit persons to whom the Software is furnished to do so, subject to
  11. * the following conditions:
  12. *
  13. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  14. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  15. * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
  16. * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
  17. * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  18. * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  19. * USE OR OTHER DEALINGS IN THE SOFTWARE.
  20. *
  21. * The above copyright notice and this permission notice (including the
  22. * next paragraph) shall be included in all copies or substantial portions
  23. * of the Software.
  24. *
  25. */
  26. /*
  27. * Authors:
  28. * Jerome Glisse <glisse@freedesktop.org>
  29. * Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
  30. * Dave Airlie
  31. */
  32. #include <linux/list.h>
  33. #include <linux/slab.h>
  34. #include <drm/drmP.h>
  35. #include <drm/amdgpu_drm.h>
  36. #include <drm/drm_cache.h>
  37. #include "amdgpu.h"
  38. #include "amdgpu_trace.h"
  39. #include "amdgpu_amdkfd.h"
  40. /**
  41. * DOC: amdgpu_object
  42. *
  43. * This defines the interfaces to operate on an &amdgpu_bo buffer object which
  44. * represents memory used by driver (VRAM, system memory, etc.). The driver
  45. * provides DRM/GEM APIs to userspace. DRM/GEM APIs then use these interfaces
  46. * to create/destroy/set buffer object which are then managed by the kernel TTM
  47. * memory manager.
  48. * The interfaces are also used internally by kernel clients, including gfx,
  49. * uvd, etc. for kernel managed allocations used by the GPU.
  50. *
  51. */
  52. static bool amdgpu_bo_need_backup(struct amdgpu_device *adev)
  53. {
  54. if (adev->flags & AMD_IS_APU)
  55. return false;
  56. if (amdgpu_gpu_recovery == 0 ||
  57. (amdgpu_gpu_recovery == -1 && !amdgpu_sriov_vf(adev)))
  58. return false;
  59. return true;
  60. }
  61. /**
  62. * amdgpu_bo_subtract_pin_size - Remove BO from pin_size accounting
  63. *
  64. * @bo: &amdgpu_bo buffer object
  65. *
  66. * This function is called when a BO stops being pinned, and updates the
  67. * &amdgpu_device pin_size values accordingly.
  68. */
  69. static void amdgpu_bo_subtract_pin_size(struct amdgpu_bo *bo)
  70. {
  71. struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
  72. if (bo->tbo.mem.mem_type == TTM_PL_VRAM) {
  73. atomic64_sub(amdgpu_bo_size(bo), &adev->vram_pin_size);
  74. atomic64_sub(amdgpu_vram_mgr_bo_visible_size(bo),
  75. &adev->visible_pin_size);
  76. } else if (bo->tbo.mem.mem_type == TTM_PL_TT) {
  77. atomic64_sub(amdgpu_bo_size(bo), &adev->gart_pin_size);
  78. }
  79. }
  80. static void amdgpu_bo_destroy(struct ttm_buffer_object *tbo)
  81. {
  82. struct amdgpu_device *adev = amdgpu_ttm_adev(tbo->bdev);
  83. struct amdgpu_bo *bo = ttm_to_amdgpu_bo(tbo);
  84. if (bo->pin_count > 0)
  85. amdgpu_bo_subtract_pin_size(bo);
  86. if (bo->kfd_bo)
  87. amdgpu_amdkfd_unreserve_system_memory_limit(bo);
  88. amdgpu_bo_kunmap(bo);
  89. if (bo->gem_base.import_attach)
  90. drm_prime_gem_destroy(&bo->gem_base, bo->tbo.sg);
  91. drm_gem_object_release(&bo->gem_base);
  92. amdgpu_bo_unref(&bo->parent);
  93. if (!list_empty(&bo->shadow_list)) {
  94. mutex_lock(&adev->shadow_list_lock);
  95. list_del_init(&bo->shadow_list);
  96. mutex_unlock(&adev->shadow_list_lock);
  97. }
  98. kfree(bo->metadata);
  99. kfree(bo);
  100. }
  101. /**
  102. * amdgpu_bo_is_amdgpu_bo - check if the buffer object is an &amdgpu_bo
  103. * @bo: buffer object to be checked
  104. *
  105. * Uses destroy function associated with the object to determine if this is
  106. * an &amdgpu_bo.
  107. *
  108. * Returns:
  109. * true if the object belongs to &amdgpu_bo, false if not.
  110. */
  111. bool amdgpu_bo_is_amdgpu_bo(struct ttm_buffer_object *bo)
  112. {
  113. if (bo->destroy == &amdgpu_bo_destroy)
  114. return true;
  115. return false;
  116. }
  117. /**
  118. * amdgpu_bo_placement_from_domain - set buffer's placement
  119. * @abo: &amdgpu_bo buffer object whose placement is to be set
  120. * @domain: requested domain
  121. *
  122. * Sets buffer's placement according to requested domain and the buffer's
  123. * flags.
  124. */
  125. void amdgpu_bo_placement_from_domain(struct amdgpu_bo *abo, u32 domain)
  126. {
  127. struct amdgpu_device *adev = amdgpu_ttm_adev(abo->tbo.bdev);
  128. struct ttm_placement *placement = &abo->placement;
  129. struct ttm_place *places = abo->placements;
  130. u64 flags = abo->flags;
  131. u32 c = 0;
  132. if (domain & AMDGPU_GEM_DOMAIN_VRAM) {
  133. unsigned visible_pfn = adev->gmc.visible_vram_size >> PAGE_SHIFT;
  134. places[c].fpfn = 0;
  135. places[c].lpfn = 0;
  136. places[c].flags = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |
  137. TTM_PL_FLAG_VRAM;
  138. if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED)
  139. places[c].lpfn = visible_pfn;
  140. else
  141. places[c].flags |= TTM_PL_FLAG_TOPDOWN;
  142. if (flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS)
  143. places[c].flags |= TTM_PL_FLAG_CONTIGUOUS;
  144. c++;
  145. }
  146. if (domain & AMDGPU_GEM_DOMAIN_GTT) {
  147. places[c].fpfn = 0;
  148. places[c].lpfn = 0;
  149. places[c].flags = TTM_PL_FLAG_TT;
  150. if (flags & AMDGPU_GEM_CREATE_CPU_GTT_USWC)
  151. places[c].flags |= TTM_PL_FLAG_WC |
  152. TTM_PL_FLAG_UNCACHED;
  153. else
  154. places[c].flags |= TTM_PL_FLAG_CACHED;
  155. c++;
  156. }
  157. if (domain & AMDGPU_GEM_DOMAIN_CPU) {
  158. places[c].fpfn = 0;
  159. places[c].lpfn = 0;
  160. places[c].flags = TTM_PL_FLAG_SYSTEM;
  161. if (flags & AMDGPU_GEM_CREATE_CPU_GTT_USWC)
  162. places[c].flags |= TTM_PL_FLAG_WC |
  163. TTM_PL_FLAG_UNCACHED;
  164. else
  165. places[c].flags |= TTM_PL_FLAG_CACHED;
  166. c++;
  167. }
  168. if (domain & AMDGPU_GEM_DOMAIN_GDS) {
  169. places[c].fpfn = 0;
  170. places[c].lpfn = 0;
  171. places[c].flags = TTM_PL_FLAG_UNCACHED | AMDGPU_PL_FLAG_GDS;
  172. c++;
  173. }
  174. if (domain & AMDGPU_GEM_DOMAIN_GWS) {
  175. places[c].fpfn = 0;
  176. places[c].lpfn = 0;
  177. places[c].flags = TTM_PL_FLAG_UNCACHED | AMDGPU_PL_FLAG_GWS;
  178. c++;
  179. }
  180. if (domain & AMDGPU_GEM_DOMAIN_OA) {
  181. places[c].fpfn = 0;
  182. places[c].lpfn = 0;
  183. places[c].flags = TTM_PL_FLAG_UNCACHED | AMDGPU_PL_FLAG_OA;
  184. c++;
  185. }
  186. if (!c) {
  187. places[c].fpfn = 0;
  188. places[c].lpfn = 0;
  189. places[c].flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
  190. c++;
  191. }
  192. BUG_ON(c >= AMDGPU_BO_MAX_PLACEMENTS);
  193. placement->num_placement = c;
  194. placement->placement = places;
  195. placement->num_busy_placement = c;
  196. placement->busy_placement = places;
  197. }
  198. /**
  199. * amdgpu_bo_create_reserved - create reserved BO for kernel use
  200. *
  201. * @adev: amdgpu device object
  202. * @size: size for the new BO
  203. * @align: alignment for the new BO
  204. * @domain: where to place it
  205. * @bo_ptr: used to initialize BOs in structures
  206. * @gpu_addr: GPU addr of the pinned BO
  207. * @cpu_addr: optional CPU address mapping
  208. *
  209. * Allocates and pins a BO for kernel internal use, and returns it still
  210. * reserved.
  211. *
  212. * Note: For bo_ptr new BO is only created if bo_ptr points to NULL.
  213. *
  214. * Returns:
  215. * 0 on success, negative error code otherwise.
  216. */
  217. int amdgpu_bo_create_reserved(struct amdgpu_device *adev,
  218. unsigned long size, int align,
  219. u32 domain, struct amdgpu_bo **bo_ptr,
  220. u64 *gpu_addr, void **cpu_addr)
  221. {
  222. struct amdgpu_bo_param bp;
  223. bool free = false;
  224. int r;
  225. if (!size) {
  226. amdgpu_bo_unref(bo_ptr);
  227. return 0;
  228. }
  229. memset(&bp, 0, sizeof(bp));
  230. bp.size = size;
  231. bp.byte_align = align;
  232. bp.domain = domain;
  233. bp.flags = AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED |
  234. AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS;
  235. bp.type = ttm_bo_type_kernel;
  236. bp.resv = NULL;
  237. if (!*bo_ptr) {
  238. r = amdgpu_bo_create(adev, &bp, bo_ptr);
  239. if (r) {
  240. dev_err(adev->dev, "(%d) failed to allocate kernel bo\n",
  241. r);
  242. return r;
  243. }
  244. free = true;
  245. }
  246. r = amdgpu_bo_reserve(*bo_ptr, false);
  247. if (r) {
  248. dev_err(adev->dev, "(%d) failed to reserve kernel bo\n", r);
  249. goto error_free;
  250. }
  251. r = amdgpu_bo_pin(*bo_ptr, domain);
  252. if (r) {
  253. dev_err(adev->dev, "(%d) kernel bo pin failed\n", r);
  254. goto error_unreserve;
  255. }
  256. r = amdgpu_ttm_alloc_gart(&(*bo_ptr)->tbo);
  257. if (r) {
  258. dev_err(adev->dev, "%p bind failed\n", *bo_ptr);
  259. goto error_unpin;
  260. }
  261. if (gpu_addr)
  262. *gpu_addr = amdgpu_bo_gpu_offset(*bo_ptr);
  263. if (cpu_addr) {
  264. r = amdgpu_bo_kmap(*bo_ptr, cpu_addr);
  265. if (r) {
  266. dev_err(adev->dev, "(%d) kernel bo map failed\n", r);
  267. goto error_unpin;
  268. }
  269. }
  270. return 0;
  271. error_unpin:
  272. amdgpu_bo_unpin(*bo_ptr);
  273. error_unreserve:
  274. amdgpu_bo_unreserve(*bo_ptr);
  275. error_free:
  276. if (free)
  277. amdgpu_bo_unref(bo_ptr);
  278. return r;
  279. }
  280. /**
  281. * amdgpu_bo_create_kernel - create BO for kernel use
  282. *
  283. * @adev: amdgpu device object
  284. * @size: size for the new BO
  285. * @align: alignment for the new BO
  286. * @domain: where to place it
  287. * @bo_ptr: used to initialize BOs in structures
  288. * @gpu_addr: GPU addr of the pinned BO
  289. * @cpu_addr: optional CPU address mapping
  290. *
  291. * Allocates and pins a BO for kernel internal use.
  292. *
  293. * Note: For bo_ptr new BO is only created if bo_ptr points to NULL.
  294. *
  295. * Returns:
  296. * 0 on success, negative error code otherwise.
  297. */
  298. int amdgpu_bo_create_kernel(struct amdgpu_device *adev,
  299. unsigned long size, int align,
  300. u32 domain, struct amdgpu_bo **bo_ptr,
  301. u64 *gpu_addr, void **cpu_addr)
  302. {
  303. int r;
  304. r = amdgpu_bo_create_reserved(adev, size, align, domain, bo_ptr,
  305. gpu_addr, cpu_addr);
  306. if (r)
  307. return r;
  308. if (*bo_ptr)
  309. amdgpu_bo_unreserve(*bo_ptr);
  310. return 0;
  311. }
  312. /**
  313. * amdgpu_bo_free_kernel - free BO for kernel use
  314. *
  315. * @bo: amdgpu BO to free
  316. * @gpu_addr: pointer to where the BO's GPU memory space address was stored
  317. * @cpu_addr: pointer to where the BO's CPU memory space address was stored
  318. *
  319. * unmaps and unpin a BO for kernel internal use.
  320. */
  321. void amdgpu_bo_free_kernel(struct amdgpu_bo **bo, u64 *gpu_addr,
  322. void **cpu_addr)
  323. {
  324. if (*bo == NULL)
  325. return;
  326. if (likely(amdgpu_bo_reserve(*bo, true) == 0)) {
  327. if (cpu_addr)
  328. amdgpu_bo_kunmap(*bo);
  329. amdgpu_bo_unpin(*bo);
  330. amdgpu_bo_unreserve(*bo);
  331. }
  332. amdgpu_bo_unref(bo);
  333. if (gpu_addr)
  334. *gpu_addr = 0;
  335. if (cpu_addr)
  336. *cpu_addr = NULL;
  337. }
  338. /* Validate bo size is bit bigger then the request domain */
  339. static bool amdgpu_bo_validate_size(struct amdgpu_device *adev,
  340. unsigned long size, u32 domain)
  341. {
  342. struct ttm_mem_type_manager *man = NULL;
  343. /*
  344. * If GTT is part of requested domains the check must succeed to
  345. * allow fall back to GTT
  346. */
  347. if (domain & AMDGPU_GEM_DOMAIN_GTT) {
  348. man = &adev->mman.bdev.man[TTM_PL_TT];
  349. if (size < (man->size << PAGE_SHIFT))
  350. return true;
  351. else
  352. goto fail;
  353. }
  354. if (domain & AMDGPU_GEM_DOMAIN_VRAM) {
  355. man = &adev->mman.bdev.man[TTM_PL_VRAM];
  356. if (size < (man->size << PAGE_SHIFT))
  357. return true;
  358. else
  359. goto fail;
  360. }
  361. /* TODO add more domains checks, such as AMDGPU_GEM_DOMAIN_CPU */
  362. return true;
  363. fail:
  364. DRM_DEBUG("BO size %lu > total memory in domain: %llu\n", size,
  365. man->size << PAGE_SHIFT);
  366. return false;
  367. }
  368. static int amdgpu_bo_do_create(struct amdgpu_device *adev,
  369. struct amdgpu_bo_param *bp,
  370. struct amdgpu_bo **bo_ptr)
  371. {
  372. struct ttm_operation_ctx ctx = {
  373. .interruptible = (bp->type != ttm_bo_type_kernel),
  374. .no_wait_gpu = false,
  375. .resv = bp->resv,
  376. .flags = TTM_OPT_FLAG_ALLOW_RES_EVICT
  377. };
  378. struct amdgpu_bo *bo;
  379. unsigned long page_align, size = bp->size;
  380. size_t acc_size;
  381. int r;
  382. page_align = roundup(bp->byte_align, PAGE_SIZE) >> PAGE_SHIFT;
  383. size = ALIGN(size, PAGE_SIZE);
  384. if (!amdgpu_bo_validate_size(adev, size, bp->domain))
  385. return -ENOMEM;
  386. *bo_ptr = NULL;
  387. acc_size = ttm_bo_dma_acc_size(&adev->mman.bdev, size,
  388. sizeof(struct amdgpu_bo));
  389. bo = kzalloc(sizeof(struct amdgpu_bo), GFP_KERNEL);
  390. if (bo == NULL)
  391. return -ENOMEM;
  392. drm_gem_private_object_init(adev->ddev, &bo->gem_base, size);
  393. INIT_LIST_HEAD(&bo->shadow_list);
  394. bo->vm_bo = NULL;
  395. bo->preferred_domains = bp->preferred_domain ? bp->preferred_domain :
  396. bp->domain;
  397. bo->allowed_domains = bo->preferred_domains;
  398. if (bp->type != ttm_bo_type_kernel &&
  399. bo->allowed_domains == AMDGPU_GEM_DOMAIN_VRAM)
  400. bo->allowed_domains |= AMDGPU_GEM_DOMAIN_GTT;
  401. bo->flags = bp->flags;
  402. #ifdef CONFIG_X86_32
  403. /* XXX: Write-combined CPU mappings of GTT seem broken on 32-bit
  404. * See https://bugs.freedesktop.org/show_bug.cgi?id=84627
  405. */
  406. bo->flags &= ~AMDGPU_GEM_CREATE_CPU_GTT_USWC;
  407. #elif defined(CONFIG_X86) && !defined(CONFIG_X86_PAT)
  408. /* Don't try to enable write-combining when it can't work, or things
  409. * may be slow
  410. * See https://bugs.freedesktop.org/show_bug.cgi?id=88758
  411. */
  412. #ifndef CONFIG_COMPILE_TEST
  413. #warning Please enable CONFIG_MTRR and CONFIG_X86_PAT for better performance \
  414. thanks to write-combining
  415. #endif
  416. if (bo->flags & AMDGPU_GEM_CREATE_CPU_GTT_USWC)
  417. DRM_INFO_ONCE("Please enable CONFIG_MTRR and CONFIG_X86_PAT for "
  418. "better performance thanks to write-combining\n");
  419. bo->flags &= ~AMDGPU_GEM_CREATE_CPU_GTT_USWC;
  420. #else
  421. /* For architectures that don't support WC memory,
  422. * mask out the WC flag from the BO
  423. */
  424. if (!drm_arch_can_wc_memory())
  425. bo->flags &= ~AMDGPU_GEM_CREATE_CPU_GTT_USWC;
  426. #endif
  427. bo->tbo.bdev = &adev->mman.bdev;
  428. amdgpu_bo_placement_from_domain(bo, bp->domain);
  429. if (bp->type == ttm_bo_type_kernel)
  430. bo->tbo.priority = 1;
  431. r = ttm_bo_init_reserved(&adev->mman.bdev, &bo->tbo, size, bp->type,
  432. &bo->placement, page_align, &ctx, acc_size,
  433. NULL, bp->resv, &amdgpu_bo_destroy);
  434. if (unlikely(r != 0))
  435. return r;
  436. if (!amdgpu_gmc_vram_full_visible(&adev->gmc) &&
  437. bo->tbo.mem.mem_type == TTM_PL_VRAM &&
  438. bo->tbo.mem.start < adev->gmc.visible_vram_size >> PAGE_SHIFT)
  439. amdgpu_cs_report_moved_bytes(adev, ctx.bytes_moved,
  440. ctx.bytes_moved);
  441. else
  442. amdgpu_cs_report_moved_bytes(adev, ctx.bytes_moved, 0);
  443. if (bp->flags & AMDGPU_GEM_CREATE_VRAM_CLEARED &&
  444. bo->tbo.mem.placement & TTM_PL_FLAG_VRAM) {
  445. struct dma_fence *fence;
  446. r = amdgpu_fill_buffer(bo, 0, bo->tbo.resv, &fence);
  447. if (unlikely(r))
  448. goto fail_unreserve;
  449. amdgpu_bo_fence(bo, fence, false);
  450. dma_fence_put(bo->tbo.moving);
  451. bo->tbo.moving = dma_fence_get(fence);
  452. dma_fence_put(fence);
  453. }
  454. if (!bp->resv)
  455. amdgpu_bo_unreserve(bo);
  456. *bo_ptr = bo;
  457. trace_amdgpu_bo_create(bo);
  458. /* Treat CPU_ACCESS_REQUIRED only as a hint if given by UMD */
  459. if (bp->type == ttm_bo_type_device)
  460. bo->flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
  461. return 0;
  462. fail_unreserve:
  463. if (!bp->resv)
  464. ww_mutex_unlock(&bo->tbo.resv->lock);
  465. amdgpu_bo_unref(&bo);
  466. return r;
  467. }
  468. static int amdgpu_bo_create_shadow(struct amdgpu_device *adev,
  469. unsigned long size, int byte_align,
  470. struct amdgpu_bo *bo)
  471. {
  472. struct amdgpu_bo_param bp;
  473. int r;
  474. if (bo->shadow)
  475. return 0;
  476. memset(&bp, 0, sizeof(bp));
  477. bp.size = size;
  478. bp.byte_align = byte_align;
  479. bp.domain = AMDGPU_GEM_DOMAIN_GTT;
  480. bp.flags = AMDGPU_GEM_CREATE_CPU_GTT_USWC |
  481. AMDGPU_GEM_CREATE_SHADOW;
  482. bp.type = ttm_bo_type_kernel;
  483. bp.resv = bo->tbo.resv;
  484. r = amdgpu_bo_do_create(adev, &bp, &bo->shadow);
  485. if (!r) {
  486. bo->shadow->parent = amdgpu_bo_ref(bo);
  487. mutex_lock(&adev->shadow_list_lock);
  488. list_add_tail(&bo->shadow_list, &adev->shadow_list);
  489. mutex_unlock(&adev->shadow_list_lock);
  490. }
  491. return r;
  492. }
  493. /**
  494. * amdgpu_bo_create - create an &amdgpu_bo buffer object
  495. * @adev: amdgpu device object
  496. * @bp: parameters to be used for the buffer object
  497. * @bo_ptr: pointer to the buffer object pointer
  498. *
  499. * Creates an &amdgpu_bo buffer object; and if requested, also creates a
  500. * shadow object.
  501. * Shadow object is used to backup the original buffer object, and is always
  502. * in GTT.
  503. *
  504. * Returns:
  505. * 0 for success or a negative error code on failure.
  506. */
  507. int amdgpu_bo_create(struct amdgpu_device *adev,
  508. struct amdgpu_bo_param *bp,
  509. struct amdgpu_bo **bo_ptr)
  510. {
  511. u64 flags = bp->flags;
  512. int r;
  513. bp->flags = bp->flags & ~AMDGPU_GEM_CREATE_SHADOW;
  514. r = amdgpu_bo_do_create(adev, bp, bo_ptr);
  515. if (r)
  516. return r;
  517. if ((flags & AMDGPU_GEM_CREATE_SHADOW) && amdgpu_bo_need_backup(adev)) {
  518. if (!bp->resv)
  519. WARN_ON(reservation_object_lock((*bo_ptr)->tbo.resv,
  520. NULL));
  521. r = amdgpu_bo_create_shadow(adev, bp->size, bp->byte_align, (*bo_ptr));
  522. if (!bp->resv)
  523. reservation_object_unlock((*bo_ptr)->tbo.resv);
  524. if (r)
  525. amdgpu_bo_unref(bo_ptr);
  526. }
  527. return r;
  528. }
  529. /**
  530. * amdgpu_bo_backup_to_shadow - Backs up an &amdgpu_bo buffer object
  531. * @adev: amdgpu device object
  532. * @ring: amdgpu_ring for the engine handling the buffer operations
  533. * @bo: &amdgpu_bo buffer to be backed up
  534. * @resv: reservation object with embedded fence
  535. * @fence: dma_fence associated with the operation
  536. * @direct: whether to submit the job directly
  537. *
  538. * Copies an &amdgpu_bo buffer object to its shadow object.
  539. * Not used for now.
  540. *
  541. * Returns:
  542. * 0 for success or a negative error code on failure.
  543. */
  544. int amdgpu_bo_backup_to_shadow(struct amdgpu_device *adev,
  545. struct amdgpu_ring *ring,
  546. struct amdgpu_bo *bo,
  547. struct reservation_object *resv,
  548. struct dma_fence **fence,
  549. bool direct)
  550. {
  551. struct amdgpu_bo *shadow = bo->shadow;
  552. uint64_t bo_addr, shadow_addr;
  553. int r;
  554. if (!shadow)
  555. return -EINVAL;
  556. bo_addr = amdgpu_bo_gpu_offset(bo);
  557. shadow_addr = amdgpu_bo_gpu_offset(bo->shadow);
  558. r = reservation_object_reserve_shared(bo->tbo.resv);
  559. if (r)
  560. goto err;
  561. r = amdgpu_copy_buffer(ring, bo_addr, shadow_addr,
  562. amdgpu_bo_size(bo), resv, fence,
  563. direct, false);
  564. if (!r)
  565. amdgpu_bo_fence(bo, *fence, true);
  566. err:
  567. return r;
  568. }
  569. /**
  570. * amdgpu_bo_validate - validate an &amdgpu_bo buffer object
  571. * @bo: pointer to the buffer object
  572. *
  573. * Sets placement according to domain; and changes placement and caching
  574. * policy of the buffer object according to the placement.
  575. * This is used for validating shadow bos. It calls ttm_bo_validate() to
  576. * make sure the buffer is resident where it needs to be.
  577. *
  578. * Returns:
  579. * 0 for success or a negative error code on failure.
  580. */
  581. int amdgpu_bo_validate(struct amdgpu_bo *bo)
  582. {
  583. struct ttm_operation_ctx ctx = { false, false };
  584. uint32_t domain;
  585. int r;
  586. if (bo->pin_count)
  587. return 0;
  588. domain = bo->preferred_domains;
  589. retry:
  590. amdgpu_bo_placement_from_domain(bo, domain);
  591. r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
  592. if (unlikely(r == -ENOMEM) && domain != bo->allowed_domains) {
  593. domain = bo->allowed_domains;
  594. goto retry;
  595. }
  596. return r;
  597. }
  598. /**
  599. * amdgpu_bo_restore_from_shadow - restore an &amdgpu_bo buffer object
  600. * @adev: amdgpu device object
  601. * @ring: amdgpu_ring for the engine handling the buffer operations
  602. * @bo: &amdgpu_bo buffer to be restored
  603. * @resv: reservation object with embedded fence
  604. * @fence: dma_fence associated with the operation
  605. * @direct: whether to submit the job directly
  606. *
  607. * Copies a buffer object's shadow content back to the object.
  608. * This is used for recovering a buffer from its shadow in case of a gpu
  609. * reset where vram context may be lost.
  610. *
  611. * Returns:
  612. * 0 for success or a negative error code on failure.
  613. */
  614. int amdgpu_bo_restore_from_shadow(struct amdgpu_device *adev,
  615. struct amdgpu_ring *ring,
  616. struct amdgpu_bo *bo,
  617. struct reservation_object *resv,
  618. struct dma_fence **fence,
  619. bool direct)
  620. {
  621. struct amdgpu_bo *shadow = bo->shadow;
  622. uint64_t bo_addr, shadow_addr;
  623. int r;
  624. if (!shadow)
  625. return -EINVAL;
  626. bo_addr = amdgpu_bo_gpu_offset(bo);
  627. shadow_addr = amdgpu_bo_gpu_offset(bo->shadow);
  628. r = reservation_object_reserve_shared(bo->tbo.resv);
  629. if (r)
  630. goto err;
  631. r = amdgpu_copy_buffer(ring, shadow_addr, bo_addr,
  632. amdgpu_bo_size(bo), resv, fence,
  633. direct, false);
  634. if (!r)
  635. amdgpu_bo_fence(bo, *fence, true);
  636. err:
  637. return r;
  638. }
  639. /**
  640. * amdgpu_bo_kmap - map an &amdgpu_bo buffer object
  641. * @bo: &amdgpu_bo buffer object to be mapped
  642. * @ptr: kernel virtual address to be returned
  643. *
  644. * Calls ttm_bo_kmap() to set up the kernel virtual mapping; calls
  645. * amdgpu_bo_kptr() to get the kernel virtual address.
  646. *
  647. * Returns:
  648. * 0 for success or a negative error code on failure.
  649. */
  650. int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr)
  651. {
  652. void *kptr;
  653. long r;
  654. if (bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS)
  655. return -EPERM;
  656. kptr = amdgpu_bo_kptr(bo);
  657. if (kptr) {
  658. if (ptr)
  659. *ptr = kptr;
  660. return 0;
  661. }
  662. r = reservation_object_wait_timeout_rcu(bo->tbo.resv, false, false,
  663. MAX_SCHEDULE_TIMEOUT);
  664. if (r < 0)
  665. return r;
  666. r = ttm_bo_kmap(&bo->tbo, 0, bo->tbo.num_pages, &bo->kmap);
  667. if (r)
  668. return r;
  669. if (ptr)
  670. *ptr = amdgpu_bo_kptr(bo);
  671. return 0;
  672. }
  673. /**
  674. * amdgpu_bo_kptr - returns a kernel virtual address of the buffer object
  675. * @bo: &amdgpu_bo buffer object
  676. *
  677. * Calls ttm_kmap_obj_virtual() to get the kernel virtual address
  678. *
  679. * Returns:
  680. * the virtual address of a buffer object area.
  681. */
  682. void *amdgpu_bo_kptr(struct amdgpu_bo *bo)
  683. {
  684. bool is_iomem;
  685. return ttm_kmap_obj_virtual(&bo->kmap, &is_iomem);
  686. }
  687. /**
  688. * amdgpu_bo_kunmap - unmap an &amdgpu_bo buffer object
  689. * @bo: &amdgpu_bo buffer object to be unmapped
  690. *
  691. * Unmaps a kernel map set up by amdgpu_bo_kmap().
  692. */
  693. void amdgpu_bo_kunmap(struct amdgpu_bo *bo)
  694. {
  695. if (bo->kmap.bo)
  696. ttm_bo_kunmap(&bo->kmap);
  697. }
  698. /**
  699. * amdgpu_bo_ref - reference an &amdgpu_bo buffer object
  700. * @bo: &amdgpu_bo buffer object
  701. *
  702. * References the contained &ttm_buffer_object.
  703. *
  704. * Returns:
  705. * a refcounted pointer to the &amdgpu_bo buffer object.
  706. */
  707. struct amdgpu_bo *amdgpu_bo_ref(struct amdgpu_bo *bo)
  708. {
  709. if (bo == NULL)
  710. return NULL;
  711. ttm_bo_get(&bo->tbo);
  712. return bo;
  713. }
  714. /**
  715. * amdgpu_bo_unref - unreference an &amdgpu_bo buffer object
  716. * @bo: &amdgpu_bo buffer object
  717. *
  718. * Unreferences the contained &ttm_buffer_object and clear the pointer
  719. */
  720. void amdgpu_bo_unref(struct amdgpu_bo **bo)
  721. {
  722. struct ttm_buffer_object *tbo;
  723. if ((*bo) == NULL)
  724. return;
  725. tbo = &((*bo)->tbo);
  726. ttm_bo_put(tbo);
  727. *bo = NULL;
  728. }
  729. /**
  730. * amdgpu_bo_pin_restricted - pin an &amdgpu_bo buffer object
  731. * @bo: &amdgpu_bo buffer object to be pinned
  732. * @domain: domain to be pinned to
  733. * @min_offset: the start of requested address range
  734. * @max_offset: the end of requested address range
  735. *
  736. * Pins the buffer object according to requested domain and address range. If
  737. * the memory is unbound gart memory, binds the pages into gart table. Adjusts
  738. * pin_count and pin_size accordingly.
  739. *
  740. * Pinning means to lock pages in memory along with keeping them at a fixed
  741. * offset. It is required when a buffer can not be moved, for example, when
  742. * a display buffer is being scanned out.
  743. *
  744. * Compared with amdgpu_bo_pin(), this function gives more flexibility on
  745. * where to pin a buffer if there are specific restrictions on where a buffer
  746. * must be located.
  747. *
  748. * Returns:
  749. * 0 for success or a negative error code on failure.
  750. */
  751. int amdgpu_bo_pin_restricted(struct amdgpu_bo *bo, u32 domain,
  752. u64 min_offset, u64 max_offset)
  753. {
  754. struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
  755. struct ttm_operation_ctx ctx = { false, false };
  756. int r, i;
  757. if (amdgpu_ttm_tt_get_usermm(bo->tbo.ttm))
  758. return -EPERM;
  759. if (WARN_ON_ONCE(min_offset > max_offset))
  760. return -EINVAL;
  761. /* A shared bo cannot be migrated to VRAM */
  762. if (bo->prime_shared_count) {
  763. if (domain & AMDGPU_GEM_DOMAIN_GTT)
  764. domain = AMDGPU_GEM_DOMAIN_GTT;
  765. else
  766. return -EINVAL;
  767. }
  768. /* This assumes only APU display buffers are pinned with (VRAM|GTT).
  769. * See function amdgpu_display_supported_domains()
  770. */
  771. domain = amdgpu_bo_get_preferred_pin_domain(adev, domain);
  772. if (bo->pin_count) {
  773. uint32_t mem_type = bo->tbo.mem.mem_type;
  774. if (!(domain & amdgpu_mem_type_to_domain(mem_type)))
  775. return -EINVAL;
  776. bo->pin_count++;
  777. if (max_offset != 0) {
  778. u64 domain_start = bo->tbo.bdev->man[mem_type].gpu_offset;
  779. WARN_ON_ONCE(max_offset <
  780. (amdgpu_bo_gpu_offset(bo) - domain_start));
  781. }
  782. return 0;
  783. }
  784. bo->flags |= AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS;
  785. /* force to pin into visible video ram */
  786. if (!(bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS))
  787. bo->flags |= AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
  788. amdgpu_bo_placement_from_domain(bo, domain);
  789. for (i = 0; i < bo->placement.num_placement; i++) {
  790. unsigned fpfn, lpfn;
  791. fpfn = min_offset >> PAGE_SHIFT;
  792. lpfn = max_offset >> PAGE_SHIFT;
  793. if (fpfn > bo->placements[i].fpfn)
  794. bo->placements[i].fpfn = fpfn;
  795. if (!bo->placements[i].lpfn ||
  796. (lpfn && lpfn < bo->placements[i].lpfn))
  797. bo->placements[i].lpfn = lpfn;
  798. bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
  799. }
  800. r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
  801. if (unlikely(r)) {
  802. dev_err(adev->dev, "%p pin failed\n", bo);
  803. goto error;
  804. }
  805. bo->pin_count = 1;
  806. domain = amdgpu_mem_type_to_domain(bo->tbo.mem.mem_type);
  807. if (domain == AMDGPU_GEM_DOMAIN_VRAM) {
  808. atomic64_add(amdgpu_bo_size(bo), &adev->vram_pin_size);
  809. atomic64_add(amdgpu_vram_mgr_bo_visible_size(bo),
  810. &adev->visible_pin_size);
  811. } else if (domain == AMDGPU_GEM_DOMAIN_GTT) {
  812. atomic64_add(amdgpu_bo_size(bo), &adev->gart_pin_size);
  813. }
  814. error:
  815. return r;
  816. }
  817. /**
  818. * amdgpu_bo_pin - pin an &amdgpu_bo buffer object
  819. * @bo: &amdgpu_bo buffer object to be pinned
  820. * @domain: domain to be pinned to
  821. *
  822. * A simple wrapper to amdgpu_bo_pin_restricted().
  823. * Provides a simpler API for buffers that do not have any strict restrictions
  824. * on where a buffer must be located.
  825. *
  826. * Returns:
  827. * 0 for success or a negative error code on failure.
  828. */
  829. int amdgpu_bo_pin(struct amdgpu_bo *bo, u32 domain)
  830. {
  831. return amdgpu_bo_pin_restricted(bo, domain, 0, 0);
  832. }
  833. /**
  834. * amdgpu_bo_unpin - unpin an &amdgpu_bo buffer object
  835. * @bo: &amdgpu_bo buffer object to be unpinned
  836. *
  837. * Decreases the pin_count, and clears the flags if pin_count reaches 0.
  838. * Changes placement and pin size accordingly.
  839. *
  840. * Returns:
  841. * 0 for success or a negative error code on failure.
  842. */
  843. int amdgpu_bo_unpin(struct amdgpu_bo *bo)
  844. {
  845. struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
  846. struct ttm_operation_ctx ctx = { false, false };
  847. int r, i;
  848. if (!bo->pin_count) {
  849. dev_warn(adev->dev, "%p unpin not necessary\n", bo);
  850. return 0;
  851. }
  852. bo->pin_count--;
  853. if (bo->pin_count)
  854. return 0;
  855. amdgpu_bo_subtract_pin_size(bo);
  856. for (i = 0; i < bo->placement.num_placement; i++) {
  857. bo->placements[i].lpfn = 0;
  858. bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT;
  859. }
  860. r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
  861. if (unlikely(r))
  862. dev_err(adev->dev, "%p validate failed for unpin\n", bo);
  863. return r;
  864. }
  865. /**
  866. * amdgpu_bo_evict_vram - evict VRAM buffers
  867. * @adev: amdgpu device object
  868. *
  869. * Evicts all VRAM buffers on the lru list of the memory type.
  870. * Mainly used for evicting vram at suspend time.
  871. *
  872. * Returns:
  873. * 0 for success or a negative error code on failure.
  874. */
  875. int amdgpu_bo_evict_vram(struct amdgpu_device *adev)
  876. {
  877. /* late 2.6.33 fix IGP hibernate - we need pm ops to do this correct */
  878. #ifndef CONFIG_HIBERNATION
  879. if (adev->flags & AMD_IS_APU) {
  880. /* Useless to evict on IGP chips */
  881. return 0;
  882. }
  883. #endif
  884. return ttm_bo_evict_mm(&adev->mman.bdev, TTM_PL_VRAM);
  885. }
  886. static const char *amdgpu_vram_names[] = {
  887. "UNKNOWN",
  888. "GDDR1",
  889. "DDR2",
  890. "GDDR3",
  891. "GDDR4",
  892. "GDDR5",
  893. "HBM",
  894. "DDR3",
  895. "DDR4",
  896. };
  897. /**
  898. * amdgpu_bo_init - initialize memory manager
  899. * @adev: amdgpu device object
  900. *
  901. * Calls amdgpu_ttm_init() to initialize amdgpu memory manager.
  902. *
  903. * Returns:
  904. * 0 for success or a negative error code on failure.
  905. */
  906. int amdgpu_bo_init(struct amdgpu_device *adev)
  907. {
  908. /* reserve PAT memory space to WC for VRAM */
  909. arch_io_reserve_memtype_wc(adev->gmc.aper_base,
  910. adev->gmc.aper_size);
  911. /* Add an MTRR for the VRAM */
  912. adev->gmc.vram_mtrr = arch_phys_wc_add(adev->gmc.aper_base,
  913. adev->gmc.aper_size);
  914. DRM_INFO("Detected VRAM RAM=%lluM, BAR=%lluM\n",
  915. adev->gmc.mc_vram_size >> 20,
  916. (unsigned long long)adev->gmc.aper_size >> 20);
  917. DRM_INFO("RAM width %dbits %s\n",
  918. adev->gmc.vram_width, amdgpu_vram_names[adev->gmc.vram_type]);
  919. return amdgpu_ttm_init(adev);
  920. }
  921. /**
  922. * amdgpu_bo_late_init - late init
  923. * @adev: amdgpu device object
  924. *
  925. * Calls amdgpu_ttm_late_init() to free resources used earlier during
  926. * initialization.
  927. *
  928. * Returns:
  929. * 0 for success or a negative error code on failure.
  930. */
  931. int amdgpu_bo_late_init(struct amdgpu_device *adev)
  932. {
  933. amdgpu_ttm_late_init(adev);
  934. return 0;
  935. }
  936. /**
  937. * amdgpu_bo_fini - tear down memory manager
  938. * @adev: amdgpu device object
  939. *
  940. * Reverses amdgpu_bo_init() to tear down memory manager.
  941. */
  942. void amdgpu_bo_fini(struct amdgpu_device *adev)
  943. {
  944. amdgpu_ttm_fini(adev);
  945. arch_phys_wc_del(adev->gmc.vram_mtrr);
  946. arch_io_free_memtype_wc(adev->gmc.aper_base, adev->gmc.aper_size);
  947. }
  948. /**
  949. * amdgpu_bo_fbdev_mmap - mmap fbdev memory
  950. * @bo: &amdgpu_bo buffer object
  951. * @vma: vma as input from the fbdev mmap method
  952. *
  953. * Calls ttm_fbdev_mmap() to mmap fbdev memory if it is backed by a bo.
  954. *
  955. * Returns:
  956. * 0 for success or a negative error code on failure.
  957. */
  958. int amdgpu_bo_fbdev_mmap(struct amdgpu_bo *bo,
  959. struct vm_area_struct *vma)
  960. {
  961. return ttm_fbdev_mmap(vma, &bo->tbo);
  962. }
  963. /**
  964. * amdgpu_bo_set_tiling_flags - set tiling flags
  965. * @bo: &amdgpu_bo buffer object
  966. * @tiling_flags: new flags
  967. *
  968. * Sets buffer object's tiling flags with the new one. Used by GEM ioctl or
  969. * kernel driver to set the tiling flags on a buffer.
  970. *
  971. * Returns:
  972. * 0 for success or a negative error code on failure.
  973. */
  974. int amdgpu_bo_set_tiling_flags(struct amdgpu_bo *bo, u64 tiling_flags)
  975. {
  976. struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
  977. if (adev->family <= AMDGPU_FAMILY_CZ &&
  978. AMDGPU_TILING_GET(tiling_flags, TILE_SPLIT) > 6)
  979. return -EINVAL;
  980. bo->tiling_flags = tiling_flags;
  981. return 0;
  982. }
  983. /**
  984. * amdgpu_bo_get_tiling_flags - get tiling flags
  985. * @bo: &amdgpu_bo buffer object
  986. * @tiling_flags: returned flags
  987. *
  988. * Gets buffer object's tiling flags. Used by GEM ioctl or kernel driver to
  989. * set the tiling flags on a buffer.
  990. */
  991. void amdgpu_bo_get_tiling_flags(struct amdgpu_bo *bo, u64 *tiling_flags)
  992. {
  993. lockdep_assert_held(&bo->tbo.resv->lock.base);
  994. if (tiling_flags)
  995. *tiling_flags = bo->tiling_flags;
  996. }
  997. /**
  998. * amdgpu_bo_set_metadata - set metadata
  999. * @bo: &amdgpu_bo buffer object
  1000. * @metadata: new metadata
  1001. * @metadata_size: size of the new metadata
  1002. * @flags: flags of the new metadata
  1003. *
  1004. * Sets buffer object's metadata, its size and flags.
  1005. * Used via GEM ioctl.
  1006. *
  1007. * Returns:
  1008. * 0 for success or a negative error code on failure.
  1009. */
  1010. int amdgpu_bo_set_metadata (struct amdgpu_bo *bo, void *metadata,
  1011. uint32_t metadata_size, uint64_t flags)
  1012. {
  1013. void *buffer;
  1014. if (!metadata_size) {
  1015. if (bo->metadata_size) {
  1016. kfree(bo->metadata);
  1017. bo->metadata = NULL;
  1018. bo->metadata_size = 0;
  1019. }
  1020. return 0;
  1021. }
  1022. if (metadata == NULL)
  1023. return -EINVAL;
  1024. buffer = kmemdup(metadata, metadata_size, GFP_KERNEL);
  1025. if (buffer == NULL)
  1026. return -ENOMEM;
  1027. kfree(bo->metadata);
  1028. bo->metadata_flags = flags;
  1029. bo->metadata = buffer;
  1030. bo->metadata_size = metadata_size;
  1031. return 0;
  1032. }
  1033. /**
  1034. * amdgpu_bo_get_metadata - get metadata
  1035. * @bo: &amdgpu_bo buffer object
  1036. * @buffer: returned metadata
  1037. * @buffer_size: size of the buffer
  1038. * @metadata_size: size of the returned metadata
  1039. * @flags: flags of the returned metadata
  1040. *
  1041. * Gets buffer object's metadata, its size and flags. buffer_size shall not be
  1042. * less than metadata_size.
  1043. * Used via GEM ioctl.
  1044. *
  1045. * Returns:
  1046. * 0 for success or a negative error code on failure.
  1047. */
  1048. int amdgpu_bo_get_metadata(struct amdgpu_bo *bo, void *buffer,
  1049. size_t buffer_size, uint32_t *metadata_size,
  1050. uint64_t *flags)
  1051. {
  1052. if (!buffer && !metadata_size)
  1053. return -EINVAL;
  1054. if (buffer) {
  1055. if (buffer_size < bo->metadata_size)
  1056. return -EINVAL;
  1057. if (bo->metadata_size)
  1058. memcpy(buffer, bo->metadata, bo->metadata_size);
  1059. }
  1060. if (metadata_size)
  1061. *metadata_size = bo->metadata_size;
  1062. if (flags)
  1063. *flags = bo->metadata_flags;
  1064. return 0;
  1065. }
  1066. /**
  1067. * amdgpu_bo_move_notify - notification about a memory move
  1068. * @bo: pointer to a buffer object
  1069. * @evict: if this move is evicting the buffer from the graphics address space
  1070. * @new_mem: new information of the bufer object
  1071. *
  1072. * Marks the corresponding &amdgpu_bo buffer object as invalid, also performs
  1073. * bookkeeping.
  1074. * TTM driver callback which is called when ttm moves a buffer.
  1075. */
  1076. void amdgpu_bo_move_notify(struct ttm_buffer_object *bo,
  1077. bool evict,
  1078. struct ttm_mem_reg *new_mem)
  1079. {
  1080. struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev);
  1081. struct amdgpu_bo *abo;
  1082. struct ttm_mem_reg *old_mem = &bo->mem;
  1083. if (!amdgpu_bo_is_amdgpu_bo(bo))
  1084. return;
  1085. abo = ttm_to_amdgpu_bo(bo);
  1086. amdgpu_vm_bo_invalidate(adev, abo, evict);
  1087. amdgpu_bo_kunmap(abo);
  1088. /* remember the eviction */
  1089. if (evict)
  1090. atomic64_inc(&adev->num_evictions);
  1091. /* update statistics */
  1092. if (!new_mem)
  1093. return;
  1094. /* move_notify is called before move happens */
  1095. trace_amdgpu_bo_move(abo, new_mem->mem_type, old_mem->mem_type);
  1096. }
  1097. /**
  1098. * amdgpu_bo_fault_reserve_notify - notification about a memory fault
  1099. * @bo: pointer to a buffer object
  1100. *
  1101. * Notifies the driver we are taking a fault on this BO and have reserved it,
  1102. * also performs bookkeeping.
  1103. * TTM driver callback for dealing with vm faults.
  1104. *
  1105. * Returns:
  1106. * 0 for success or a negative error code on failure.
  1107. */
  1108. int amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
  1109. {
  1110. struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev);
  1111. struct ttm_operation_ctx ctx = { false, false };
  1112. struct amdgpu_bo *abo;
  1113. unsigned long offset, size;
  1114. int r;
  1115. if (!amdgpu_bo_is_amdgpu_bo(bo))
  1116. return 0;
  1117. abo = ttm_to_amdgpu_bo(bo);
  1118. /* Remember that this BO was accessed by the CPU */
  1119. abo->flags |= AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
  1120. if (bo->mem.mem_type != TTM_PL_VRAM)
  1121. return 0;
  1122. size = bo->mem.num_pages << PAGE_SHIFT;
  1123. offset = bo->mem.start << PAGE_SHIFT;
  1124. if ((offset + size) <= adev->gmc.visible_vram_size)
  1125. return 0;
  1126. /* Can't move a pinned BO to visible VRAM */
  1127. if (abo->pin_count > 0)
  1128. return -EINVAL;
  1129. /* hurrah the memory is not visible ! */
  1130. atomic64_inc(&adev->num_vram_cpu_page_faults);
  1131. amdgpu_bo_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_VRAM |
  1132. AMDGPU_GEM_DOMAIN_GTT);
  1133. /* Avoid costly evictions; only set GTT as a busy placement */
  1134. abo->placement.num_busy_placement = 1;
  1135. abo->placement.busy_placement = &abo->placements[1];
  1136. r = ttm_bo_validate(bo, &abo->placement, &ctx);
  1137. if (unlikely(r != 0))
  1138. return r;
  1139. offset = bo->mem.start << PAGE_SHIFT;
  1140. /* this should never happen */
  1141. if (bo->mem.mem_type == TTM_PL_VRAM &&
  1142. (offset + size) > adev->gmc.visible_vram_size)
  1143. return -EINVAL;
  1144. return 0;
  1145. }
  1146. /**
  1147. * amdgpu_bo_fence - add fence to buffer object
  1148. *
  1149. * @bo: buffer object in question
  1150. * @fence: fence to add
  1151. * @shared: true if fence should be added shared
  1152. *
  1153. */
  1154. void amdgpu_bo_fence(struct amdgpu_bo *bo, struct dma_fence *fence,
  1155. bool shared)
  1156. {
  1157. struct reservation_object *resv = bo->tbo.resv;
  1158. if (shared)
  1159. reservation_object_add_shared_fence(resv, fence);
  1160. else
  1161. reservation_object_add_excl_fence(resv, fence);
  1162. }
  1163. /**
  1164. * amdgpu_bo_gpu_offset - return GPU offset of bo
  1165. * @bo: amdgpu object for which we query the offset
  1166. *
  1167. * Note: object should either be pinned or reserved when calling this
  1168. * function, it might be useful to add check for this for debugging.
  1169. *
  1170. * Returns:
  1171. * current GPU offset of the object.
  1172. */
  1173. u64 amdgpu_bo_gpu_offset(struct amdgpu_bo *bo)
  1174. {
  1175. WARN_ON_ONCE(bo->tbo.mem.mem_type == TTM_PL_SYSTEM);
  1176. WARN_ON_ONCE(!ww_mutex_is_locked(&bo->tbo.resv->lock) &&
  1177. !bo->pin_count);
  1178. WARN_ON_ONCE(bo->tbo.mem.start == AMDGPU_BO_INVALID_OFFSET);
  1179. WARN_ON_ONCE(bo->tbo.mem.mem_type == TTM_PL_VRAM &&
  1180. !(bo->flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS));
  1181. return amdgpu_gmc_sign_extend(bo->tbo.offset);
  1182. }
  1183. /**
  1184. * amdgpu_bo_get_preferred_pin_domain - get preferred domain for scanout
  1185. * @adev: amdgpu device object
  1186. * @domain: allowed :ref:`memory domains <amdgpu_memory_domains>`
  1187. *
  1188. * Returns:
  1189. * Which of the allowed domains is preferred for pinning the BO for scanout.
  1190. */
  1191. uint32_t amdgpu_bo_get_preferred_pin_domain(struct amdgpu_device *adev,
  1192. uint32_t domain)
  1193. {
  1194. if (domain == (AMDGPU_GEM_DOMAIN_VRAM | AMDGPU_GEM_DOMAIN_GTT)) {
  1195. domain = AMDGPU_GEM_DOMAIN_VRAM;
  1196. if (adev->gmc.real_vram_size <= AMDGPU_SG_THRESHOLD)
  1197. domain = AMDGPU_GEM_DOMAIN_GTT;
  1198. }
  1199. return domain;
  1200. }