Merge tag 'driver-core-5.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / drivers / gpu / drm / msm / msm_drv.c
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
8 #include <linux/dma-mapping.h>
9 #include <linux/kthread.h>
10 #include <linux/sched/mm.h>
11 #include <linux/uaccess.h>
12 #include <uapi/linux/sched/types.h>
13
14 #include <drm/drm_drv.h>
15 #include <drm/drm_file.h>
16 #include <drm/drm_ioctl.h>
17 #include <drm/drm_irq.h>
18 #include <drm/drm_prime.h>
19 #include <drm/drm_of.h>
20 #include <drm/drm_vblank.h>
21
22 #include "disp/msm_disp_snapshot.h"
23 #include "msm_drv.h"
24 #include "msm_debugfs.h"
25 #include "msm_fence.h"
26 #include "msm_gem.h"
27 #include "msm_gpu.h"
28 #include "msm_kms.h"
29 #include "adreno/adreno_gpu.h"
30
31 /*
32  * MSM driver version:
33  * - 1.0.0 - initial interface
34  * - 1.1.0 - adds madvise, and support for submits with > 4 cmd buffers
35  * - 1.2.0 - adds explicit fence support for submit ioctl
36  * - 1.3.0 - adds GMEM_BASE + NR_RINGS params, SUBMITQUEUE_NEW +
37  *           SUBMITQUEUE_CLOSE ioctls, and MSM_INFO_IOVA flag for
38  *           MSM_GEM_INFO ioctl.
39  * - 1.4.0 - softpin, MSM_RELOC_BO_DUMP, and GEM_INFO support to set/get
40  *           GEM object's debug name
41  * - 1.5.0 - Add SUBMITQUERY_QUERY ioctl
42  * - 1.6.0 - Syncobj support
43  * - 1.7.0 - Add MSM_PARAM_SUSPENDS to access suspend count
44  * - 1.8.0 - Add MSM_BO_CACHED_COHERENT for supported GPUs (a6xx)
45  */
46 #define MSM_VERSION_MAJOR       1
47 #define MSM_VERSION_MINOR       8
48 #define MSM_VERSION_PATCHLEVEL  0
49
50 static const struct drm_mode_config_funcs mode_config_funcs = {
51         .fb_create = msm_framebuffer_create,
52         .output_poll_changed = drm_fb_helper_output_poll_changed,
53         .atomic_check = drm_atomic_helper_check,
54         .atomic_commit = drm_atomic_helper_commit,
55 };
56
57 static const struct drm_mode_config_helper_funcs mode_config_helper_funcs = {
58         .atomic_commit_tail = msm_atomic_commit_tail,
59 };
60
61 #ifdef CONFIG_DRM_MSM_REGISTER_LOGGING
62 static bool reglog = false;
63 MODULE_PARM_DESC(reglog, "Enable register read/write logging");
64 module_param(reglog, bool, 0600);
65 #else
66 #define reglog 0
67 #endif
68
69 #ifdef CONFIG_DRM_FBDEV_EMULATION
70 static bool fbdev = true;
71 MODULE_PARM_DESC(fbdev, "Enable fbdev compat layer");
72 module_param(fbdev, bool, 0600);
73 #endif
74
75 static char *vram = "16m";
76 MODULE_PARM_DESC(vram, "Configure VRAM size (for devices without IOMMU/GPUMMU)");
77 module_param(vram, charp, 0);
78
79 bool dumpstate = false;
80 MODULE_PARM_DESC(dumpstate, "Dump KMS state on errors");
81 module_param(dumpstate, bool, 0600);
82
83 static bool modeset = true;
84 MODULE_PARM_DESC(modeset, "Use kernel modesetting [KMS] (1=on (default), 0=disable)");
85 module_param(modeset, bool, 0600);
86
87 /*
88  * Util/helpers:
89  */
90
91 struct clk *msm_clk_bulk_get_clock(struct clk_bulk_data *bulk, int count,
92                 const char *name)
93 {
94         int i;
95         char n[32];
96
97         snprintf(n, sizeof(n), "%s_clk", name);
98
99         for (i = 0; bulk && i < count; i++) {
100                 if (!strcmp(bulk[i].id, name) || !strcmp(bulk[i].id, n))
101                         return bulk[i].clk;
102         }
103
104
105         return NULL;
106 }
107
108 struct clk *msm_clk_get(struct platform_device *pdev, const char *name)
109 {
110         struct clk *clk;
111         char name2[32];
112
113         clk = devm_clk_get(&pdev->dev, name);
114         if (!IS_ERR(clk) || PTR_ERR(clk) == -EPROBE_DEFER)
115                 return clk;
116
117         snprintf(name2, sizeof(name2), "%s_clk", name);
118
119         clk = devm_clk_get(&pdev->dev, name2);
120         if (!IS_ERR(clk))
121                 dev_warn(&pdev->dev, "Using legacy clk name binding.  Use "
122                                 "\"%s\" instead of \"%s\"\n", name, name2);
123
124         return clk;
125 }
126
127 static void __iomem *_msm_ioremap(struct platform_device *pdev, const char *name,
128                                   const char *dbgname, bool quiet, phys_addr_t *psize)
129 {
130         struct resource *res;
131         unsigned long size;
132         void __iomem *ptr;
133
134         if (name)
135                 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, name);
136         else
137                 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
138
139         if (!res) {
140                 if (!quiet)
141                         DRM_DEV_ERROR(&pdev->dev, "failed to get memory resource: %s\n", name);
142                 return ERR_PTR(-EINVAL);
143         }
144
145         size = resource_size(res);
146
147         ptr = devm_ioremap(&pdev->dev, res->start, size);
148         if (!ptr) {
149                 if (!quiet)
150                         DRM_DEV_ERROR(&pdev->dev, "failed to ioremap: %s\n", name);
151                 return ERR_PTR(-ENOMEM);
152         }
153
154         if (reglog)
155                 printk(KERN_DEBUG "IO:region %s %p %08lx\n", dbgname, ptr, size);
156
157         if (psize)
158                 *psize = size;
159
160         return ptr;
161 }
162
163 void __iomem *msm_ioremap(struct platform_device *pdev, const char *name,
164                           const char *dbgname)
165 {
166         return _msm_ioremap(pdev, name, dbgname, false, NULL);
167 }
168
169 void __iomem *msm_ioremap_quiet(struct platform_device *pdev, const char *name,
170                                 const char *dbgname)
171 {
172         return _msm_ioremap(pdev, name, dbgname, true, NULL);
173 }
174
175 void __iomem *msm_ioremap_size(struct platform_device *pdev, const char *name,
176                           const char *dbgname, phys_addr_t *psize)
177 {
178         return _msm_ioremap(pdev, name, dbgname, false, psize);
179 }
180
181 void msm_writel(u32 data, void __iomem *addr)
182 {
183         if (reglog)
184                 printk(KERN_DEBUG "IO:W %p %08x\n", addr, data);
185         writel(data, addr);
186 }
187
188 u32 msm_readl(const void __iomem *addr)
189 {
190         u32 val = readl(addr);
191         if (reglog)
192                 pr_err("IO:R %p %08x\n", addr, val);
193         return val;
194 }
195
196 void msm_rmw(void __iomem *addr, u32 mask, u32 or)
197 {
198         u32 val = msm_readl(addr);
199
200         val &= ~mask;
201         msm_writel(val | or, addr);
202 }
203
204 struct msm_vblank_work {
205         struct work_struct work;
206         int crtc_id;
207         bool enable;
208         struct msm_drm_private *priv;
209 };
210
211 static void vblank_ctrl_worker(struct work_struct *work)
212 {
213         struct msm_vblank_work *vbl_work = container_of(work,
214                                                 struct msm_vblank_work, work);
215         struct msm_drm_private *priv = vbl_work->priv;
216         struct msm_kms *kms = priv->kms;
217
218         if (vbl_work->enable)
219                 kms->funcs->enable_vblank(kms, priv->crtcs[vbl_work->crtc_id]);
220         else
221                 kms->funcs->disable_vblank(kms, priv->crtcs[vbl_work->crtc_id]);
222
223         kfree(vbl_work);
224 }
225
226 static int vblank_ctrl_queue_work(struct msm_drm_private *priv,
227                                         int crtc_id, bool enable)
228 {
229         struct msm_vblank_work *vbl_work;
230
231         vbl_work = kzalloc(sizeof(*vbl_work), GFP_ATOMIC);
232         if (!vbl_work)
233                 return -ENOMEM;
234
235         INIT_WORK(&vbl_work->work, vblank_ctrl_worker);
236
237         vbl_work->crtc_id = crtc_id;
238         vbl_work->enable = enable;
239         vbl_work->priv = priv;
240
241         queue_work(priv->wq, &vbl_work->work);
242
243         return 0;
244 }
245
246 static int msm_drm_uninit(struct device *dev)
247 {
248         struct platform_device *pdev = to_platform_device(dev);
249         struct drm_device *ddev = platform_get_drvdata(pdev);
250         struct msm_drm_private *priv = ddev->dev_private;
251         struct msm_kms *kms = priv->kms;
252         struct msm_mdss *mdss = priv->mdss;
253         int i;
254
255         /*
256          * Shutdown the hw if we're far enough along where things might be on.
257          * If we run this too early, we'll end up panicking in any variety of
258          * places. Since we don't register the drm device until late in
259          * msm_drm_init, drm_dev->registered is used as an indicator that the
260          * shutdown will be successful.
261          */
262         if (ddev->registered) {
263                 drm_dev_unregister(ddev);
264                 drm_atomic_helper_shutdown(ddev);
265         }
266
267         /* We must cancel and cleanup any pending vblank enable/disable
268          * work before drm_irq_uninstall() to avoid work re-enabling an
269          * irq after uninstall has disabled it.
270          */
271
272         flush_workqueue(priv->wq);
273
274         /* clean up event worker threads */
275         for (i = 0; i < priv->num_crtcs; i++) {
276                 if (priv->event_thread[i].worker)
277                         kthread_destroy_worker(priv->event_thread[i].worker);
278         }
279
280         msm_gem_shrinker_cleanup(ddev);
281
282         drm_kms_helper_poll_fini(ddev);
283
284         msm_perf_debugfs_cleanup(priv);
285         msm_rd_debugfs_cleanup(priv);
286
287 #ifdef CONFIG_DRM_FBDEV_EMULATION
288         if (fbdev && priv->fbdev)
289                 msm_fbdev_free(ddev);
290 #endif
291
292         msm_disp_snapshot_destroy(ddev);
293
294         drm_mode_config_cleanup(ddev);
295
296         pm_runtime_get_sync(dev);
297         drm_irq_uninstall(ddev);
298         pm_runtime_put_sync(dev);
299
300         if (kms && kms->funcs)
301                 kms->funcs->destroy(kms);
302
303         if (priv->vram.paddr) {
304                 unsigned long attrs = DMA_ATTR_NO_KERNEL_MAPPING;
305                 drm_mm_takedown(&priv->vram.mm);
306                 dma_free_attrs(dev, priv->vram.size, NULL,
307                                priv->vram.paddr, attrs);
308         }
309
310         component_unbind_all(dev, ddev);
311
312         if (mdss && mdss->funcs)
313                 mdss->funcs->destroy(ddev);
314
315         ddev->dev_private = NULL;
316         drm_dev_put(ddev);
317
318         destroy_workqueue(priv->wq);
319         kfree(priv);
320
321         return 0;
322 }
323
324 #define KMS_MDP4 4
325 #define KMS_MDP5 5
326 #define KMS_DPU  3
327
328 static int get_mdp_ver(struct platform_device *pdev)
329 {
330         struct device *dev = &pdev->dev;
331
332         return (int) (unsigned long) of_device_get_match_data(dev);
333 }
334
335 #include <linux/of_address.h>
336
337 bool msm_use_mmu(struct drm_device *dev)
338 {
339         struct msm_drm_private *priv = dev->dev_private;
340
341         /* a2xx comes with its own MMU */
342         return priv->is_a2xx || iommu_present(&platform_bus_type);
343 }
344
345 static int msm_init_vram(struct drm_device *dev)
346 {
347         struct msm_drm_private *priv = dev->dev_private;
348         struct device_node *node;
349         unsigned long size = 0;
350         int ret = 0;
351
352         /* In the device-tree world, we could have a 'memory-region'
353          * phandle, which gives us a link to our "vram".  Allocating
354          * is all nicely abstracted behind the dma api, but we need
355          * to know the entire size to allocate it all in one go. There
356          * are two cases:
357          *  1) device with no IOMMU, in which case we need exclusive
358          *     access to a VRAM carveout big enough for all gpu
359          *     buffers
360          *  2) device with IOMMU, but where the bootloader puts up
361          *     a splash screen.  In this case, the VRAM carveout
362          *     need only be large enough for fbdev fb.  But we need
363          *     exclusive access to the buffer to avoid the kernel
364          *     using those pages for other purposes (which appears
365          *     as corruption on screen before we have a chance to
366          *     load and do initial modeset)
367          */
368
369         node = of_parse_phandle(dev->dev->of_node, "memory-region", 0);
370         if (node) {
371                 struct resource r;
372                 ret = of_address_to_resource(node, 0, &r);
373                 of_node_put(node);
374                 if (ret)
375                         return ret;
376                 size = r.end - r.start;
377                 DRM_INFO("using VRAM carveout: %lx@%pa\n", size, &r.start);
378
379                 /* if we have no IOMMU, then we need to use carveout allocator.
380                  * Grab the entire CMA chunk carved out in early startup in
381                  * mach-msm:
382                  */
383         } else if (!msm_use_mmu(dev)) {
384                 DRM_INFO("using %s VRAM carveout\n", vram);
385                 size = memparse(vram, NULL);
386         }
387
388         if (size) {
389                 unsigned long attrs = 0;
390                 void *p;
391
392                 priv->vram.size = size;
393
394                 drm_mm_init(&priv->vram.mm, 0, (size >> PAGE_SHIFT) - 1);
395                 spin_lock_init(&priv->vram.lock);
396
397                 attrs |= DMA_ATTR_NO_KERNEL_MAPPING;
398                 attrs |= DMA_ATTR_WRITE_COMBINE;
399
400                 /* note that for no-kernel-mapping, the vaddr returned
401                  * is bogus, but non-null if allocation succeeded:
402                  */
403                 p = dma_alloc_attrs(dev->dev, size,
404                                 &priv->vram.paddr, GFP_KERNEL, attrs);
405                 if (!p) {
406                         DRM_DEV_ERROR(dev->dev, "failed to allocate VRAM\n");
407                         priv->vram.paddr = 0;
408                         return -ENOMEM;
409                 }
410
411                 DRM_DEV_INFO(dev->dev, "VRAM: %08x->%08x\n",
412                                 (uint32_t)priv->vram.paddr,
413                                 (uint32_t)(priv->vram.paddr + size));
414         }
415
416         return ret;
417 }
418
419 static int msm_drm_init(struct device *dev, const struct drm_driver *drv)
420 {
421         struct platform_device *pdev = to_platform_device(dev);
422         struct drm_device *ddev;
423         struct msm_drm_private *priv;
424         struct msm_kms *kms;
425         struct msm_mdss *mdss;
426         int ret, i;
427
428         ddev = drm_dev_alloc(drv, dev);
429         if (IS_ERR(ddev)) {
430                 DRM_DEV_ERROR(dev, "failed to allocate drm_device\n");
431                 return PTR_ERR(ddev);
432         }
433
434         platform_set_drvdata(pdev, ddev);
435
436         priv = kzalloc(sizeof(*priv), GFP_KERNEL);
437         if (!priv) {
438                 ret = -ENOMEM;
439                 goto err_put_drm_dev;
440         }
441
442         ddev->dev_private = priv;
443         priv->dev = ddev;
444
445         switch (get_mdp_ver(pdev)) {
446         case KMS_MDP5:
447                 ret = mdp5_mdss_init(ddev);
448                 break;
449         case KMS_DPU:
450                 ret = dpu_mdss_init(ddev);
451                 break;
452         default:
453                 ret = 0;
454                 break;
455         }
456         if (ret)
457                 goto err_free_priv;
458
459         mdss = priv->mdss;
460
461         priv->wq = alloc_ordered_workqueue("msm", 0);
462         priv->hangcheck_period = DRM_MSM_HANGCHECK_DEFAULT_PERIOD;
463
464         INIT_LIST_HEAD(&priv->objects);
465         mutex_init(&priv->obj_lock);
466
467         INIT_LIST_HEAD(&priv->inactive_willneed);
468         INIT_LIST_HEAD(&priv->inactive_dontneed);
469         INIT_LIST_HEAD(&priv->inactive_unpinned);
470         mutex_init(&priv->mm_lock);
471
472         /* Teach lockdep about lock ordering wrt. shrinker: */
473         fs_reclaim_acquire(GFP_KERNEL);
474         might_lock(&priv->mm_lock);
475         fs_reclaim_release(GFP_KERNEL);
476
477         drm_mode_config_init(ddev);
478
479         ret = msm_init_vram(ddev);
480         if (ret)
481                 goto err_destroy_mdss;
482
483         /* Bind all our sub-components: */
484         ret = component_bind_all(dev, ddev);
485         if (ret)
486                 goto err_destroy_mdss;
487
488         dma_set_max_seg_size(dev, UINT_MAX);
489
490         msm_gem_shrinker_init(ddev);
491
492         switch (get_mdp_ver(pdev)) {
493         case KMS_MDP4:
494                 kms = mdp4_kms_init(ddev);
495                 priv->kms = kms;
496                 break;
497         case KMS_MDP5:
498                 kms = mdp5_kms_init(ddev);
499                 break;
500         case KMS_DPU:
501                 kms = dpu_kms_init(ddev);
502                 priv->kms = kms;
503                 break;
504         default:
505                 /* valid only for the dummy headless case, where of_node=NULL */
506                 WARN_ON(dev->of_node);
507                 kms = NULL;
508                 break;
509         }
510
511         if (IS_ERR(kms)) {
512                 DRM_DEV_ERROR(dev, "failed to load kms\n");
513                 ret = PTR_ERR(kms);
514                 priv->kms = NULL;
515                 goto err_msm_uninit;
516         }
517
518         /* Enable normalization of plane zpos */
519         ddev->mode_config.normalize_zpos = true;
520
521         if (kms) {
522                 kms->dev = ddev;
523                 ret = kms->funcs->hw_init(kms);
524                 if (ret) {
525                         DRM_DEV_ERROR(dev, "kms hw init failed: %d\n", ret);
526                         goto err_msm_uninit;
527                 }
528         }
529
530         ddev->mode_config.funcs = &mode_config_funcs;
531         ddev->mode_config.helper_private = &mode_config_helper_funcs;
532
533         for (i = 0; i < priv->num_crtcs; i++) {
534                 /* initialize event thread */
535                 priv->event_thread[i].crtc_id = priv->crtcs[i]->base.id;
536                 priv->event_thread[i].dev = ddev;
537                 priv->event_thread[i].worker = kthread_create_worker(0,
538                         "crtc_event:%d", priv->event_thread[i].crtc_id);
539                 if (IS_ERR(priv->event_thread[i].worker)) {
540                         ret = PTR_ERR(priv->event_thread[i].worker);
541                         DRM_DEV_ERROR(dev, "failed to create crtc_event kthread\n");
542                         goto err_msm_uninit;
543                 }
544
545                 sched_set_fifo(priv->event_thread[i].worker->task);
546         }
547
548         ret = drm_vblank_init(ddev, priv->num_crtcs);
549         if (ret < 0) {
550                 DRM_DEV_ERROR(dev, "failed to initialize vblank\n");
551                 goto err_msm_uninit;
552         }
553
554         if (kms) {
555                 pm_runtime_get_sync(dev);
556                 ret = drm_irq_install(ddev, kms->irq);
557                 pm_runtime_put_sync(dev);
558                 if (ret < 0) {
559                         DRM_DEV_ERROR(dev, "failed to install IRQ handler\n");
560                         goto err_msm_uninit;
561                 }
562         }
563
564         ret = drm_dev_register(ddev, 0);
565         if (ret)
566                 goto err_msm_uninit;
567
568         ret = msm_disp_snapshot_init(ddev);
569         if (ret)
570                 DRM_DEV_ERROR(dev, "msm_disp_snapshot_init failed ret = %d\n", ret);
571
572         drm_mode_config_reset(ddev);
573
574 #ifdef CONFIG_DRM_FBDEV_EMULATION
575         if (kms && fbdev)
576                 priv->fbdev = msm_fbdev_init(ddev);
577 #endif
578
579         ret = msm_debugfs_late_init(ddev);
580         if (ret)
581                 goto err_msm_uninit;
582
583         drm_kms_helper_poll_init(ddev);
584
585         return 0;
586
587 err_msm_uninit:
588         msm_drm_uninit(dev);
589         return ret;
590 err_destroy_mdss:
591         if (mdss && mdss->funcs)
592                 mdss->funcs->destroy(ddev);
593 err_free_priv:
594         kfree(priv);
595 err_put_drm_dev:
596         drm_dev_put(ddev);
597         platform_set_drvdata(pdev, NULL);
598         return ret;
599 }
600
601 /*
602  * DRM operations:
603  */
604
605 static void load_gpu(struct drm_device *dev)
606 {
607         static DEFINE_MUTEX(init_lock);
608         struct msm_drm_private *priv = dev->dev_private;
609
610         mutex_lock(&init_lock);
611
612         if (!priv->gpu)
613                 priv->gpu = adreno_load_gpu(dev);
614
615         mutex_unlock(&init_lock);
616 }
617
618 static int context_init(struct drm_device *dev, struct drm_file *file)
619 {
620         struct msm_drm_private *priv = dev->dev_private;
621         struct msm_file_private *ctx;
622
623         ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
624         if (!ctx)
625                 return -ENOMEM;
626
627         kref_init(&ctx->ref);
628         msm_submitqueue_init(dev, ctx);
629
630         ctx->aspace = msm_gpu_create_private_address_space(priv->gpu, current);
631         file->driver_priv = ctx;
632
633         return 0;
634 }
635
636 static int msm_open(struct drm_device *dev, struct drm_file *file)
637 {
638         /* For now, load gpu on open.. to avoid the requirement of having
639          * firmware in the initrd.
640          */
641         load_gpu(dev);
642
643         return context_init(dev, file);
644 }
645
646 static void context_close(struct msm_file_private *ctx)
647 {
648         msm_submitqueue_close(ctx);
649         msm_file_private_put(ctx);
650 }
651
652 static void msm_postclose(struct drm_device *dev, struct drm_file *file)
653 {
654         struct msm_drm_private *priv = dev->dev_private;
655         struct msm_file_private *ctx = file->driver_priv;
656
657         mutex_lock(&dev->struct_mutex);
658         if (ctx == priv->lastctx)
659                 priv->lastctx = NULL;
660         mutex_unlock(&dev->struct_mutex);
661
662         context_close(ctx);
663 }
664
665 static irqreturn_t msm_irq(int irq, void *arg)
666 {
667         struct drm_device *dev = arg;
668         struct msm_drm_private *priv = dev->dev_private;
669         struct msm_kms *kms = priv->kms;
670         BUG_ON(!kms);
671         return kms->funcs->irq(kms);
672 }
673
674 static void msm_irq_preinstall(struct drm_device *dev)
675 {
676         struct msm_drm_private *priv = dev->dev_private;
677         struct msm_kms *kms = priv->kms;
678         BUG_ON(!kms);
679         kms->funcs->irq_preinstall(kms);
680 }
681
682 static int msm_irq_postinstall(struct drm_device *dev)
683 {
684         struct msm_drm_private *priv = dev->dev_private;
685         struct msm_kms *kms = priv->kms;
686         BUG_ON(!kms);
687
688         if (kms->funcs->irq_postinstall)
689                 return kms->funcs->irq_postinstall(kms);
690
691         return 0;
692 }
693
694 static void msm_irq_uninstall(struct drm_device *dev)
695 {
696         struct msm_drm_private *priv = dev->dev_private;
697         struct msm_kms *kms = priv->kms;
698         BUG_ON(!kms);
699         kms->funcs->irq_uninstall(kms);
700 }
701
702 int msm_crtc_enable_vblank(struct drm_crtc *crtc)
703 {
704         struct drm_device *dev = crtc->dev;
705         unsigned int pipe = crtc->index;
706         struct msm_drm_private *priv = dev->dev_private;
707         struct msm_kms *kms = priv->kms;
708         if (!kms)
709                 return -ENXIO;
710         drm_dbg_vbl(dev, "crtc=%u", pipe);
711         return vblank_ctrl_queue_work(priv, pipe, true);
712 }
713
714 void msm_crtc_disable_vblank(struct drm_crtc *crtc)
715 {
716         struct drm_device *dev = crtc->dev;
717         unsigned int pipe = crtc->index;
718         struct msm_drm_private *priv = dev->dev_private;
719         struct msm_kms *kms = priv->kms;
720         if (!kms)
721                 return;
722         drm_dbg_vbl(dev, "crtc=%u", pipe);
723         vblank_ctrl_queue_work(priv, pipe, false);
724 }
725
726 /*
727  * DRM ioctls:
728  */
729
730 static int msm_ioctl_get_param(struct drm_device *dev, void *data,
731                 struct drm_file *file)
732 {
733         struct msm_drm_private *priv = dev->dev_private;
734         struct drm_msm_param *args = data;
735         struct msm_gpu *gpu;
736
737         /* for now, we just have 3d pipe.. eventually this would need to
738          * be more clever to dispatch to appropriate gpu module:
739          */
740         if (args->pipe != MSM_PIPE_3D0)
741                 return -EINVAL;
742
743         gpu = priv->gpu;
744
745         if (!gpu)
746                 return -ENXIO;
747
748         return gpu->funcs->get_param(gpu, args->param, &args->value);
749 }
750
751 static int msm_ioctl_gem_new(struct drm_device *dev, void *data,
752                 struct drm_file *file)
753 {
754         struct drm_msm_gem_new *args = data;
755
756         if (args->flags & ~MSM_BO_FLAGS) {
757                 DRM_ERROR("invalid flags: %08x\n", args->flags);
758                 return -EINVAL;
759         }
760
761         return msm_gem_new_handle(dev, file, args->size,
762                         args->flags, &args->handle, NULL);
763 }
764
765 static inline ktime_t to_ktime(struct drm_msm_timespec timeout)
766 {
767         return ktime_set(timeout.tv_sec, timeout.tv_nsec);
768 }
769
770 static int msm_ioctl_gem_cpu_prep(struct drm_device *dev, void *data,
771                 struct drm_file *file)
772 {
773         struct drm_msm_gem_cpu_prep *args = data;
774         struct drm_gem_object *obj;
775         ktime_t timeout = to_ktime(args->timeout);
776         int ret;
777
778         if (args->op & ~MSM_PREP_FLAGS) {
779                 DRM_ERROR("invalid op: %08x\n", args->op);
780                 return -EINVAL;
781         }
782
783         obj = drm_gem_object_lookup(file, args->handle);
784         if (!obj)
785                 return -ENOENT;
786
787         ret = msm_gem_cpu_prep(obj, args->op, &timeout);
788
789         drm_gem_object_put(obj);
790
791         return ret;
792 }
793
794 static int msm_ioctl_gem_cpu_fini(struct drm_device *dev, void *data,
795                 struct drm_file *file)
796 {
797         struct drm_msm_gem_cpu_fini *args = data;
798         struct drm_gem_object *obj;
799         int ret;
800
801         obj = drm_gem_object_lookup(file, args->handle);
802         if (!obj)
803                 return -ENOENT;
804
805         ret = msm_gem_cpu_fini(obj);
806
807         drm_gem_object_put(obj);
808
809         return ret;
810 }
811
812 static int msm_ioctl_gem_info_iova(struct drm_device *dev,
813                 struct drm_file *file, struct drm_gem_object *obj,
814                 uint64_t *iova)
815 {
816         struct msm_drm_private *priv = dev->dev_private;
817         struct msm_file_private *ctx = file->driver_priv;
818
819         if (!priv->gpu)
820                 return -EINVAL;
821
822         /*
823          * Don't pin the memory here - just get an address so that userspace can
824          * be productive
825          */
826         return msm_gem_get_iova(obj, ctx->aspace, iova);
827 }
828
829 static int msm_ioctl_gem_info(struct drm_device *dev, void *data,
830                 struct drm_file *file)
831 {
832         struct drm_msm_gem_info *args = data;
833         struct drm_gem_object *obj;
834         struct msm_gem_object *msm_obj;
835         int i, ret = 0;
836
837         if (args->pad)
838                 return -EINVAL;
839
840         switch (args->info) {
841         case MSM_INFO_GET_OFFSET:
842         case MSM_INFO_GET_IOVA:
843                 /* value returned as immediate, not pointer, so len==0: */
844                 if (args->len)
845                         return -EINVAL;
846                 break;
847         case MSM_INFO_SET_NAME:
848         case MSM_INFO_GET_NAME:
849                 break;
850         default:
851                 return -EINVAL;
852         }
853
854         obj = drm_gem_object_lookup(file, args->handle);
855         if (!obj)
856                 return -ENOENT;
857
858         msm_obj = to_msm_bo(obj);
859
860         switch (args->info) {
861         case MSM_INFO_GET_OFFSET:
862                 args->value = msm_gem_mmap_offset(obj);
863                 break;
864         case MSM_INFO_GET_IOVA:
865                 ret = msm_ioctl_gem_info_iova(dev, file, obj, &args->value);
866                 break;
867         case MSM_INFO_SET_NAME:
868                 /* length check should leave room for terminating null: */
869                 if (args->len >= sizeof(msm_obj->name)) {
870                         ret = -EINVAL;
871                         break;
872                 }
873                 if (copy_from_user(msm_obj->name, u64_to_user_ptr(args->value),
874                                    args->len)) {
875                         msm_obj->name[0] = '\0';
876                         ret = -EFAULT;
877                         break;
878                 }
879                 msm_obj->name[args->len] = '\0';
880                 for (i = 0; i < args->len; i++) {
881                         if (!isprint(msm_obj->name[i])) {
882                                 msm_obj->name[i] = '\0';
883                                 break;
884                         }
885                 }
886                 break;
887         case MSM_INFO_GET_NAME:
888                 if (args->value && (args->len < strlen(msm_obj->name))) {
889                         ret = -EINVAL;
890                         break;
891                 }
892                 args->len = strlen(msm_obj->name);
893                 if (args->value) {
894                         if (copy_to_user(u64_to_user_ptr(args->value),
895                                          msm_obj->name, args->len))
896                                 ret = -EFAULT;
897                 }
898                 break;
899         }
900
901         drm_gem_object_put(obj);
902
903         return ret;
904 }
905
906 static int msm_ioctl_wait_fence(struct drm_device *dev, void *data,
907                 struct drm_file *file)
908 {
909         struct msm_drm_private *priv = dev->dev_private;
910         struct drm_msm_wait_fence *args = data;
911         ktime_t timeout = to_ktime(args->timeout);
912         struct msm_gpu_submitqueue *queue;
913         struct msm_gpu *gpu = priv->gpu;
914         int ret;
915
916         if (args->pad) {
917                 DRM_ERROR("invalid pad: %08x\n", args->pad);
918                 return -EINVAL;
919         }
920
921         if (!gpu)
922                 return 0;
923
924         queue = msm_submitqueue_get(file->driver_priv, args->queueid);
925         if (!queue)
926                 return -ENOENT;
927
928         ret = msm_wait_fence(gpu->rb[queue->prio]->fctx, args->fence, &timeout,
929                 true);
930
931         msm_submitqueue_put(queue);
932         return ret;
933 }
934
935 static int msm_ioctl_gem_madvise(struct drm_device *dev, void *data,
936                 struct drm_file *file)
937 {
938         struct drm_msm_gem_madvise *args = data;
939         struct drm_gem_object *obj;
940         int ret;
941
942         switch (args->madv) {
943         case MSM_MADV_DONTNEED:
944         case MSM_MADV_WILLNEED:
945                 break;
946         default:
947                 return -EINVAL;
948         }
949
950         obj = drm_gem_object_lookup(file, args->handle);
951         if (!obj) {
952                 return -ENOENT;
953         }
954
955         ret = msm_gem_madvise(obj, args->madv);
956         if (ret >= 0) {
957                 args->retained = ret;
958                 ret = 0;
959         }
960
961         drm_gem_object_put(obj);
962
963         return ret;
964 }
965
966
967 static int msm_ioctl_submitqueue_new(struct drm_device *dev, void *data,
968                 struct drm_file *file)
969 {
970         struct drm_msm_submitqueue *args = data;
971
972         if (args->flags & ~MSM_SUBMITQUEUE_FLAGS)
973                 return -EINVAL;
974
975         return msm_submitqueue_create(dev, file->driver_priv, args->prio,
976                 args->flags, &args->id);
977 }
978
979 static int msm_ioctl_submitqueue_query(struct drm_device *dev, void *data,
980                 struct drm_file *file)
981 {
982         return msm_submitqueue_query(dev, file->driver_priv, data);
983 }
984
985 static int msm_ioctl_submitqueue_close(struct drm_device *dev, void *data,
986                 struct drm_file *file)
987 {
988         u32 id = *(u32 *) data;
989
990         return msm_submitqueue_remove(file->driver_priv, id);
991 }
992
993 static const struct drm_ioctl_desc msm_ioctls[] = {
994         DRM_IOCTL_DEF_DRV(MSM_GET_PARAM,    msm_ioctl_get_param,    DRM_RENDER_ALLOW),
995         DRM_IOCTL_DEF_DRV(MSM_GEM_NEW,      msm_ioctl_gem_new,      DRM_RENDER_ALLOW),
996         DRM_IOCTL_DEF_DRV(MSM_GEM_INFO,     msm_ioctl_gem_info,     DRM_RENDER_ALLOW),
997         DRM_IOCTL_DEF_DRV(MSM_GEM_CPU_PREP, msm_ioctl_gem_cpu_prep, DRM_RENDER_ALLOW),
998         DRM_IOCTL_DEF_DRV(MSM_GEM_CPU_FINI, msm_ioctl_gem_cpu_fini, DRM_RENDER_ALLOW),
999         DRM_IOCTL_DEF_DRV(MSM_GEM_SUBMIT,   msm_ioctl_gem_submit,   DRM_RENDER_ALLOW),
1000         DRM_IOCTL_DEF_DRV(MSM_WAIT_FENCE,   msm_ioctl_wait_fence,   DRM_RENDER_ALLOW),
1001         DRM_IOCTL_DEF_DRV(MSM_GEM_MADVISE,  msm_ioctl_gem_madvise,  DRM_RENDER_ALLOW),
1002         DRM_IOCTL_DEF_DRV(MSM_SUBMITQUEUE_NEW,   msm_ioctl_submitqueue_new,   DRM_RENDER_ALLOW),
1003         DRM_IOCTL_DEF_DRV(MSM_SUBMITQUEUE_CLOSE, msm_ioctl_submitqueue_close, DRM_RENDER_ALLOW),
1004         DRM_IOCTL_DEF_DRV(MSM_SUBMITQUEUE_QUERY, msm_ioctl_submitqueue_query, DRM_RENDER_ALLOW),
1005 };
1006
1007 static const struct file_operations fops = {
1008         .owner              = THIS_MODULE,
1009         .open               = drm_open,
1010         .release            = drm_release,
1011         .unlocked_ioctl     = drm_ioctl,
1012         .compat_ioctl       = drm_compat_ioctl,
1013         .poll               = drm_poll,
1014         .read               = drm_read,
1015         .llseek             = no_llseek,
1016         .mmap               = msm_gem_mmap,
1017 };
1018
1019 static const struct drm_driver msm_driver = {
1020         .driver_features    = DRIVER_GEM |
1021                                 DRIVER_RENDER |
1022                                 DRIVER_ATOMIC |
1023                                 DRIVER_MODESET |
1024                                 DRIVER_SYNCOBJ,
1025         .open               = msm_open,
1026         .postclose           = msm_postclose,
1027         .lastclose          = drm_fb_helper_lastclose,
1028         .irq_handler        = msm_irq,
1029         .irq_preinstall     = msm_irq_preinstall,
1030         .irq_postinstall    = msm_irq_postinstall,
1031         .irq_uninstall      = msm_irq_uninstall,
1032         .dumb_create        = msm_gem_dumb_create,
1033         .dumb_map_offset    = msm_gem_dumb_map_offset,
1034         .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
1035         .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
1036         .gem_prime_import_sg_table = msm_gem_prime_import_sg_table,
1037         .gem_prime_mmap     = msm_gem_prime_mmap,
1038 #ifdef CONFIG_DEBUG_FS
1039         .debugfs_init       = msm_debugfs_init,
1040 #endif
1041         .ioctls             = msm_ioctls,
1042         .num_ioctls         = ARRAY_SIZE(msm_ioctls),
1043         .fops               = &fops,
1044         .name               = "msm",
1045         .desc               = "MSM Snapdragon DRM",
1046         .date               = "20130625",
1047         .major              = MSM_VERSION_MAJOR,
1048         .minor              = MSM_VERSION_MINOR,
1049         .patchlevel         = MSM_VERSION_PATCHLEVEL,
1050 };
1051
1052 static int __maybe_unused msm_runtime_suspend(struct device *dev)
1053 {
1054         struct drm_device *ddev = dev_get_drvdata(dev);
1055         struct msm_drm_private *priv = ddev->dev_private;
1056         struct msm_mdss *mdss = priv->mdss;
1057
1058         DBG("");
1059
1060         if (mdss && mdss->funcs)
1061                 return mdss->funcs->disable(mdss);
1062
1063         return 0;
1064 }
1065
1066 static int __maybe_unused msm_runtime_resume(struct device *dev)
1067 {
1068         struct drm_device *ddev = dev_get_drvdata(dev);
1069         struct msm_drm_private *priv = ddev->dev_private;
1070         struct msm_mdss *mdss = priv->mdss;
1071
1072         DBG("");
1073
1074         if (mdss && mdss->funcs)
1075                 return mdss->funcs->enable(mdss);
1076
1077         return 0;
1078 }
1079
1080 static int __maybe_unused msm_pm_suspend(struct device *dev)
1081 {
1082
1083         if (pm_runtime_suspended(dev))
1084                 return 0;
1085
1086         return msm_runtime_suspend(dev);
1087 }
1088
1089 static int __maybe_unused msm_pm_resume(struct device *dev)
1090 {
1091         if (pm_runtime_suspended(dev))
1092                 return 0;
1093
1094         return msm_runtime_resume(dev);
1095 }
1096
1097 static int __maybe_unused msm_pm_prepare(struct device *dev)
1098 {
1099         struct drm_device *ddev = dev_get_drvdata(dev);
1100         struct msm_drm_private *priv = ddev ? ddev->dev_private : NULL;
1101
1102         if (!priv || !priv->kms)
1103                 return 0;
1104
1105         return drm_mode_config_helper_suspend(ddev);
1106 }
1107
1108 static void __maybe_unused msm_pm_complete(struct device *dev)
1109 {
1110         struct drm_device *ddev = dev_get_drvdata(dev);
1111         struct msm_drm_private *priv = ddev ? ddev->dev_private : NULL;
1112
1113         if (!priv || !priv->kms)
1114                 return;
1115
1116         drm_mode_config_helper_resume(ddev);
1117 }
1118
1119 static const struct dev_pm_ops msm_pm_ops = {
1120         SET_SYSTEM_SLEEP_PM_OPS(msm_pm_suspend, msm_pm_resume)
1121         SET_RUNTIME_PM_OPS(msm_runtime_suspend, msm_runtime_resume, NULL)
1122         .prepare = msm_pm_prepare,
1123         .complete = msm_pm_complete,
1124 };
1125
1126 /*
1127  * Componentized driver support:
1128  */
1129
1130 /*
1131  * NOTE: duplication of the same code as exynos or imx (or probably any other).
1132  * so probably some room for some helpers
1133  */
1134 static int compare_of(struct device *dev, void *data)
1135 {
1136         return dev->of_node == data;
1137 }
1138
1139 /*
1140  * Identify what components need to be added by parsing what remote-endpoints
1141  * our MDP output ports are connected to. In the case of LVDS on MDP4, there
1142  * is no external component that we need to add since LVDS is within MDP4
1143  * itself.
1144  */
1145 static int add_components_mdp(struct device *mdp_dev,
1146                               struct component_match **matchptr)
1147 {
1148         struct device_node *np = mdp_dev->of_node;
1149         struct device_node *ep_node;
1150         struct device *master_dev;
1151
1152         /*
1153          * on MDP4 based platforms, the MDP platform device is the component
1154          * master that adds other display interface components to itself.
1155          *
1156          * on MDP5 based platforms, the MDSS platform device is the component
1157          * master that adds MDP5 and other display interface components to
1158          * itself.
1159          */
1160         if (of_device_is_compatible(np, "qcom,mdp4"))
1161                 master_dev = mdp_dev;
1162         else
1163                 master_dev = mdp_dev->parent;
1164
1165         for_each_endpoint_of_node(np, ep_node) {
1166                 struct device_node *intf;
1167                 struct of_endpoint ep;
1168                 int ret;
1169
1170                 ret = of_graph_parse_endpoint(ep_node, &ep);
1171                 if (ret) {
1172                         DRM_DEV_ERROR(mdp_dev, "unable to parse port endpoint\n");
1173                         of_node_put(ep_node);
1174                         return ret;
1175                 }
1176
1177                 /*
1178                  * The LCDC/LVDS port on MDP4 is a speacial case where the
1179                  * remote-endpoint isn't a component that we need to add
1180                  */
1181                 if (of_device_is_compatible(np, "qcom,mdp4") &&
1182                     ep.port == 0)
1183                         continue;
1184
1185                 /*
1186                  * It's okay if some of the ports don't have a remote endpoint
1187                  * specified. It just means that the port isn't connected to
1188                  * any external interface.
1189                  */
1190                 intf = of_graph_get_remote_port_parent(ep_node);
1191                 if (!intf)
1192                         continue;
1193
1194                 if (of_device_is_available(intf))
1195                         drm_of_component_match_add(master_dev, matchptr,
1196                                                    compare_of, intf);
1197
1198                 of_node_put(intf);
1199         }
1200
1201         return 0;
1202 }
1203
1204 static int compare_name_mdp(struct device *dev, void *data)
1205 {
1206         return (strstr(dev_name(dev), "mdp") != NULL);
1207 }
1208
1209 static int add_display_components(struct platform_device *pdev,
1210                                   struct component_match **matchptr)
1211 {
1212         struct device *mdp_dev;
1213         struct device *dev = &pdev->dev;
1214         int ret;
1215
1216         /*
1217          * MDP5/DPU based devices don't have a flat hierarchy. There is a top
1218          * level parent: MDSS, and children: MDP5/DPU, DSI, HDMI, eDP etc.
1219          * Populate the children devices, find the MDP5/DPU node, and then add
1220          * the interfaces to our components list.
1221          */
1222         switch (get_mdp_ver(pdev)) {
1223         case KMS_MDP5:
1224         case KMS_DPU:
1225                 ret = of_platform_populate(dev->of_node, NULL, NULL, dev);
1226                 if (ret) {
1227                         DRM_DEV_ERROR(dev, "failed to populate children devices\n");
1228                         return ret;
1229                 }
1230
1231                 mdp_dev = device_find_child(dev, NULL, compare_name_mdp);
1232                 if (!mdp_dev) {
1233                         DRM_DEV_ERROR(dev, "failed to find MDSS MDP node\n");
1234                         of_platform_depopulate(dev);
1235                         return -ENODEV;
1236                 }
1237
1238                 put_device(mdp_dev);
1239
1240                 /* add the MDP component itself */
1241                 drm_of_component_match_add(dev, matchptr, compare_of,
1242                                            mdp_dev->of_node);
1243                 break;
1244         case KMS_MDP4:
1245                 /* MDP4 */
1246                 mdp_dev = dev;
1247                 break;
1248         }
1249
1250         ret = add_components_mdp(mdp_dev, matchptr);
1251         if (ret)
1252                 of_platform_depopulate(dev);
1253
1254         return ret;
1255 }
1256
1257 /*
1258  * We don't know what's the best binding to link the gpu with the drm device.
1259  * Fow now, we just hunt for all the possible gpus that we support, and add them
1260  * as components.
1261  */
1262 static const struct of_device_id msm_gpu_match[] = {
1263         { .compatible = "qcom,adreno" },
1264         { .compatible = "qcom,adreno-3xx" },
1265         { .compatible = "amd,imageon" },
1266         { .compatible = "qcom,kgsl-3d0" },
1267         { },
1268 };
1269
1270 static int add_gpu_components(struct device *dev,
1271                               struct component_match **matchptr)
1272 {
1273         struct device_node *np;
1274
1275         np = of_find_matching_node(NULL, msm_gpu_match);
1276         if (!np)
1277                 return 0;
1278
1279         if (of_device_is_available(np))
1280                 drm_of_component_match_add(dev, matchptr, compare_of, np);
1281
1282         of_node_put(np);
1283
1284         return 0;
1285 }
1286
1287 static int msm_drm_bind(struct device *dev)
1288 {
1289         return msm_drm_init(dev, &msm_driver);
1290 }
1291
1292 static void msm_drm_unbind(struct device *dev)
1293 {
1294         msm_drm_uninit(dev);
1295 }
1296
1297 static const struct component_master_ops msm_drm_ops = {
1298         .bind = msm_drm_bind,
1299         .unbind = msm_drm_unbind,
1300 };
1301
1302 /*
1303  * Platform driver:
1304  */
1305
1306 static int msm_pdev_probe(struct platform_device *pdev)
1307 {
1308         struct component_match *match = NULL;
1309         int ret;
1310
1311         if (get_mdp_ver(pdev)) {
1312                 ret = add_display_components(pdev, &match);
1313                 if (ret)
1314                         return ret;
1315         }
1316
1317         ret = add_gpu_components(&pdev->dev, &match);
1318         if (ret)
1319                 goto fail;
1320
1321         /* on all devices that I am aware of, iommu's which can map
1322          * any address the cpu can see are used:
1323          */
1324         ret = dma_set_mask_and_coherent(&pdev->dev, ~0);
1325         if (ret)
1326                 goto fail;
1327
1328         ret = component_master_add_with_match(&pdev->dev, &msm_drm_ops, match);
1329         if (ret)
1330                 goto fail;
1331
1332         return 0;
1333
1334 fail:
1335         of_platform_depopulate(&pdev->dev);
1336         return ret;
1337 }
1338
1339 static int msm_pdev_remove(struct platform_device *pdev)
1340 {
1341         component_master_del(&pdev->dev, &msm_drm_ops);
1342         of_platform_depopulate(&pdev->dev);
1343
1344         return 0;
1345 }
1346
1347 static void msm_pdev_shutdown(struct platform_device *pdev)
1348 {
1349         struct drm_device *drm = platform_get_drvdata(pdev);
1350         struct msm_drm_private *priv = drm ? drm->dev_private : NULL;
1351
1352         if (!priv || !priv->kms)
1353                 return;
1354
1355         drm_atomic_helper_shutdown(drm);
1356 }
1357
1358 static const struct of_device_id dt_match[] = {
1359         { .compatible = "qcom,mdp4", .data = (void *)KMS_MDP4 },
1360         { .compatible = "qcom,mdss", .data = (void *)KMS_MDP5 },
1361         { .compatible = "qcom,sdm845-mdss", .data = (void *)KMS_DPU },
1362         { .compatible = "qcom,sc7180-mdss", .data = (void *)KMS_DPU },
1363         { .compatible = "qcom,sc7280-mdss", .data = (void *)KMS_DPU },
1364         { .compatible = "qcom,sm8150-mdss", .data = (void *)KMS_DPU },
1365         { .compatible = "qcom,sm8250-mdss", .data = (void *)KMS_DPU },
1366         {}
1367 };
1368 MODULE_DEVICE_TABLE(of, dt_match);
1369
1370 static struct platform_driver msm_platform_driver = {
1371         .probe      = msm_pdev_probe,
1372         .remove     = msm_pdev_remove,
1373         .shutdown   = msm_pdev_shutdown,
1374         .driver     = {
1375                 .name   = "msm",
1376                 .of_match_table = dt_match,
1377                 .pm     = &msm_pm_ops,
1378         },
1379 };
1380
1381 static int __init msm_drm_register(void)
1382 {
1383         if (!modeset)
1384                 return -EINVAL;
1385
1386         DBG("init");
1387         msm_mdp_register();
1388         msm_dpu_register();
1389         msm_dsi_register();
1390         msm_edp_register();
1391         msm_hdmi_register();
1392         msm_dp_register();
1393         adreno_register();
1394         return platform_driver_register(&msm_platform_driver);
1395 }
1396
1397 static void __exit msm_drm_unregister(void)
1398 {
1399         DBG("fini");
1400         platform_driver_unregister(&msm_platform_driver);
1401         msm_dp_unregister();
1402         msm_hdmi_unregister();
1403         adreno_unregister();
1404         msm_edp_unregister();
1405         msm_dsi_unregister();
1406         msm_mdp_unregister();
1407         msm_dpu_unregister();
1408 }
1409
1410 module_init(msm_drm_register);
1411 module_exit(msm_drm_unregister);
1412
1413 MODULE_AUTHOR("Rob Clark <robdclark@gmail.com");
1414 MODULE_DESCRIPTION("MSM DRM Driver");
1415 MODULE_LICENSE("GPL");