drm_gem_vram_helper.c 26 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. #include <linux/export.h>
  3. #include <linux/iosys-map.h>
  4. #include <linux/module.h>
  5. #include <drm/drm_debugfs.h>
  6. #include <drm/drm_device.h>
  7. #include <drm/drm_drv.h>
  8. #include <drm/drm_file.h>
  9. #include <drm/drm_framebuffer.h>
  10. #include <drm/drm_gem_atomic_helper.h>
  11. #include <drm/drm_gem_framebuffer_helper.h>
  12. #include <drm/drm_gem_ttm_helper.h>
  13. #include <drm/drm_gem_vram_helper.h>
  14. #include <drm/drm_managed.h>
  15. #include <drm/drm_mode.h>
  16. #include <drm/drm_plane.h>
  17. #include <drm/drm_prime.h>
  18. #include <drm/drm_print.h>
  19. #include <drm/ttm/ttm_range_manager.h>
  20. #include <drm/ttm/ttm_tt.h>
  21. static const struct drm_gem_object_funcs drm_gem_vram_object_funcs;
  22. /**
  23. * DOC: overview
  24. *
  25. * This library provides &struct drm_gem_vram_object (GEM VRAM), a GEM
  26. * buffer object that is backed by video RAM (VRAM). It can be used for
  27. * framebuffer devices with dedicated memory.
  28. *
  29. * The data structure &struct drm_vram_mm and its helpers implement a memory
  30. * manager for simple framebuffer devices with dedicated video memory. GEM
  31. * VRAM buffer objects are either placed in the video memory or remain evicted
  32. * to system memory.
  33. *
  34. * With the GEM interface userspace applications create, manage and destroy
  35. * graphics buffers, such as an on-screen framebuffer. GEM does not provide
  36. * an implementation of these interfaces. It's up to the DRM driver to
  37. * provide an implementation that suits the hardware. If the hardware device
  38. * contains dedicated video memory, the DRM driver can use the VRAM helper
  39. * library. Each active buffer object is stored in video RAM. Active
  40. * buffer are used for drawing the current frame, typically something like
  41. * the frame's scanout buffer or the cursor image. If there's no more space
  42. * left in VRAM, inactive GEM objects can be moved to system memory.
  43. *
  44. * To initialize the VRAM helper library call drmm_vram_helper_init().
  45. * The function allocates and initializes an instance of &struct drm_vram_mm
  46. * in &struct drm_device.vram_mm . Use &DRM_GEM_VRAM_DRIVER to initialize
  47. * &struct drm_driver and &DRM_VRAM_MM_FILE_OPERATIONS to initialize
  48. * &struct file_operations; as illustrated below.
  49. *
  50. * .. code-block:: c
  51. *
  52. * struct file_operations fops ={
  53. * .owner = THIS_MODULE,
  54. * DRM_VRAM_MM_FILE_OPERATION
  55. * };
  56. * struct drm_driver drv = {
  57. * .driver_feature = DRM_ ... ,
  58. * .fops = &fops,
  59. * DRM_GEM_VRAM_DRIVER
  60. * };
  61. *
  62. * int init_drm_driver()
  63. * {
  64. * struct drm_device *dev;
  65. * uint64_t vram_base;
  66. * unsigned long vram_size;
  67. * int ret;
  68. *
  69. * // setup device, vram base and size
  70. * // ...
  71. *
  72. * ret = drmm_vram_helper_init(dev, vram_base, vram_size);
  73. * if (ret)
  74. * return ret;
  75. * return 0;
  76. * }
  77. *
  78. * This creates an instance of &struct drm_vram_mm, exports DRM userspace
  79. * interfaces for GEM buffer management and initializes file operations to
  80. * allow for accessing created GEM buffers. With this setup, the DRM driver
  81. * manages an area of video RAM with VRAM MM and provides GEM VRAM objects
  82. * to userspace.
  83. *
  84. * You don't have to clean up the instance of VRAM MM.
  85. * drmm_vram_helper_init() is a managed interface that installs a
  86. * clean-up handler to run during the DRM device's release.
  87. *
  88. * A buffer object that is pinned in video RAM has a fixed address within that
  89. * memory region. Call drm_gem_vram_offset() to retrieve this value. Typically
  90. * it's used to program the hardware's scanout engine for framebuffers, set
  91. * the cursor overlay's image for a mouse cursor, or use it as input to the
  92. * hardware's drawing engine.
  93. *
  94. * To access a buffer object's memory from the DRM driver, call
  95. * drm_gem_vram_vmap(). It maps the buffer into kernel address
  96. * space and returns the memory address. Use drm_gem_vram_vunmap() to
  97. * release the mapping.
  98. */
  99. /*
  100. * Buffer-objects helpers
  101. */
  102. static void drm_gem_vram_cleanup(struct drm_gem_vram_object *gbo)
  103. {
  104. /* We got here via ttm_bo_fini(), which means that the
  105. * TTM buffer object in 'bo' has already been cleaned
  106. * up; only release the GEM object.
  107. */
  108. WARN_ON(gbo->vmap_use_count);
  109. WARN_ON(iosys_map_is_set(&gbo->map));
  110. drm_gem_object_release(&gbo->bo.base);
  111. }
  112. static void drm_gem_vram_destroy(struct drm_gem_vram_object *gbo)
  113. {
  114. drm_gem_vram_cleanup(gbo);
  115. kfree(gbo);
  116. }
  117. static void ttm_buffer_object_destroy(struct ttm_buffer_object *bo)
  118. {
  119. struct drm_gem_vram_object *gbo = drm_gem_vram_of_bo(bo);
  120. drm_gem_vram_destroy(gbo);
  121. }
  122. static void drm_gem_vram_placement(struct drm_gem_vram_object *gbo,
  123. unsigned long pl_flag)
  124. {
  125. u32 invariant_flags = 0;
  126. unsigned int i;
  127. unsigned int c = 0;
  128. if (pl_flag & DRM_GEM_VRAM_PL_FLAG_TOPDOWN)
  129. invariant_flags = TTM_PL_FLAG_TOPDOWN;
  130. gbo->placement.placement = gbo->placements;
  131. if (pl_flag & DRM_GEM_VRAM_PL_FLAG_VRAM) {
  132. gbo->placements[c].mem_type = TTM_PL_VRAM;
  133. gbo->placements[c++].flags = invariant_flags;
  134. }
  135. if (pl_flag & DRM_GEM_VRAM_PL_FLAG_SYSTEM || !c) {
  136. gbo->placements[c].mem_type = TTM_PL_SYSTEM;
  137. gbo->placements[c++].flags = invariant_flags;
  138. }
  139. gbo->placement.num_placement = c;
  140. for (i = 0; i < c; ++i) {
  141. gbo->placements[i].fpfn = 0;
  142. gbo->placements[i].lpfn = 0;
  143. }
  144. }
  145. /**
  146. * drm_gem_vram_create() - Creates a VRAM-backed GEM object
  147. * @dev: the DRM device
  148. * @size: the buffer size in bytes
  149. * @pg_align: the buffer's alignment in multiples of the page size
  150. *
  151. * GEM objects are allocated by calling struct drm_driver.gem_create_object,
  152. * if set. Otherwise kzalloc() will be used. Drivers can set their own GEM
  153. * object functions in struct drm_driver.gem_create_object. If no functions
  154. * are set, the new GEM object will use the default functions from GEM VRAM
  155. * helpers.
  156. *
  157. * Returns:
  158. * A new instance of &struct drm_gem_vram_object on success, or
  159. * an ERR_PTR()-encoded error code otherwise.
  160. */
  161. struct drm_gem_vram_object *drm_gem_vram_create(struct drm_device *dev,
  162. size_t size,
  163. unsigned long pg_align)
  164. {
  165. struct drm_gem_vram_object *gbo;
  166. struct drm_gem_object *gem;
  167. struct drm_vram_mm *vmm = dev->vram_mm;
  168. struct ttm_device *bdev;
  169. int ret;
  170. if (WARN_ONCE(!vmm, "VRAM MM not initialized"))
  171. return ERR_PTR(-EINVAL);
  172. if (dev->driver->gem_create_object) {
  173. gem = dev->driver->gem_create_object(dev, size);
  174. if (IS_ERR(gem))
  175. return ERR_CAST(gem);
  176. gbo = drm_gem_vram_of_gem(gem);
  177. } else {
  178. gbo = kzalloc_obj(*gbo);
  179. if (!gbo)
  180. return ERR_PTR(-ENOMEM);
  181. gem = &gbo->bo.base;
  182. }
  183. if (!gem->funcs)
  184. gem->funcs = &drm_gem_vram_object_funcs;
  185. ret = drm_gem_object_init(dev, gem, size);
  186. if (ret) {
  187. kfree(gbo);
  188. return ERR_PTR(ret);
  189. }
  190. bdev = &vmm->bdev;
  191. gbo->bo.bdev = bdev;
  192. drm_gem_vram_placement(gbo, DRM_GEM_VRAM_PL_FLAG_SYSTEM);
  193. /*
  194. * A failing ttm_bo_init will call ttm_buffer_object_destroy
  195. * to release gbo->bo.base and kfree gbo.
  196. */
  197. ret = ttm_bo_init_validate(bdev, &gbo->bo, ttm_bo_type_device,
  198. &gbo->placement, pg_align, false, NULL, NULL,
  199. ttm_buffer_object_destroy);
  200. if (ret)
  201. return ERR_PTR(ret);
  202. return gbo;
  203. }
  204. EXPORT_SYMBOL(drm_gem_vram_create);
  205. /**
  206. * drm_gem_vram_put() - Releases a reference to a VRAM-backed GEM object
  207. * @gbo: the GEM VRAM object
  208. *
  209. * See ttm_bo_fini() for more information.
  210. */
  211. void drm_gem_vram_put(struct drm_gem_vram_object *gbo)
  212. {
  213. ttm_bo_fini(&gbo->bo);
  214. }
  215. EXPORT_SYMBOL(drm_gem_vram_put);
  216. static u64 drm_gem_vram_pg_offset(struct drm_gem_vram_object *gbo)
  217. {
  218. /* Keep TTM behavior for now, remove when drivers are audited */
  219. if (WARN_ON_ONCE(!gbo->bo.resource ||
  220. gbo->bo.resource->mem_type == TTM_PL_SYSTEM))
  221. return 0;
  222. return gbo->bo.resource->start;
  223. }
  224. /**
  225. * drm_gem_vram_offset() - Returns a GEM VRAM object's offset in video memory
  226. * @gbo: the GEM VRAM object
  227. *
  228. * This function returns the buffer object's offset in the device's video
  229. * memory. The buffer object has to be pinned to %TTM_PL_VRAM.
  230. *
  231. * Returns:
  232. * The buffer object's offset in video memory on success, or
  233. * a negative errno code otherwise.
  234. */
  235. s64 drm_gem_vram_offset(struct drm_gem_vram_object *gbo)
  236. {
  237. if (WARN_ON_ONCE(!gbo->bo.pin_count))
  238. return (s64)-ENODEV;
  239. return drm_gem_vram_pg_offset(gbo) << PAGE_SHIFT;
  240. }
  241. EXPORT_SYMBOL(drm_gem_vram_offset);
  242. static int drm_gem_vram_pin_locked(struct drm_gem_vram_object *gbo,
  243. unsigned long pl_flag)
  244. {
  245. struct ttm_operation_ctx ctx = { false, false };
  246. int ret;
  247. dma_resv_assert_held(gbo->bo.base.resv);
  248. if (gbo->bo.pin_count)
  249. goto out;
  250. if (pl_flag)
  251. drm_gem_vram_placement(gbo, pl_flag);
  252. ret = ttm_bo_validate(&gbo->bo, &gbo->placement, &ctx);
  253. if (ret < 0)
  254. return ret;
  255. out:
  256. ttm_bo_pin(&gbo->bo);
  257. return 0;
  258. }
  259. static int drm_gem_vram_pin(struct drm_gem_vram_object *gbo, unsigned long pl_flag)
  260. {
  261. int ret;
  262. ret = ttm_bo_reserve(&gbo->bo, true, false, NULL);
  263. if (ret)
  264. return ret;
  265. ret = drm_gem_vram_pin_locked(gbo, pl_flag);
  266. ttm_bo_unreserve(&gbo->bo);
  267. return ret;
  268. }
  269. static void drm_gem_vram_unpin_locked(struct drm_gem_vram_object *gbo)
  270. {
  271. dma_resv_assert_held(gbo->bo.base.resv);
  272. ttm_bo_unpin(&gbo->bo);
  273. }
  274. static int drm_gem_vram_unpin(struct drm_gem_vram_object *gbo)
  275. {
  276. int ret;
  277. ret = ttm_bo_reserve(&gbo->bo, true, false, NULL);
  278. if (ret)
  279. return ret;
  280. drm_gem_vram_unpin_locked(gbo);
  281. ttm_bo_unreserve(&gbo->bo);
  282. return 0;
  283. }
  284. /**
  285. * drm_gem_vram_vmap() - Pins and maps a GEM VRAM object into kernel address
  286. * space
  287. * @gbo: The GEM VRAM object to map
  288. * @map: Returns the kernel virtual address of the VRAM GEM object's backing
  289. * store.
  290. *
  291. * The vmap function pins a GEM VRAM object to its current location, either
  292. * system or video memory, and maps its buffer into kernel address space.
  293. * As pinned object cannot be relocated, you should avoid pinning objects
  294. * permanently. Call drm_gem_vram_vunmap() with the returned address to
  295. * unmap and unpin the GEM VRAM object.
  296. *
  297. * Returns:
  298. * 0 on success, or a negative error code otherwise.
  299. */
  300. int drm_gem_vram_vmap(struct drm_gem_vram_object *gbo, struct iosys_map *map)
  301. {
  302. int ret;
  303. dma_resv_assert_held(gbo->bo.base.resv);
  304. if (gbo->vmap_use_count > 0)
  305. goto out;
  306. /*
  307. * VRAM helpers unmap the BO only on demand. So the previous
  308. * page mapping might still be around. Only vmap if the there's
  309. * no mapping present.
  310. */
  311. if (iosys_map_is_null(&gbo->map)) {
  312. ret = ttm_bo_vmap(&gbo->bo, &gbo->map);
  313. if (ret)
  314. return ret;
  315. }
  316. out:
  317. ++gbo->vmap_use_count;
  318. *map = gbo->map;
  319. return 0;
  320. }
  321. EXPORT_SYMBOL(drm_gem_vram_vmap);
  322. /**
  323. * drm_gem_vram_vunmap() - Unmaps and unpins a GEM VRAM object
  324. * @gbo: The GEM VRAM object to unmap
  325. * @map: Kernel virtual address where the VRAM GEM object was mapped
  326. *
  327. * A call to drm_gem_vram_vunmap() unmaps and unpins a GEM VRAM buffer. See
  328. * the documentation for drm_gem_vram_vmap() for more information.
  329. */
  330. void drm_gem_vram_vunmap(struct drm_gem_vram_object *gbo,
  331. struct iosys_map *map)
  332. {
  333. struct drm_device *dev = gbo->bo.base.dev;
  334. dma_resv_assert_held(gbo->bo.base.resv);
  335. if (drm_WARN_ON_ONCE(dev, !gbo->vmap_use_count))
  336. return;
  337. if (drm_WARN_ON_ONCE(dev, !iosys_map_is_equal(&gbo->map, map)))
  338. return; /* BUG: map not mapped from this BO */
  339. if (--gbo->vmap_use_count > 0)
  340. return;
  341. /*
  342. * Permanently mapping and unmapping buffers adds overhead from
  343. * updating the page tables and creates debugging output. Therefore,
  344. * we delay the actual unmap operation until the BO gets evicted
  345. * from memory. See drm_gem_vram_bo_driver_move_notify().
  346. */
  347. }
  348. EXPORT_SYMBOL(drm_gem_vram_vunmap);
  349. /**
  350. * drm_gem_vram_fill_create_dumb() - Helper for implementing
  351. * &struct drm_driver.dumb_create
  352. *
  353. * @file: the DRM file
  354. * @dev: the DRM device
  355. * @pg_align: the buffer's alignment in multiples of the page size
  356. * @pitch_align: the scanline's alignment in powers of 2
  357. * @args: the arguments as provided to
  358. * &struct drm_driver.dumb_create
  359. *
  360. * This helper function fills &struct drm_mode_create_dumb, which is used
  361. * by &struct drm_driver.dumb_create. Implementations of this interface
  362. * should forwards their arguments to this helper, plus the driver-specific
  363. * parameters.
  364. *
  365. * Returns:
  366. * 0 on success, or
  367. * a negative error code otherwise.
  368. */
  369. int drm_gem_vram_fill_create_dumb(struct drm_file *file,
  370. struct drm_device *dev,
  371. unsigned long pg_align,
  372. unsigned long pitch_align,
  373. struct drm_mode_create_dumb *args)
  374. {
  375. size_t pitch, size;
  376. struct drm_gem_vram_object *gbo;
  377. int ret;
  378. u32 handle;
  379. pitch = args->width * DIV_ROUND_UP(args->bpp, 8);
  380. if (pitch_align) {
  381. if (WARN_ON_ONCE(!is_power_of_2(pitch_align)))
  382. return -EINVAL;
  383. pitch = ALIGN(pitch, pitch_align);
  384. }
  385. size = pitch * args->height;
  386. size = roundup(size, PAGE_SIZE);
  387. if (!size)
  388. return -EINVAL;
  389. gbo = drm_gem_vram_create(dev, size, pg_align);
  390. if (IS_ERR(gbo))
  391. return PTR_ERR(gbo);
  392. ret = drm_gem_handle_create(file, &gbo->bo.base, &handle);
  393. if (ret)
  394. goto err_drm_gem_object_put;
  395. drm_gem_object_put(&gbo->bo.base);
  396. args->pitch = pitch;
  397. args->size = size;
  398. args->handle = handle;
  399. return 0;
  400. err_drm_gem_object_put:
  401. drm_gem_object_put(&gbo->bo.base);
  402. return ret;
  403. }
  404. EXPORT_SYMBOL(drm_gem_vram_fill_create_dumb);
  405. /*
  406. * Helpers for struct ttm_device_funcs
  407. */
  408. static bool drm_is_gem_vram(struct ttm_buffer_object *bo)
  409. {
  410. return (bo->destroy == ttm_buffer_object_destroy);
  411. }
  412. static void drm_gem_vram_bo_driver_evict_flags(struct drm_gem_vram_object *gbo,
  413. struct ttm_placement *pl)
  414. {
  415. drm_gem_vram_placement(gbo, DRM_GEM_VRAM_PL_FLAG_SYSTEM);
  416. *pl = gbo->placement;
  417. }
  418. static void drm_gem_vram_bo_driver_move_notify(struct drm_gem_vram_object *gbo)
  419. {
  420. struct ttm_buffer_object *bo = &gbo->bo;
  421. struct drm_device *dev = bo->base.dev;
  422. if (drm_WARN_ON_ONCE(dev, gbo->vmap_use_count))
  423. return;
  424. ttm_bo_vunmap(bo, &gbo->map);
  425. iosys_map_clear(&gbo->map); /* explicitly clear mapping for next vmap call */
  426. }
  427. static int drm_gem_vram_bo_driver_move(struct drm_gem_vram_object *gbo,
  428. bool evict,
  429. struct ttm_operation_ctx *ctx,
  430. struct ttm_resource *new_mem)
  431. {
  432. drm_gem_vram_bo_driver_move_notify(gbo);
  433. return ttm_bo_move_memcpy(&gbo->bo, ctx, new_mem);
  434. }
  435. /*
  436. * Helpers for struct drm_gem_object_funcs
  437. */
  438. /**
  439. * drm_gem_vram_object_free() - Implements &struct drm_gem_object_funcs.free
  440. * @gem: GEM object. Refers to &struct drm_gem_vram_object.gem
  441. */
  442. static void drm_gem_vram_object_free(struct drm_gem_object *gem)
  443. {
  444. struct drm_gem_vram_object *gbo = drm_gem_vram_of_gem(gem);
  445. drm_gem_vram_put(gbo);
  446. }
  447. /*
  448. * Helpers for dump buffers
  449. */
  450. /**
  451. * drm_gem_vram_driver_dumb_create() - Implements &struct drm_driver.dumb_create
  452. * @file: the DRM file
  453. * @dev: the DRM device
  454. * @args: the arguments as provided to
  455. * &struct drm_driver.dumb_create
  456. *
  457. * This function requires the driver to use @drm_device.vram_mm for its
  458. * instance of VRAM MM.
  459. *
  460. * Returns:
  461. * 0 on success, or
  462. * a negative error code otherwise.
  463. */
  464. int drm_gem_vram_driver_dumb_create(struct drm_file *file,
  465. struct drm_device *dev,
  466. struct drm_mode_create_dumb *args)
  467. {
  468. if (WARN_ONCE(!dev->vram_mm, "VRAM MM not initialized"))
  469. return -EINVAL;
  470. return drm_gem_vram_fill_create_dumb(file, dev, 0, 0, args);
  471. }
  472. EXPORT_SYMBOL(drm_gem_vram_driver_dumb_create);
  473. /*
  474. * Helpers for struct drm_plane_helper_funcs
  475. */
  476. static void __drm_gem_vram_plane_helper_cleanup_fb(struct drm_plane *plane,
  477. struct drm_plane_state *state,
  478. unsigned int num_planes)
  479. {
  480. struct drm_gem_object *obj;
  481. struct drm_gem_vram_object *gbo;
  482. struct drm_framebuffer *fb = state->fb;
  483. while (num_planes) {
  484. --num_planes;
  485. obj = drm_gem_fb_get_obj(fb, num_planes);
  486. if (!obj)
  487. continue;
  488. gbo = drm_gem_vram_of_gem(obj);
  489. drm_gem_vram_unpin(gbo);
  490. }
  491. }
  492. /**
  493. * drm_gem_vram_plane_helper_prepare_fb() - Implements &struct
  494. * drm_plane_helper_funcs.prepare_fb
  495. * @plane: a DRM plane
  496. * @new_state: the plane's new state
  497. *
  498. * During plane updates, this function sets the plane's fence and
  499. * pins the GEM VRAM objects of the plane's new framebuffer to VRAM.
  500. * Call drm_gem_vram_plane_helper_cleanup_fb() to unpin them.
  501. *
  502. * Returns:
  503. * 0 on success, or
  504. * a negative errno code otherwise.
  505. */
  506. int
  507. drm_gem_vram_plane_helper_prepare_fb(struct drm_plane *plane,
  508. struct drm_plane_state *new_state)
  509. {
  510. struct drm_framebuffer *fb = new_state->fb;
  511. struct drm_gem_vram_object *gbo;
  512. struct drm_gem_object *obj;
  513. unsigned int i;
  514. int ret;
  515. if (!fb)
  516. return 0;
  517. for (i = 0; i < fb->format->num_planes; ++i) {
  518. obj = drm_gem_fb_get_obj(fb, i);
  519. if (!obj) {
  520. ret = -EINVAL;
  521. goto err_drm_gem_vram_unpin;
  522. }
  523. gbo = drm_gem_vram_of_gem(obj);
  524. ret = drm_gem_vram_pin(gbo, DRM_GEM_VRAM_PL_FLAG_VRAM);
  525. if (ret)
  526. goto err_drm_gem_vram_unpin;
  527. }
  528. ret = drm_gem_plane_helper_prepare_fb(plane, new_state);
  529. if (ret)
  530. goto err_drm_gem_vram_unpin;
  531. return 0;
  532. err_drm_gem_vram_unpin:
  533. __drm_gem_vram_plane_helper_cleanup_fb(plane, new_state, i);
  534. return ret;
  535. }
  536. EXPORT_SYMBOL(drm_gem_vram_plane_helper_prepare_fb);
  537. /**
  538. * drm_gem_vram_plane_helper_cleanup_fb() - Implements &struct
  539. * drm_plane_helper_funcs.cleanup_fb
  540. * @plane: a DRM plane
  541. * @old_state: the plane's old state
  542. *
  543. * During plane updates, this function unpins the GEM VRAM
  544. * objects of the plane's old framebuffer from VRAM. Complements
  545. * drm_gem_vram_plane_helper_prepare_fb().
  546. */
  547. void
  548. drm_gem_vram_plane_helper_cleanup_fb(struct drm_plane *plane,
  549. struct drm_plane_state *old_state)
  550. {
  551. struct drm_framebuffer *fb = old_state->fb;
  552. if (!fb)
  553. return;
  554. __drm_gem_vram_plane_helper_cleanup_fb(plane, old_state, fb->format->num_planes);
  555. }
  556. EXPORT_SYMBOL(drm_gem_vram_plane_helper_cleanup_fb);
  557. /*
  558. * PRIME helpers
  559. */
  560. /**
  561. * drm_gem_vram_object_vmap() -
  562. * Implements &struct drm_gem_object_funcs.vmap
  563. * @gem: The GEM object to map
  564. * @map: Returns the kernel virtual address of the VRAM GEM object's backing
  565. * store.
  566. *
  567. * Returns:
  568. * 0 on success, or a negative error code otherwise.
  569. */
  570. static int drm_gem_vram_object_vmap(struct drm_gem_object *gem,
  571. struct iosys_map *map)
  572. {
  573. struct drm_gem_vram_object *gbo = drm_gem_vram_of_gem(gem);
  574. return drm_gem_vram_vmap(gbo, map);
  575. }
  576. /**
  577. * drm_gem_vram_object_vunmap() -
  578. * Implements &struct drm_gem_object_funcs.vunmap
  579. * @gem: The GEM object to unmap
  580. * @map: Kernel virtual address where the VRAM GEM object was mapped
  581. */
  582. static void drm_gem_vram_object_vunmap(struct drm_gem_object *gem,
  583. struct iosys_map *map)
  584. {
  585. struct drm_gem_vram_object *gbo = drm_gem_vram_of_gem(gem);
  586. drm_gem_vram_vunmap(gbo, map);
  587. }
  588. /*
  589. * GEM object funcs
  590. */
  591. static const struct drm_gem_object_funcs drm_gem_vram_object_funcs = {
  592. .free = drm_gem_vram_object_free,
  593. .vmap = drm_gem_vram_object_vmap,
  594. .vunmap = drm_gem_vram_object_vunmap,
  595. .mmap = drm_gem_ttm_mmap,
  596. .print_info = drm_gem_ttm_print_info,
  597. };
  598. /*
  599. * VRAM memory manager
  600. */
  601. /*
  602. * TTM TT
  603. */
  604. static void bo_driver_ttm_tt_destroy(struct ttm_device *bdev, struct ttm_tt *tt)
  605. {
  606. ttm_tt_fini(tt);
  607. kfree(tt);
  608. }
  609. /*
  610. * TTM BO device
  611. */
  612. static struct ttm_tt *bo_driver_ttm_tt_create(struct ttm_buffer_object *bo,
  613. uint32_t page_flags)
  614. {
  615. struct ttm_tt *tt;
  616. int ret;
  617. tt = kzalloc_obj(*tt);
  618. if (!tt)
  619. return NULL;
  620. ret = ttm_tt_init(tt, bo, page_flags, ttm_cached, 0);
  621. if (ret < 0)
  622. goto err_ttm_tt_init;
  623. return tt;
  624. err_ttm_tt_init:
  625. kfree(tt);
  626. return NULL;
  627. }
  628. static void bo_driver_evict_flags(struct ttm_buffer_object *bo,
  629. struct ttm_placement *placement)
  630. {
  631. struct drm_gem_vram_object *gbo;
  632. /* TTM may pass BOs that are not GEM VRAM BOs. */
  633. if (!drm_is_gem_vram(bo))
  634. return;
  635. gbo = drm_gem_vram_of_bo(bo);
  636. drm_gem_vram_bo_driver_evict_flags(gbo, placement);
  637. }
  638. static void bo_driver_delete_mem_notify(struct ttm_buffer_object *bo)
  639. {
  640. struct drm_gem_vram_object *gbo;
  641. /* TTM may pass BOs that are not GEM VRAM BOs. */
  642. if (!drm_is_gem_vram(bo))
  643. return;
  644. gbo = drm_gem_vram_of_bo(bo);
  645. drm_gem_vram_bo_driver_move_notify(gbo);
  646. }
  647. static int bo_driver_move(struct ttm_buffer_object *bo,
  648. bool evict,
  649. struct ttm_operation_ctx *ctx,
  650. struct ttm_resource *new_mem,
  651. struct ttm_place *hop)
  652. {
  653. struct drm_gem_vram_object *gbo;
  654. if (!bo->resource) {
  655. if (new_mem->mem_type != TTM_PL_SYSTEM) {
  656. hop->mem_type = TTM_PL_SYSTEM;
  657. hop->flags = TTM_PL_FLAG_TEMPORARY;
  658. return -EMULTIHOP;
  659. }
  660. ttm_bo_move_null(bo, new_mem);
  661. return 0;
  662. }
  663. gbo = drm_gem_vram_of_bo(bo);
  664. return drm_gem_vram_bo_driver_move(gbo, evict, ctx, new_mem);
  665. }
  666. static int bo_driver_io_mem_reserve(struct ttm_device *bdev,
  667. struct ttm_resource *mem)
  668. {
  669. struct drm_vram_mm *vmm = drm_vram_mm_of_bdev(bdev);
  670. switch (mem->mem_type) {
  671. case TTM_PL_SYSTEM: /* nothing to do */
  672. break;
  673. case TTM_PL_VRAM:
  674. mem->bus.offset = (mem->start << PAGE_SHIFT) + vmm->vram_base;
  675. mem->bus.is_iomem = true;
  676. mem->bus.caching = ttm_write_combined;
  677. break;
  678. default:
  679. return -EINVAL;
  680. }
  681. return 0;
  682. }
  683. static struct ttm_device_funcs bo_driver = {
  684. .ttm_tt_create = bo_driver_ttm_tt_create,
  685. .ttm_tt_destroy = bo_driver_ttm_tt_destroy,
  686. .eviction_valuable = ttm_bo_eviction_valuable,
  687. .evict_flags = bo_driver_evict_flags,
  688. .move = bo_driver_move,
  689. .delete_mem_notify = bo_driver_delete_mem_notify,
  690. .io_mem_reserve = bo_driver_io_mem_reserve,
  691. };
  692. /*
  693. * struct drm_vram_mm
  694. */
  695. static int drm_vram_mm_debugfs(struct seq_file *m, void *data)
  696. {
  697. struct drm_debugfs_entry *entry = m->private;
  698. struct drm_vram_mm *vmm = entry->dev->vram_mm;
  699. struct ttm_resource_manager *man = ttm_manager_type(&vmm->bdev, TTM_PL_VRAM);
  700. struct drm_printer p = drm_seq_file_printer(m);
  701. ttm_resource_manager_debug(man, &p);
  702. return 0;
  703. }
  704. static const struct drm_debugfs_info drm_vram_mm_debugfs_list[] = {
  705. { "vram-mm", drm_vram_mm_debugfs, 0, NULL },
  706. };
  707. /**
  708. * drm_vram_mm_debugfs_init() - Register VRAM MM debugfs file.
  709. *
  710. * @minor: drm minor device.
  711. *
  712. */
  713. void drm_vram_mm_debugfs_init(struct drm_minor *minor)
  714. {
  715. drm_debugfs_add_files(minor->dev, drm_vram_mm_debugfs_list,
  716. ARRAY_SIZE(drm_vram_mm_debugfs_list));
  717. }
  718. EXPORT_SYMBOL(drm_vram_mm_debugfs_init);
  719. static int drm_vram_mm_init(struct drm_vram_mm *vmm, struct drm_device *dev,
  720. uint64_t vram_base, size_t vram_size)
  721. {
  722. int ret;
  723. vmm->vram_base = vram_base;
  724. vmm->vram_size = vram_size;
  725. ret = ttm_device_init(&vmm->bdev, &bo_driver, dev->dev,
  726. dev->anon_inode->i_mapping,
  727. dev->vma_offset_manager,
  728. TTM_ALLOCATION_POOL_USE_DMA32);
  729. if (ret)
  730. return ret;
  731. ret = ttm_range_man_init(&vmm->bdev, TTM_PL_VRAM,
  732. false, vram_size >> PAGE_SHIFT);
  733. if (ret)
  734. return ret;
  735. return 0;
  736. }
  737. static void drm_vram_mm_cleanup(struct drm_vram_mm *vmm)
  738. {
  739. ttm_range_man_fini(&vmm->bdev, TTM_PL_VRAM);
  740. ttm_device_fini(&vmm->bdev);
  741. }
  742. /*
  743. * Helpers for integration with struct drm_device
  744. */
  745. static struct drm_vram_mm *drm_vram_helper_alloc_mm(struct drm_device *dev, uint64_t vram_base,
  746. size_t vram_size)
  747. {
  748. int ret;
  749. if (WARN_ON(dev->vram_mm))
  750. return dev->vram_mm;
  751. dev->vram_mm = kzalloc_obj(*dev->vram_mm);
  752. if (!dev->vram_mm)
  753. return ERR_PTR(-ENOMEM);
  754. ret = drm_vram_mm_init(dev->vram_mm, dev, vram_base, vram_size);
  755. if (ret)
  756. goto err_kfree;
  757. return dev->vram_mm;
  758. err_kfree:
  759. kfree(dev->vram_mm);
  760. dev->vram_mm = NULL;
  761. return ERR_PTR(ret);
  762. }
  763. static void drm_vram_helper_release_mm(struct drm_device *dev)
  764. {
  765. if (!dev->vram_mm)
  766. return;
  767. drm_vram_mm_cleanup(dev->vram_mm);
  768. kfree(dev->vram_mm);
  769. dev->vram_mm = NULL;
  770. }
  771. static void drm_vram_mm_release(struct drm_device *dev, void *ptr)
  772. {
  773. drm_vram_helper_release_mm(dev);
  774. }
  775. /**
  776. * drmm_vram_helper_init - Initializes a device's instance of
  777. * &struct drm_vram_mm
  778. * @dev: the DRM device
  779. * @vram_base: the base address of the video memory
  780. * @vram_size: the size of the video memory in bytes
  781. *
  782. * Creates a new instance of &struct drm_vram_mm and stores it in
  783. * struct &drm_device.vram_mm. The instance is auto-managed and cleaned
  784. * up as part of device cleanup. Calling this function multiple times
  785. * will generate an error message.
  786. *
  787. * Returns:
  788. * 0 on success, or a negative errno code otherwise.
  789. */
  790. int drmm_vram_helper_init(struct drm_device *dev, uint64_t vram_base,
  791. size_t vram_size)
  792. {
  793. struct drm_vram_mm *vram_mm;
  794. if (drm_WARN_ON_ONCE(dev, dev->vram_mm))
  795. return 0;
  796. vram_mm = drm_vram_helper_alloc_mm(dev, vram_base, vram_size);
  797. if (IS_ERR(vram_mm))
  798. return PTR_ERR(vram_mm);
  799. return drmm_add_action_or_reset(dev, drm_vram_mm_release, NULL);
  800. }
  801. EXPORT_SYMBOL(drmm_vram_helper_init);
  802. /*
  803. * Mode-config helpers
  804. */
  805. static enum drm_mode_status
  806. drm_vram_helper_mode_valid_internal(struct drm_device *dev,
  807. const struct drm_display_mode *mode,
  808. unsigned long max_bpp)
  809. {
  810. struct drm_vram_mm *vmm = dev->vram_mm;
  811. unsigned long fbsize, fbpages, max_fbpages;
  812. if (WARN_ON(!dev->vram_mm))
  813. return MODE_BAD;
  814. max_fbpages = (vmm->vram_size / 2) >> PAGE_SHIFT;
  815. fbsize = (u32)mode->hdisplay * mode->vdisplay * max_bpp;
  816. fbpages = DIV_ROUND_UP(fbsize, PAGE_SIZE);
  817. if (fbpages > max_fbpages)
  818. return MODE_MEM;
  819. return MODE_OK;
  820. }
  821. /**
  822. * drm_vram_helper_mode_valid - Tests if a display mode's
  823. * framebuffer fits into the available video memory.
  824. * @dev: the DRM device
  825. * @mode: the mode to test
  826. *
  827. * This function tests if enough video memory is available for using the
  828. * specified display mode. Atomic modesetting requires importing the
  829. * designated framebuffer into video memory before evicting the active
  830. * one. Hence, any framebuffer may consume at most half of the available
  831. * VRAM. Display modes that require a larger framebuffer can not be used,
  832. * even if the CRTC does support them. Each framebuffer is assumed to
  833. * have 32-bit color depth.
  834. *
  835. * Note:
  836. * The function can only test if the display mode is supported in
  837. * general. If there are too many framebuffers pinned to video memory,
  838. * a display mode may still not be usable in practice. The color depth of
  839. * 32-bit fits all current use case. A more flexible test can be added
  840. * when necessary.
  841. *
  842. * Returns:
  843. * MODE_OK if the display mode is supported, or an error code of type
  844. * enum drm_mode_status otherwise.
  845. */
  846. enum drm_mode_status
  847. drm_vram_helper_mode_valid(struct drm_device *dev,
  848. const struct drm_display_mode *mode)
  849. {
  850. static const unsigned long max_bpp = 4; /* DRM_FORMAT_XRGB8888 */
  851. return drm_vram_helper_mode_valid_internal(dev, mode, max_bpp);
  852. }
  853. EXPORT_SYMBOL(drm_vram_helper_mode_valid);
  854. MODULE_DESCRIPTION("DRM VRAM memory-management helpers");
  855. MODULE_LICENSE("GPL");