msm_drv.c 28 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2016-2018, 2020-2021 The Linux Foundation. All rights reserved.
  4. * Copyright (C) 2013 Red Hat
  5. * Author: Rob Clark <robdclark@gmail.com>
  6. */
  7. #include <linux/dma-mapping.h>
  8. #include <linux/fault-inject.h>
  9. #include <linux/debugfs.h>
  10. #include <linux/of_address.h>
  11. #include <linux/uaccess.h>
  12. #include <drm/drm_drv.h>
  13. #include <drm/drm_file.h>
  14. #include <drm/drm_ioctl.h>
  15. #include <drm/drm_of.h>
  16. #include "msm_drv.h"
  17. #include "msm_debugfs.h"
  18. #include "msm_gem.h"
  19. #include "msm_gpu.h"
  20. #include "msm_kms.h"
  21. /*
  22. * MSM driver version:
  23. * - 1.0.0 - initial interface
  24. * - 1.1.0 - adds madvise, and support for submits with > 4 cmd buffers
  25. * - 1.2.0 - adds explicit fence support for submit ioctl
  26. * - 1.3.0 - adds GMEM_BASE + NR_RINGS params, SUBMITQUEUE_NEW +
  27. * SUBMITQUEUE_CLOSE ioctls, and MSM_INFO_IOVA flag for
  28. * MSM_GEM_INFO ioctl.
  29. * - 1.4.0 - softpin, MSM_RELOC_BO_DUMP, and GEM_INFO support to set/get
  30. * GEM object's debug name
  31. * - 1.5.0 - Add SUBMITQUERY_QUERY ioctl
  32. * - 1.6.0 - Syncobj support
  33. * - 1.7.0 - Add MSM_PARAM_SUSPENDS to access suspend count
  34. * - 1.8.0 - Add MSM_BO_CACHED_COHERENT for supported GPUs (a6xx)
  35. * - 1.9.0 - Add MSM_SUBMIT_FENCE_SN_IN
  36. * - 1.10.0 - Add MSM_SUBMIT_BO_NO_IMPLICIT
  37. * - 1.11.0 - Add wait boost (MSM_WAIT_FENCE_BOOST, MSM_PREP_BOOST)
  38. * - 1.12.0 - Add MSM_INFO_SET_METADATA and MSM_INFO_GET_METADATA
  39. */
  40. #define MSM_VERSION_MAJOR 1
  41. #define MSM_VERSION_MINOR 12
  42. #define MSM_VERSION_PATCHLEVEL 0
  43. static void msm_deinit_vram(struct drm_device *ddev);
  44. static char *vram = "16m";
  45. MODULE_PARM_DESC(vram, "Configure VRAM size (for devices without IOMMU/GPUMMU)");
  46. module_param(vram, charp, 0);
  47. bool dumpstate;
  48. MODULE_PARM_DESC(dumpstate, "Dump KMS state on errors");
  49. module_param(dumpstate, bool, 0600);
  50. static bool modeset = true;
  51. MODULE_PARM_DESC(modeset, "Use kernel modesetting [KMS] (1=on (default), 0=disable)");
  52. module_param(modeset, bool, 0600);
  53. DECLARE_FAULT_ATTR(fail_gem_alloc);
  54. DECLARE_FAULT_ATTR(fail_gem_iova);
  55. static int msm_drm_uninit(struct device *dev)
  56. {
  57. struct platform_device *pdev = to_platform_device(dev);
  58. struct msm_drm_private *priv = platform_get_drvdata(pdev);
  59. struct drm_device *ddev = priv->dev;
  60. /*
  61. * Shutdown the hw if we're far enough along where things might be on.
  62. * If we run this too early, we'll end up panicking in any variety of
  63. * places. Since we don't register the drm device until late in
  64. * msm_drm_init, drm_dev->registered is used as an indicator that the
  65. * shutdown will be successful.
  66. */
  67. if (ddev->registered) {
  68. drm_dev_unregister(ddev);
  69. if (priv->kms)
  70. drm_atomic_helper_shutdown(ddev);
  71. }
  72. /* We must cancel and cleanup any pending vblank enable/disable
  73. * work before msm_irq_uninstall() to avoid work re-enabling an
  74. * irq after uninstall has disabled it.
  75. */
  76. flush_workqueue(priv->wq);
  77. msm_gem_shrinker_cleanup(ddev);
  78. msm_perf_debugfs_cleanup(priv);
  79. msm_rd_debugfs_cleanup(priv);
  80. if (priv->kms)
  81. msm_drm_kms_uninit(dev);
  82. msm_deinit_vram(ddev);
  83. component_unbind_all(dev, ddev);
  84. ddev->dev_private = NULL;
  85. drm_dev_put(ddev);
  86. destroy_workqueue(priv->wq);
  87. return 0;
  88. }
  89. bool msm_use_mmu(struct drm_device *dev)
  90. {
  91. struct msm_drm_private *priv = dev->dev_private;
  92. /*
  93. * a2xx comes with its own MMU
  94. * On other platforms IOMMU can be declared specified either for the
  95. * MDP/DPU device or for its parent, MDSS device.
  96. */
  97. return priv->is_a2xx ||
  98. device_iommu_mapped(dev->dev) ||
  99. device_iommu_mapped(dev->dev->parent);
  100. }
  101. static int msm_init_vram(struct drm_device *dev)
  102. {
  103. struct msm_drm_private *priv = dev->dev_private;
  104. struct device_node *node;
  105. unsigned long size = 0;
  106. int ret = 0;
  107. /* In the device-tree world, we could have a 'memory-region'
  108. * phandle, which gives us a link to our "vram". Allocating
  109. * is all nicely abstracted behind the dma api, but we need
  110. * to know the entire size to allocate it all in one go. There
  111. * are two cases:
  112. * 1) device with no IOMMU, in which case we need exclusive
  113. * access to a VRAM carveout big enough for all gpu
  114. * buffers
  115. * 2) device with IOMMU, but where the bootloader puts up
  116. * a splash screen. In this case, the VRAM carveout
  117. * need only be large enough for fbdev fb. But we need
  118. * exclusive access to the buffer to avoid the kernel
  119. * using those pages for other purposes (which appears
  120. * as corruption on screen before we have a chance to
  121. * load and do initial modeset)
  122. */
  123. node = of_parse_phandle(dev->dev->of_node, "memory-region", 0);
  124. if (node) {
  125. struct resource r;
  126. ret = of_address_to_resource(node, 0, &r);
  127. of_node_put(node);
  128. if (ret)
  129. return ret;
  130. size = r.end - r.start + 1;
  131. DRM_INFO("using VRAM carveout: %lx@%pa\n", size, &r.start);
  132. /* if we have no IOMMU, then we need to use carveout allocator.
  133. * Grab the entire DMA chunk carved out in early startup in
  134. * mach-msm:
  135. */
  136. } else if (!msm_use_mmu(dev)) {
  137. DRM_INFO("using %s VRAM carveout\n", vram);
  138. size = memparse(vram, NULL);
  139. }
  140. if (size) {
  141. unsigned long attrs = 0;
  142. void *p;
  143. priv->vram.size = size;
  144. drm_mm_init(&priv->vram.mm, 0, (size >> PAGE_SHIFT) - 1);
  145. spin_lock_init(&priv->vram.lock);
  146. attrs |= DMA_ATTR_NO_KERNEL_MAPPING;
  147. attrs |= DMA_ATTR_WRITE_COMBINE;
  148. /* note that for no-kernel-mapping, the vaddr returned
  149. * is bogus, but non-null if allocation succeeded:
  150. */
  151. p = dma_alloc_attrs(dev->dev, size,
  152. &priv->vram.paddr, GFP_KERNEL, attrs);
  153. if (!p) {
  154. DRM_DEV_ERROR(dev->dev, "failed to allocate VRAM\n");
  155. priv->vram.paddr = 0;
  156. return -ENOMEM;
  157. }
  158. DRM_DEV_INFO(dev->dev, "VRAM: %08x->%08x\n",
  159. (uint32_t)priv->vram.paddr,
  160. (uint32_t)(priv->vram.paddr + size));
  161. }
  162. return ret;
  163. }
  164. static void msm_deinit_vram(struct drm_device *ddev)
  165. {
  166. struct msm_drm_private *priv = ddev->dev_private;
  167. unsigned long attrs = DMA_ATTR_NO_KERNEL_MAPPING;
  168. if (!priv->vram.paddr)
  169. return;
  170. drm_mm_takedown(&priv->vram.mm);
  171. dma_free_attrs(ddev->dev, priv->vram.size, NULL, priv->vram.paddr,
  172. attrs);
  173. }
  174. static int msm_drm_init(struct device *dev, const struct drm_driver *drv)
  175. {
  176. struct msm_drm_private *priv = dev_get_drvdata(dev);
  177. struct drm_device *ddev;
  178. int ret;
  179. if (drm_firmware_drivers_only())
  180. return -ENODEV;
  181. ddev = drm_dev_alloc(drv, dev);
  182. if (IS_ERR(ddev)) {
  183. DRM_DEV_ERROR(dev, "failed to allocate drm_device\n");
  184. return PTR_ERR(ddev);
  185. }
  186. ddev->dev_private = priv;
  187. priv->dev = ddev;
  188. priv->wq = alloc_ordered_workqueue("msm", 0);
  189. if (!priv->wq) {
  190. ret = -ENOMEM;
  191. goto err_put_dev;
  192. }
  193. INIT_LIST_HEAD(&priv->objects);
  194. mutex_init(&priv->obj_lock);
  195. /*
  196. * Initialize the LRUs:
  197. */
  198. mutex_init(&priv->lru.lock);
  199. drm_gem_lru_init(&priv->lru.unbacked, &priv->lru.lock);
  200. drm_gem_lru_init(&priv->lru.pinned, &priv->lru.lock);
  201. drm_gem_lru_init(&priv->lru.willneed, &priv->lru.lock);
  202. drm_gem_lru_init(&priv->lru.dontneed, &priv->lru.lock);
  203. /* Teach lockdep about lock ordering wrt. shrinker: */
  204. fs_reclaim_acquire(GFP_KERNEL);
  205. might_lock(&priv->lru.lock);
  206. fs_reclaim_release(GFP_KERNEL);
  207. if (priv->kms_init) {
  208. ret = drmm_mode_config_init(ddev);
  209. if (ret)
  210. goto err_destroy_wq;
  211. }
  212. ret = msm_init_vram(ddev);
  213. if (ret)
  214. goto err_destroy_wq;
  215. dma_set_max_seg_size(dev, UINT_MAX);
  216. /* Bind all our sub-components: */
  217. ret = component_bind_all(dev, ddev);
  218. if (ret)
  219. goto err_deinit_vram;
  220. ret = msm_gem_shrinker_init(ddev);
  221. if (ret)
  222. goto err_msm_uninit;
  223. if (priv->kms_init) {
  224. ret = msm_drm_kms_init(dev, drv);
  225. if (ret)
  226. goto err_msm_uninit;
  227. } else {
  228. /* valid only for the dummy headless case, where of_node=NULL */
  229. WARN_ON(dev->of_node);
  230. ddev->driver_features &= ~DRIVER_MODESET;
  231. ddev->driver_features &= ~DRIVER_ATOMIC;
  232. }
  233. ret = drm_dev_register(ddev, 0);
  234. if (ret)
  235. goto err_msm_uninit;
  236. ret = msm_debugfs_late_init(ddev);
  237. if (ret)
  238. goto err_msm_uninit;
  239. if (priv->kms_init) {
  240. drm_kms_helper_poll_init(ddev);
  241. msm_fbdev_setup(ddev);
  242. }
  243. return 0;
  244. err_msm_uninit:
  245. msm_drm_uninit(dev);
  246. return ret;
  247. err_deinit_vram:
  248. msm_deinit_vram(ddev);
  249. err_destroy_wq:
  250. destroy_workqueue(priv->wq);
  251. err_put_dev:
  252. drm_dev_put(ddev);
  253. return ret;
  254. }
  255. /*
  256. * DRM operations:
  257. */
  258. static void load_gpu(struct drm_device *dev)
  259. {
  260. static DEFINE_MUTEX(init_lock);
  261. struct msm_drm_private *priv = dev->dev_private;
  262. mutex_lock(&init_lock);
  263. if (!priv->gpu)
  264. priv->gpu = adreno_load_gpu(dev);
  265. mutex_unlock(&init_lock);
  266. }
  267. static int context_init(struct drm_device *dev, struct drm_file *file)
  268. {
  269. static atomic_t ident = ATOMIC_INIT(0);
  270. struct msm_drm_private *priv = dev->dev_private;
  271. struct msm_file_private *ctx;
  272. ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
  273. if (!ctx)
  274. return -ENOMEM;
  275. INIT_LIST_HEAD(&ctx->submitqueues);
  276. rwlock_init(&ctx->queuelock);
  277. kref_init(&ctx->ref);
  278. msm_submitqueue_init(dev, ctx);
  279. ctx->aspace = msm_gpu_create_private_address_space(priv->gpu, current);
  280. file->driver_priv = ctx;
  281. ctx->seqno = atomic_inc_return(&ident);
  282. return 0;
  283. }
  284. static int msm_open(struct drm_device *dev, struct drm_file *file)
  285. {
  286. /* For now, load gpu on open.. to avoid the requirement of having
  287. * firmware in the initrd.
  288. */
  289. load_gpu(dev);
  290. return context_init(dev, file);
  291. }
  292. static void context_close(struct msm_file_private *ctx)
  293. {
  294. msm_submitqueue_close(ctx);
  295. msm_file_private_put(ctx);
  296. }
  297. static void msm_postclose(struct drm_device *dev, struct drm_file *file)
  298. {
  299. struct msm_drm_private *priv = dev->dev_private;
  300. struct msm_file_private *ctx = file->driver_priv;
  301. /*
  302. * It is not possible to set sysprof param to non-zero if gpu
  303. * is not initialized:
  304. */
  305. if (priv->gpu)
  306. msm_file_private_set_sysprof(ctx, priv->gpu, 0);
  307. context_close(ctx);
  308. }
  309. /*
  310. * DRM ioctls:
  311. */
  312. static int msm_ioctl_get_param(struct drm_device *dev, void *data,
  313. struct drm_file *file)
  314. {
  315. struct msm_drm_private *priv = dev->dev_private;
  316. struct drm_msm_param *args = data;
  317. struct msm_gpu *gpu;
  318. /* for now, we just have 3d pipe.. eventually this would need to
  319. * be more clever to dispatch to appropriate gpu module:
  320. */
  321. if ((args->pipe != MSM_PIPE_3D0) || (args->pad != 0))
  322. return -EINVAL;
  323. gpu = priv->gpu;
  324. if (!gpu)
  325. return -ENXIO;
  326. return gpu->funcs->get_param(gpu, file->driver_priv,
  327. args->param, &args->value, &args->len);
  328. }
  329. static int msm_ioctl_set_param(struct drm_device *dev, void *data,
  330. struct drm_file *file)
  331. {
  332. struct msm_drm_private *priv = dev->dev_private;
  333. struct drm_msm_param *args = data;
  334. struct msm_gpu *gpu;
  335. if ((args->pipe != MSM_PIPE_3D0) || (args->pad != 0))
  336. return -EINVAL;
  337. gpu = priv->gpu;
  338. if (!gpu)
  339. return -ENXIO;
  340. return gpu->funcs->set_param(gpu, file->driver_priv,
  341. args->param, args->value, args->len);
  342. }
  343. static int msm_ioctl_gem_new(struct drm_device *dev, void *data,
  344. struct drm_file *file)
  345. {
  346. struct drm_msm_gem_new *args = data;
  347. uint32_t flags = args->flags;
  348. if (args->flags & ~MSM_BO_FLAGS) {
  349. DRM_ERROR("invalid flags: %08x\n", args->flags);
  350. return -EINVAL;
  351. }
  352. /*
  353. * Uncached CPU mappings are deprecated, as of:
  354. *
  355. * 9ef364432db4 ("drm/msm: deprecate MSM_BO_UNCACHED (map as writecombine instead)")
  356. *
  357. * So promote them to WC.
  358. */
  359. if (flags & MSM_BO_UNCACHED) {
  360. flags &= ~MSM_BO_CACHED;
  361. flags |= MSM_BO_WC;
  362. }
  363. if (should_fail(&fail_gem_alloc, args->size))
  364. return -ENOMEM;
  365. return msm_gem_new_handle(dev, file, args->size,
  366. args->flags, &args->handle, NULL);
  367. }
  368. static inline ktime_t to_ktime(struct drm_msm_timespec timeout)
  369. {
  370. return ktime_set(timeout.tv_sec, timeout.tv_nsec);
  371. }
  372. static int msm_ioctl_gem_cpu_prep(struct drm_device *dev, void *data,
  373. struct drm_file *file)
  374. {
  375. struct drm_msm_gem_cpu_prep *args = data;
  376. struct drm_gem_object *obj;
  377. ktime_t timeout = to_ktime(args->timeout);
  378. int ret;
  379. if (args->op & ~MSM_PREP_FLAGS) {
  380. DRM_ERROR("invalid op: %08x\n", args->op);
  381. return -EINVAL;
  382. }
  383. obj = drm_gem_object_lookup(file, args->handle);
  384. if (!obj)
  385. return -ENOENT;
  386. ret = msm_gem_cpu_prep(obj, args->op, &timeout);
  387. drm_gem_object_put(obj);
  388. return ret;
  389. }
  390. static int msm_ioctl_gem_cpu_fini(struct drm_device *dev, void *data,
  391. struct drm_file *file)
  392. {
  393. struct drm_msm_gem_cpu_fini *args = data;
  394. struct drm_gem_object *obj;
  395. int ret;
  396. obj = drm_gem_object_lookup(file, args->handle);
  397. if (!obj)
  398. return -ENOENT;
  399. ret = msm_gem_cpu_fini(obj);
  400. drm_gem_object_put(obj);
  401. return ret;
  402. }
  403. static int msm_ioctl_gem_info_iova(struct drm_device *dev,
  404. struct drm_file *file, struct drm_gem_object *obj,
  405. uint64_t *iova)
  406. {
  407. struct msm_drm_private *priv = dev->dev_private;
  408. struct msm_file_private *ctx = file->driver_priv;
  409. if (!priv->gpu)
  410. return -EINVAL;
  411. if (should_fail(&fail_gem_iova, obj->size))
  412. return -ENOMEM;
  413. /*
  414. * Don't pin the memory here - just get an address so that userspace can
  415. * be productive
  416. */
  417. return msm_gem_get_iova(obj, ctx->aspace, iova);
  418. }
  419. static int msm_ioctl_gem_info_set_iova(struct drm_device *dev,
  420. struct drm_file *file, struct drm_gem_object *obj,
  421. uint64_t iova)
  422. {
  423. struct msm_drm_private *priv = dev->dev_private;
  424. struct msm_file_private *ctx = file->driver_priv;
  425. if (!priv->gpu)
  426. return -EINVAL;
  427. /* Only supported if per-process address space is supported: */
  428. if (priv->gpu->aspace == ctx->aspace)
  429. return -EOPNOTSUPP;
  430. if (should_fail(&fail_gem_iova, obj->size))
  431. return -ENOMEM;
  432. return msm_gem_set_iova(obj, ctx->aspace, iova);
  433. }
  434. static int msm_ioctl_gem_info_set_metadata(struct drm_gem_object *obj,
  435. __user void *metadata,
  436. u32 metadata_size)
  437. {
  438. struct msm_gem_object *msm_obj = to_msm_bo(obj);
  439. void *new_metadata;
  440. void *buf;
  441. int ret;
  442. /* Impose a moderate upper bound on metadata size: */
  443. if (metadata_size > 128) {
  444. return -EOVERFLOW;
  445. }
  446. /* Use a temporary buf to keep copy_from_user() outside of gem obj lock: */
  447. buf = memdup_user(metadata, metadata_size);
  448. if (IS_ERR(buf))
  449. return PTR_ERR(buf);
  450. ret = msm_gem_lock_interruptible(obj);
  451. if (ret)
  452. goto out;
  453. new_metadata =
  454. krealloc(msm_obj->metadata, metadata_size, GFP_KERNEL);
  455. if (!new_metadata) {
  456. ret = -ENOMEM;
  457. goto out;
  458. }
  459. msm_obj->metadata = new_metadata;
  460. msm_obj->metadata_size = metadata_size;
  461. memcpy(msm_obj->metadata, buf, metadata_size);
  462. msm_gem_unlock(obj);
  463. out:
  464. kfree(buf);
  465. return ret;
  466. }
  467. static int msm_ioctl_gem_info_get_metadata(struct drm_gem_object *obj,
  468. __user void *metadata,
  469. u32 *metadata_size)
  470. {
  471. struct msm_gem_object *msm_obj = to_msm_bo(obj);
  472. void *buf;
  473. int ret, len;
  474. if (!metadata) {
  475. /*
  476. * Querying the size is inherently racey, but
  477. * EXT_external_objects expects the app to confirm
  478. * via device and driver UUIDs that the exporter and
  479. * importer versions match. All we can do from the
  480. * kernel side is check the length under obj lock
  481. * when userspace tries to retrieve the metadata
  482. */
  483. *metadata_size = msm_obj->metadata_size;
  484. return 0;
  485. }
  486. ret = msm_gem_lock_interruptible(obj);
  487. if (ret)
  488. return ret;
  489. /* Avoid copy_to_user() under gem obj lock: */
  490. len = msm_obj->metadata_size;
  491. buf = kmemdup(msm_obj->metadata, len, GFP_KERNEL);
  492. msm_gem_unlock(obj);
  493. if (*metadata_size < len) {
  494. ret = -ETOOSMALL;
  495. } else if (copy_to_user(metadata, buf, len)) {
  496. ret = -EFAULT;
  497. } else {
  498. *metadata_size = len;
  499. }
  500. kfree(buf);
  501. return 0;
  502. }
  503. static int msm_ioctl_gem_info(struct drm_device *dev, void *data,
  504. struct drm_file *file)
  505. {
  506. struct drm_msm_gem_info *args = data;
  507. struct drm_gem_object *obj;
  508. struct msm_gem_object *msm_obj;
  509. int i, ret = 0;
  510. if (args->pad)
  511. return -EINVAL;
  512. switch (args->info) {
  513. case MSM_INFO_GET_OFFSET:
  514. case MSM_INFO_GET_IOVA:
  515. case MSM_INFO_SET_IOVA:
  516. case MSM_INFO_GET_FLAGS:
  517. /* value returned as immediate, not pointer, so len==0: */
  518. if (args->len)
  519. return -EINVAL;
  520. break;
  521. case MSM_INFO_SET_NAME:
  522. case MSM_INFO_GET_NAME:
  523. case MSM_INFO_SET_METADATA:
  524. case MSM_INFO_GET_METADATA:
  525. break;
  526. default:
  527. return -EINVAL;
  528. }
  529. obj = drm_gem_object_lookup(file, args->handle);
  530. if (!obj)
  531. return -ENOENT;
  532. msm_obj = to_msm_bo(obj);
  533. switch (args->info) {
  534. case MSM_INFO_GET_OFFSET:
  535. args->value = msm_gem_mmap_offset(obj);
  536. break;
  537. case MSM_INFO_GET_IOVA:
  538. ret = msm_ioctl_gem_info_iova(dev, file, obj, &args->value);
  539. break;
  540. case MSM_INFO_SET_IOVA:
  541. ret = msm_ioctl_gem_info_set_iova(dev, file, obj, args->value);
  542. break;
  543. case MSM_INFO_GET_FLAGS:
  544. if (obj->import_attach) {
  545. ret = -EINVAL;
  546. break;
  547. }
  548. /* Hide internal kernel-only flags: */
  549. args->value = to_msm_bo(obj)->flags & MSM_BO_FLAGS;
  550. ret = 0;
  551. break;
  552. case MSM_INFO_SET_NAME:
  553. /* length check should leave room for terminating null: */
  554. if (args->len >= sizeof(msm_obj->name)) {
  555. ret = -EINVAL;
  556. break;
  557. }
  558. if (copy_from_user(msm_obj->name, u64_to_user_ptr(args->value),
  559. args->len)) {
  560. msm_obj->name[0] = '\0';
  561. ret = -EFAULT;
  562. break;
  563. }
  564. msm_obj->name[args->len] = '\0';
  565. for (i = 0; i < args->len; i++) {
  566. if (!isprint(msm_obj->name[i])) {
  567. msm_obj->name[i] = '\0';
  568. break;
  569. }
  570. }
  571. break;
  572. case MSM_INFO_GET_NAME:
  573. if (args->value && (args->len < strlen(msm_obj->name))) {
  574. ret = -ETOOSMALL;
  575. break;
  576. }
  577. args->len = strlen(msm_obj->name);
  578. if (args->value) {
  579. if (copy_to_user(u64_to_user_ptr(args->value),
  580. msm_obj->name, args->len))
  581. ret = -EFAULT;
  582. }
  583. break;
  584. case MSM_INFO_SET_METADATA:
  585. ret = msm_ioctl_gem_info_set_metadata(
  586. obj, u64_to_user_ptr(args->value), args->len);
  587. break;
  588. case MSM_INFO_GET_METADATA:
  589. ret = msm_ioctl_gem_info_get_metadata(
  590. obj, u64_to_user_ptr(args->value), &args->len);
  591. break;
  592. }
  593. drm_gem_object_put(obj);
  594. return ret;
  595. }
  596. static int wait_fence(struct msm_gpu_submitqueue *queue, uint32_t fence_id,
  597. ktime_t timeout, uint32_t flags)
  598. {
  599. struct dma_fence *fence;
  600. int ret;
  601. if (fence_after(fence_id, queue->last_fence)) {
  602. DRM_ERROR_RATELIMITED("waiting on invalid fence: %u (of %u)\n",
  603. fence_id, queue->last_fence);
  604. return -EINVAL;
  605. }
  606. /*
  607. * Map submitqueue scoped "seqno" (which is actually an idr key)
  608. * back to underlying dma-fence
  609. *
  610. * The fence is removed from the fence_idr when the submit is
  611. * retired, so if the fence is not found it means there is nothing
  612. * to wait for
  613. */
  614. spin_lock(&queue->idr_lock);
  615. fence = idr_find(&queue->fence_idr, fence_id);
  616. if (fence)
  617. fence = dma_fence_get_rcu(fence);
  618. spin_unlock(&queue->idr_lock);
  619. if (!fence)
  620. return 0;
  621. if (flags & MSM_WAIT_FENCE_BOOST)
  622. dma_fence_set_deadline(fence, ktime_get());
  623. ret = dma_fence_wait_timeout(fence, true, timeout_to_jiffies(&timeout));
  624. if (ret == 0) {
  625. ret = -ETIMEDOUT;
  626. } else if (ret != -ERESTARTSYS) {
  627. ret = 0;
  628. }
  629. dma_fence_put(fence);
  630. return ret;
  631. }
  632. static int msm_ioctl_wait_fence(struct drm_device *dev, void *data,
  633. struct drm_file *file)
  634. {
  635. struct msm_drm_private *priv = dev->dev_private;
  636. struct drm_msm_wait_fence *args = data;
  637. struct msm_gpu_submitqueue *queue;
  638. int ret;
  639. if (args->flags & ~MSM_WAIT_FENCE_FLAGS) {
  640. DRM_ERROR("invalid flags: %08x\n", args->flags);
  641. return -EINVAL;
  642. }
  643. if (!priv->gpu)
  644. return 0;
  645. queue = msm_submitqueue_get(file->driver_priv, args->queueid);
  646. if (!queue)
  647. return -ENOENT;
  648. ret = wait_fence(queue, args->fence, to_ktime(args->timeout), args->flags);
  649. msm_submitqueue_put(queue);
  650. return ret;
  651. }
  652. static int msm_ioctl_gem_madvise(struct drm_device *dev, void *data,
  653. struct drm_file *file)
  654. {
  655. struct drm_msm_gem_madvise *args = data;
  656. struct drm_gem_object *obj;
  657. int ret;
  658. switch (args->madv) {
  659. case MSM_MADV_DONTNEED:
  660. case MSM_MADV_WILLNEED:
  661. break;
  662. default:
  663. return -EINVAL;
  664. }
  665. obj = drm_gem_object_lookup(file, args->handle);
  666. if (!obj) {
  667. return -ENOENT;
  668. }
  669. ret = msm_gem_madvise(obj, args->madv);
  670. if (ret >= 0) {
  671. args->retained = ret;
  672. ret = 0;
  673. }
  674. drm_gem_object_put(obj);
  675. return ret;
  676. }
  677. static int msm_ioctl_submitqueue_new(struct drm_device *dev, void *data,
  678. struct drm_file *file)
  679. {
  680. struct drm_msm_submitqueue *args = data;
  681. if (args->flags & ~MSM_SUBMITQUEUE_FLAGS)
  682. return -EINVAL;
  683. return msm_submitqueue_create(dev, file->driver_priv, args->prio,
  684. args->flags, &args->id);
  685. }
  686. static int msm_ioctl_submitqueue_query(struct drm_device *dev, void *data,
  687. struct drm_file *file)
  688. {
  689. return msm_submitqueue_query(dev, file->driver_priv, data);
  690. }
  691. static int msm_ioctl_submitqueue_close(struct drm_device *dev, void *data,
  692. struct drm_file *file)
  693. {
  694. u32 id = *(u32 *) data;
  695. return msm_submitqueue_remove(file->driver_priv, id);
  696. }
  697. static const struct drm_ioctl_desc msm_ioctls[] = {
  698. DRM_IOCTL_DEF_DRV(MSM_GET_PARAM, msm_ioctl_get_param, DRM_RENDER_ALLOW),
  699. DRM_IOCTL_DEF_DRV(MSM_SET_PARAM, msm_ioctl_set_param, DRM_RENDER_ALLOW),
  700. DRM_IOCTL_DEF_DRV(MSM_GEM_NEW, msm_ioctl_gem_new, DRM_RENDER_ALLOW),
  701. DRM_IOCTL_DEF_DRV(MSM_GEM_INFO, msm_ioctl_gem_info, DRM_RENDER_ALLOW),
  702. DRM_IOCTL_DEF_DRV(MSM_GEM_CPU_PREP, msm_ioctl_gem_cpu_prep, DRM_RENDER_ALLOW),
  703. DRM_IOCTL_DEF_DRV(MSM_GEM_CPU_FINI, msm_ioctl_gem_cpu_fini, DRM_RENDER_ALLOW),
  704. DRM_IOCTL_DEF_DRV(MSM_GEM_SUBMIT, msm_ioctl_gem_submit, DRM_RENDER_ALLOW),
  705. DRM_IOCTL_DEF_DRV(MSM_WAIT_FENCE, msm_ioctl_wait_fence, DRM_RENDER_ALLOW),
  706. DRM_IOCTL_DEF_DRV(MSM_GEM_MADVISE, msm_ioctl_gem_madvise, DRM_RENDER_ALLOW),
  707. DRM_IOCTL_DEF_DRV(MSM_SUBMITQUEUE_NEW, msm_ioctl_submitqueue_new, DRM_RENDER_ALLOW),
  708. DRM_IOCTL_DEF_DRV(MSM_SUBMITQUEUE_CLOSE, msm_ioctl_submitqueue_close, DRM_RENDER_ALLOW),
  709. DRM_IOCTL_DEF_DRV(MSM_SUBMITQUEUE_QUERY, msm_ioctl_submitqueue_query, DRM_RENDER_ALLOW),
  710. };
  711. static void msm_show_fdinfo(struct drm_printer *p, struct drm_file *file)
  712. {
  713. struct drm_device *dev = file->minor->dev;
  714. struct msm_drm_private *priv = dev->dev_private;
  715. if (!priv->gpu)
  716. return;
  717. msm_gpu_show_fdinfo(priv->gpu, file->driver_priv, p);
  718. drm_show_memory_stats(p, file);
  719. }
  720. static const struct file_operations fops = {
  721. .owner = THIS_MODULE,
  722. DRM_GEM_FOPS,
  723. .show_fdinfo = drm_show_fdinfo,
  724. };
  725. static const struct drm_driver msm_driver = {
  726. .driver_features = DRIVER_GEM |
  727. DRIVER_RENDER |
  728. DRIVER_ATOMIC |
  729. DRIVER_MODESET |
  730. DRIVER_SYNCOBJ,
  731. .open = msm_open,
  732. .postclose = msm_postclose,
  733. .dumb_create = msm_gem_dumb_create,
  734. .dumb_map_offset = msm_gem_dumb_map_offset,
  735. .gem_prime_import_sg_table = msm_gem_prime_import_sg_table,
  736. #ifdef CONFIG_DEBUG_FS
  737. .debugfs_init = msm_debugfs_init,
  738. #endif
  739. .show_fdinfo = msm_show_fdinfo,
  740. .ioctls = msm_ioctls,
  741. .num_ioctls = ARRAY_SIZE(msm_ioctls),
  742. .fops = &fops,
  743. .name = "msm",
  744. .desc = "MSM Snapdragon DRM",
  745. .date = "20130625",
  746. .major = MSM_VERSION_MAJOR,
  747. .minor = MSM_VERSION_MINOR,
  748. .patchlevel = MSM_VERSION_PATCHLEVEL,
  749. };
  750. /*
  751. * Componentized driver support:
  752. */
  753. /*
  754. * Identify what components need to be added by parsing what remote-endpoints
  755. * our MDP output ports are connected to. In the case of LVDS on MDP4, there
  756. * is no external component that we need to add since LVDS is within MDP4
  757. * itself.
  758. */
  759. static int add_components_mdp(struct device *master_dev,
  760. struct component_match **matchptr)
  761. {
  762. struct device_node *np = master_dev->of_node;
  763. struct device_node *ep_node;
  764. for_each_endpoint_of_node(np, ep_node) {
  765. struct device_node *intf;
  766. struct of_endpoint ep;
  767. int ret;
  768. ret = of_graph_parse_endpoint(ep_node, &ep);
  769. if (ret) {
  770. DRM_DEV_ERROR(master_dev, "unable to parse port endpoint\n");
  771. of_node_put(ep_node);
  772. return ret;
  773. }
  774. /*
  775. * The LCDC/LVDS port on MDP4 is a speacial case where the
  776. * remote-endpoint isn't a component that we need to add
  777. */
  778. if (of_device_is_compatible(np, "qcom,mdp4") &&
  779. ep.port == 0)
  780. continue;
  781. /*
  782. * It's okay if some of the ports don't have a remote endpoint
  783. * specified. It just means that the port isn't connected to
  784. * any external interface.
  785. */
  786. intf = of_graph_get_remote_port_parent(ep_node);
  787. if (!intf)
  788. continue;
  789. if (of_device_is_available(intf))
  790. drm_of_component_match_add(master_dev, matchptr,
  791. component_compare_of, intf);
  792. of_node_put(intf);
  793. }
  794. return 0;
  795. }
  796. #if !IS_REACHABLE(CONFIG_DRM_MSM_MDP5) || !IS_REACHABLE(CONFIG_DRM_MSM_DPU)
  797. bool msm_disp_drv_should_bind(struct device *dev, bool dpu_driver)
  798. {
  799. /* If just a single driver is enabled, use it no matter what */
  800. return true;
  801. }
  802. #else
  803. static bool prefer_mdp5 = true;
  804. MODULE_PARM_DESC(prefer_mdp5, "Select whether MDP5 or DPU driver should be preferred");
  805. module_param(prefer_mdp5, bool, 0444);
  806. /* list all platforms supported by both mdp5 and dpu drivers */
  807. static const char *const msm_mdp5_dpu_migration[] = {
  808. "qcom,sdm630-mdp5",
  809. "qcom,sdm660-mdp5",
  810. NULL,
  811. };
  812. bool msm_disp_drv_should_bind(struct device *dev, bool dpu_driver)
  813. {
  814. /* If it is not an MDP5 device, do not try MDP5 driver */
  815. if (!of_device_is_compatible(dev->of_node, "qcom,mdp5"))
  816. return dpu_driver;
  817. /* If it is not in the migration list, use MDP5 */
  818. if (!of_device_compatible_match(dev->of_node, msm_mdp5_dpu_migration))
  819. return !dpu_driver;
  820. return prefer_mdp5 ? !dpu_driver : dpu_driver;
  821. }
  822. #endif
  823. /*
  824. * We don't know what's the best binding to link the gpu with the drm device.
  825. * Fow now, we just hunt for all the possible gpus that we support, and add them
  826. * as components.
  827. */
  828. static const struct of_device_id msm_gpu_match[] = {
  829. { .compatible = "qcom,adreno" },
  830. { .compatible = "qcom,adreno-3xx" },
  831. { .compatible = "amd,imageon" },
  832. { .compatible = "qcom,kgsl-3d0" },
  833. { },
  834. };
  835. static int add_gpu_components(struct device *dev,
  836. struct component_match **matchptr)
  837. {
  838. struct device_node *np;
  839. np = of_find_matching_node(NULL, msm_gpu_match);
  840. if (!np)
  841. return 0;
  842. if (of_device_is_available(np))
  843. drm_of_component_match_add(dev, matchptr, component_compare_of, np);
  844. of_node_put(np);
  845. return 0;
  846. }
  847. static int msm_drm_bind(struct device *dev)
  848. {
  849. return msm_drm_init(dev, &msm_driver);
  850. }
  851. static void msm_drm_unbind(struct device *dev)
  852. {
  853. msm_drm_uninit(dev);
  854. }
  855. const struct component_master_ops msm_drm_ops = {
  856. .bind = msm_drm_bind,
  857. .unbind = msm_drm_unbind,
  858. };
  859. int msm_drv_probe(struct device *master_dev,
  860. int (*kms_init)(struct drm_device *dev),
  861. struct msm_kms *kms)
  862. {
  863. struct msm_drm_private *priv;
  864. struct component_match *match = NULL;
  865. int ret;
  866. priv = devm_kzalloc(master_dev, sizeof(*priv), GFP_KERNEL);
  867. if (!priv)
  868. return -ENOMEM;
  869. priv->kms = kms;
  870. priv->kms_init = kms_init;
  871. dev_set_drvdata(master_dev, priv);
  872. /* Add mdp components if we have KMS. */
  873. if (kms_init) {
  874. ret = add_components_mdp(master_dev, &match);
  875. if (ret)
  876. return ret;
  877. }
  878. ret = add_gpu_components(master_dev, &match);
  879. if (ret)
  880. return ret;
  881. /* on all devices that I am aware of, iommu's which can map
  882. * any address the cpu can see are used:
  883. */
  884. ret = dma_set_mask_and_coherent(master_dev, ~0);
  885. if (ret)
  886. return ret;
  887. ret = component_master_add_with_match(master_dev, &msm_drm_ops, match);
  888. if (ret)
  889. return ret;
  890. return 0;
  891. }
  892. /*
  893. * Platform driver:
  894. * Used only for headlesss GPU instances
  895. */
  896. static int msm_pdev_probe(struct platform_device *pdev)
  897. {
  898. return msm_drv_probe(&pdev->dev, NULL, NULL);
  899. }
  900. static void msm_pdev_remove(struct platform_device *pdev)
  901. {
  902. component_master_del(&pdev->dev, &msm_drm_ops);
  903. }
  904. static struct platform_driver msm_platform_driver = {
  905. .probe = msm_pdev_probe,
  906. .remove_new = msm_pdev_remove,
  907. .driver = {
  908. .name = "msm",
  909. },
  910. };
  911. static int __init msm_drm_register(void)
  912. {
  913. if (!modeset)
  914. return -EINVAL;
  915. DBG("init");
  916. msm_mdp_register();
  917. msm_dpu_register();
  918. msm_dsi_register();
  919. msm_hdmi_register();
  920. msm_dp_register();
  921. adreno_register();
  922. msm_mdp4_register();
  923. msm_mdss_register();
  924. return platform_driver_register(&msm_platform_driver);
  925. }
  926. static void __exit msm_drm_unregister(void)
  927. {
  928. DBG("fini");
  929. platform_driver_unregister(&msm_platform_driver);
  930. msm_mdss_unregister();
  931. msm_mdp4_unregister();
  932. msm_dp_unregister();
  933. msm_hdmi_unregister();
  934. adreno_unregister();
  935. msm_dsi_unregister();
  936. msm_mdp_unregister();
  937. msm_dpu_unregister();
  938. }
  939. module_init(msm_drm_register);
  940. module_exit(msm_drm_unregister);
  941. MODULE_AUTHOR("Rob Clark <robdclark@gmail.com");
  942. MODULE_DESCRIPTION("MSM DRM Driver");
  943. MODULE_LICENSE("GPL");