2 * Copyright (c) 2014 Spreadtrum Communications, Inc.
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
18 #include <drm/sprd_drm.h>
20 #include <linux/of_irq.h>
23 #include "sprd_drm_drv.h"
24 #include "sprd_drm_gem.h"
25 #ifdef CONFIG_DRM_SPRD_DMABUF
26 #include "sprd_drm_dmabuf.h"
28 #include "sprd_drm_irq.h"
29 #include "sprd_drm_ipp.h"
31 #include <video/ion_sprd.h>
33 #include <soc/sprd/cpuidle.h>
35 #define DRIVER_NAME "sprd"
36 #define DRIVER_DESC "SPRD SoC DRM"
37 #define DRIVER_DATE "2014"
38 #define DRIVER_MAJOR 1
39 #define DRIVER_MINOR 0
41 #define VBLANK_OFF_DELAY 500
43 struct sprd_drm_gem_info_data {
44 struct drm_file *filp;
48 static int sprd_drm_gem_one_info(int id, void *ptr, void *data)
50 struct drm_gem_object *obj = (struct drm_gem_object *)ptr;
51 struct sprd_drm_gem_info_data *gem_info_data = data;
52 struct drm_sprd_file_private *file_priv =
53 gem_info_data->filp->driver_priv;
54 struct sprd_drm_gem_obj *sprd_gem;
55 struct sprd_drm_gem_buf *buf;
58 DRM_ERROR("failed to get drm_gem_object\n");
62 drm_gem_object_reference(obj);
64 sprd_gem = to_sprd_gem_obj(obj);
65 buf = sprd_gem->buffer;
67 seq_printf(gem_info_data->m,
68 "%5d\t%5d\t%4d\t%4d\t\t%4d\t0x%08lx\t0x%x\t%4d\t%4d\t\t"
73 atomic_read(&obj->refcount.refcount) - 1,
79 obj->import_attach ? 1 : 0,
83 drm_gem_object_unreference(obj);
88 static int sprd_drm_gem_info(struct seq_file *m, void *data)
90 struct drm_info_node *node = (struct drm_info_node *)m->private;
91 struct drm_device *drm_dev = node->minor->dev;
92 struct sprd_drm_gem_info_data gem_info_data;
95 seq_puts(gem_info_data.m,
96 "pid\ttgid\thandle\trefcount\thcount\tsize\t\tflags\t"
97 "pfnmap\texport_to_fd\timport_from_fd\tobj_addr\t"
99 mutex_lock(&drm_dev->struct_mutex);
101 list_for_each_entry(gem_info_data.filp, &drm_dev->filelist, lhead) {
102 spin_lock(&gem_info_data.filp->table_lock);
103 idr_for_each(&gem_info_data.filp->object_idr,
104 sprd_drm_gem_one_info, &gem_info_data);
105 spin_unlock(&gem_info_data.filp->table_lock);
108 mutex_unlock(&drm_dev->struct_mutex);
113 static struct drm_info_list sprd_drm_debugfs_list[] = {
114 {"gem_info", sprd_drm_gem_info, DRIVER_GEM},
116 #define SPRD_DRM_DEBUGFS_ENTRIES ARRAY_SIZE(sprd_drm_debugfs_list)
118 static struct notifier_block sprd_drm_cpu_idle_notifier = {
119 .notifier_call = sprd_drm_cpuidle_notify,
122 static DEVICE_ATTR(vblank_freq, S_IRUGO | S_IWUSR, sprd_drm_vblank_freq_show,
123 sprd_drm_vblank_freq_store);
125 static struct attribute *sprd_drm_vblank_freq_attrs[] = {
126 &dev_attr_vblank_freq.attr,
130 struct attribute_group sprd_drm_vblank_freq_attrs_group = {
131 .attrs = sprd_drm_vblank_freq_attrs,
134 static int sprd_drm_load(struct drm_device *dev, unsigned long flags)
136 struct sprd_drm_private *private;
137 struct platform_device *pdev;
139 struct resource *res;
141 struct drm_minor *minor;
142 #ifdef CONFIG_DRM_DPMS_IOCTL
143 struct sprd_drm_dpms_work *dpms_work;
147 minor = dev->primary;
149 DRM_DEBUG_DRIVER("%s\n", __FILE__);
151 pdev = dev->driver->kdriver.platform_device;
153 DRM_ERROR("failed to get platform device.\n");
157 private = devm_kzalloc(&pdev->dev, sizeof(*private), GFP_KERNEL);
159 DRM_ERROR("failed to alloc dev private data.\n");
163 INIT_LIST_HEAD(&private->pageflip_event_list);
164 dev->dev_private = (void *)private;
166 private->sprd_drm_ion_client = sprd_ion_client_create("drm");
167 if (!private->sprd_drm_ion_client) {
168 DRM_ERROR("Unable to create ION client\n");
173 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "sprdfb");
175 DRM_ERROR("failed to get DISPC base address\n");
179 private->reg_size = resource_size(res);
180 private->regs = devm_ioremap(&pdev->dev, res->start,
182 if (unlikely(!private->regs)) {
183 DRM_ERROR("failed to map DISPC base\n");
187 private->irq = platform_get_irq_byname(pdev, "sprd_drm_irq");
189 private->irq = platform_get_irq(pdev, 1);
191 if (private->irq <= 0)
192 DRM_ERROR("interrupt not registered\n");
194 private->drm_dev = dev;
196 private->nb_ctrl.notifier_call = sprd_drm_notifier_ctrl;
197 if (sprdfb_nb_register(&private->nb_ctrl))
198 pr_err("could not register sprd_fb notify callback\n");
200 /* init workqueue for fake vsync */
201 INIT_WORK(&private->fake_vbl_work,
202 sprd_drm_fake_vblank_handler);
203 private->fake_vbl_hz = VBLANK_DEF_HZ;
204 private->vbl_itv_us = (unsigned long int)(VBLANK_INTERVAL(VBLANK_DEF_HZ));
205 ret = sysfs_create_group(&dev->dev->kobj, &sprd_drm_vblank_freq_attrs_group);
207 pr_err("sysfs group creation failed, ret = %d\n", ret);
209 drm_mode_config_init(dev);
210 ret = drm_vblank_init(dev, MAX_CRTC);
215 * probe sub drivers such as display controller and hdmi driver,
216 * that were registered at probe() of platform driver
217 * to the sub driver and create encoder and connector for them.
219 ret = sprd_drm_device_register(dev);
223 dev->vblank_disable_allowed = 1;
224 drm_vblank_offdelay = VBLANK_OFF_DELAY;
225 minor = dev->primary;
226 ret = drm_debugfs_create_files(sprd_drm_debugfs_list,
227 SPRD_DRM_DEBUGFS_ENTRIES,
228 minor->debugfs_root, minor);
230 DRM_DEBUG_DRIVER("failed to create sprd-drm debugfs.\n");
232 #ifdef CONFIG_DRM_DPMS_IOCTL
233 dpms_work = kzalloc(sizeof(*dpms_work), GFP_KERNEL);
235 DRM_ERROR("failed to alloc dpms_work.\n");
239 dpms_work->private = private;
240 private->dpms_work = dpms_work;
241 INIT_WORK((struct work_struct *)private->dpms_work,
242 sprd_drm_dpms_work_ops);
244 init_completion(&private->dpms_comp);
245 mutex_init(&private->dpms_lock);
248 if (register_sc_cpuidle_notifier(&sprd_drm_cpu_idle_notifier))
249 DRM_ERROR("failed to setup light sleep notifier\n");
253 #ifdef CONFIG_DRM_DPMS_IOCTL
255 sprd_drm_device_unregister(dev);
258 drm_vblank_cleanup(dev);
260 drm_mode_config_cleanup(dev);
266 static int sprd_drm_unload(struct drm_device *dev)
268 struct sprd_drm_private *private =
269 (struct sprd_drm_private *)dev->dev_private;
271 DRM_DEBUG_DRIVER("%s\n", __FILE__);
273 if (unregister_sc_cpuidle_notifier(&sprd_drm_cpu_idle_notifier))
274 DRM_ERROR("failed to unset light sleep notifier\n");
276 #ifdef CONFIG_DRM_DPMS_IOCTL
277 kfree(private->dpms_work);
280 sprdfb_nb_unregister(&private->nb_ctrl);
282 #ifdef CONFIG_DRM_SPRD_KMS
283 sprd_drm_fbdev_fini(dev);
285 sprd_drm_device_unregister(dev);
286 drm_vblank_cleanup(dev);
287 #ifdef CONFIG_DRM_SPRD_KMS
288 drm_kms_helper_poll_fini(dev);
290 drm_mode_config_cleanup(dev);
295 drm_debugfs_remove_files(sprd_drm_debugfs_list,
296 SPRD_DRM_DEBUGFS_ENTRIES, dev->primary);
301 static int sprd_drm_open(struct drm_device *dev, struct drm_file *file)
303 struct drm_sprd_file_private *file_priv;
305 DRM_DEBUG_DRIVER("%s\n", __FILE__);
307 file_priv = kzalloc(sizeof(*file_priv), GFP_KERNEL);
311 file->driver_priv = file_priv;
313 return sprd_drm_subdrv_open(dev, file);
316 static void sprd_drm_preclose(struct drm_device *dev,
317 struct drm_file *file)
319 struct sprd_drm_private *private = dev->dev_private;
320 struct drm_pending_vblank_event *e, *t;
323 DRM_DEBUG_DRIVER("%s\n", __FILE__);
325 /* release events of current file */
326 spin_lock_irqsave(&dev->event_lock, flags);
327 list_for_each_entry_safe(e, t, &private->pageflip_event_list,
329 if (e->base.file_priv == file) {
330 list_del(&e->base.link);
331 e->base.destroy(&e->base);
334 spin_unlock_irqrestore(&dev->event_lock, flags);
336 sprd_drm_subdrv_close(dev, file);
339 static void sprd_drm_postclose(struct drm_device *dev, struct drm_file *file)
341 DRM_DEBUG_DRIVER("%s\n", __FILE__);
343 if (!file->driver_priv)
346 kfree(file->driver_priv);
347 file->driver_priv = NULL;
350 static void sprd_drm_lastclose(struct drm_device *dev)
352 DRM_DEBUG_DRIVER("%s\n", __FILE__);
356 sprd_drm_irq_preinstall(struct drm_device *dev)
358 DRM_DEBUG("%s %d\n", __func__, __LINE__);
359 dev->irq_enabled = 0;
364 sprd_drm_irq_postinstall(struct drm_device *dev)
366 struct sprd_drm_private *private = dev->dev_private;
369 DRM_DEBUG("%s %d\n", __func__, __LINE__);
371 for (i = 0; i < MAX_CRTC; i++)
372 atomic_set(&private->vbl_trg_cnt[i], 0);
374 dev->irq_enabled = 1;
379 sprd_drm_irq_uninstall(struct drm_device *dev)
381 struct sprd_drm_private *private = dev->dev_private;
384 DRM_DEBUG("%s %d\n", __func__, __LINE__);
386 for (i = 0; i < MAX_CRTC; i++)
387 atomic_set(&private->vbl_trg_cnt[i], 0);
389 dev->irq_enabled = 0;
393 #ifdef CONFIG_DRM_DPMS_IOCTL
394 static BLOCKING_NOTIFIER_HEAD(sprd_drm_nb_list);
396 int sprd_drm_nb_register(struct notifier_block *nb)
398 return blocking_notifier_chain_register(
399 &sprd_drm_nb_list, nb);
402 int sprd_drm_nb_unregister(struct notifier_block *nb)
404 return blocking_notifier_chain_unregister(
405 &sprd_drm_nb_list, nb);
408 int sprd_drm_nb_send_event(unsigned long val, void *v)
410 return blocking_notifier_call_chain(
411 &sprd_drm_nb_list, val, v);
414 void sprd_drm_free_dpms_event(struct drm_pending_event *event)
416 DRM_INFO("%s:base[0x%x]\n", "free_dpms_evt", (int)event);
421 void *sprd_drm_get_dpms_event(struct sprd_drm_private *private,
422 struct drm_file *file_priv, struct drm_control_dpms *req)
424 struct drm_device *dev = private->drm_dev;
425 struct drm_sprd_send_dpms_event *e = NULL;
428 e = kzalloc(sizeof(*e), GFP_KERNEL);
430 DRM_ERROR("failed to allocate event.\n");
431 spin_lock_irqsave(&dev->event_lock, flags);
432 file_priv->event_space += sizeof(e->event);
433 spin_unlock_irqrestore(&dev->event_lock, flags);
437 e->event.base.type = DRM_DPMS_EVENT;
438 e->event.base.length = sizeof(e->event);
439 e->event.crtc_id = req->crtc_id;
440 e->event.dpms = req->dpms;
441 e->event.user_data = req->user_data;
443 e->base.event = &e->event.base;
444 e->base.file_priv = file_priv;
445 e->base.destroy = sprd_drm_free_dpms_event;
447 DRM_INFO("%s:base[0x%x]dpms[%d]data[0x%x]\n",
448 "get_dpms_evt", (int)&e->base, e->event.dpms,
449 (int)e->event.user_data);
455 static void sprd_drm_control_dpms(enum drm_crtc_id crtc_id,
458 struct sprd_drm_nb_event event;
460 DRM_INFO("%s:crtc_id[%d]mode[%d]\n", __func__, crtc_id, mode);
462 event.index = crtc_id;
463 event.data = (void *)mode;
465 sprd_drm_nb_send_event(SPRD_DRM_DPMS_CTRL, (void *)&event);
467 DRM_INFO("%s:crtc_id[%d]mode[%d]done\n", __func__, crtc_id, mode);
472 void sprd_drm_put_dpms_event(struct sprd_drm_private *private,
473 struct drm_sprd_send_dpms_event *e)
475 struct drm_device *dev = private->drm_dev;
478 DRM_INFO("%s:base[0x%x]dpms[%d]data[0x%x]\n",
479 "put_dpms_evt", (int)&e->base, e->event.dpms,
480 (int)e->event.user_data);
482 spin_lock_irqsave(&dev->event_lock, flags);
483 list_add_tail(&e->base.link, &e->base.file_priv->event_list);
484 wake_up_interruptible(&e->base.file_priv->event_wait);
485 spin_unlock_irqrestore(&dev->event_lock, flags);
490 void sprd_drm_dpms_work_ops(struct work_struct *work)
492 struct sprd_drm_dpms_work *dpms_work =
493 (struct sprd_drm_dpms_work *)work;
494 struct drm_sprd_send_dpms_event *e = dpms_work->event;
495 struct sprd_drm_private *private = dpms_work->private;
497 mutex_lock(&private->dpms_lock);
499 DRM_INFO("%s:base[0x%x]con_id[%d]dpms[%d]data[0x%x]\n",
500 "dpms_work", (int)&e->base, e->event.crtc_id,
501 e->event.dpms, (int)e->event.user_data);
503 sprd_drm_control_dpms(e->event.crtc_id, e->event.dpms);
505 sprd_drm_put_dpms_event(private, e);
507 complete_all(&private->dpms_comp);
509 DRM_INFO("%s:base[0x%x]dpms[%d]done\n", "dpms_work",
510 (int)&e->base, e->event.dpms);
512 mutex_unlock(&private->dpms_lock);
517 int sprd_drm_handle_dpms(struct sprd_drm_private *private,
518 struct drm_control_dpms *req, struct drm_file *file)
522 if (req->type == DPMS_EVENT_DRIVEN) {
523 struct sprd_drm_dpms_work *dpms_work;
524 struct drm_sprd_send_dpms_event *e =
525 sprd_drm_get_dpms_event(private, file, req);
532 if (completion_done(&private->dpms_comp))
533 INIT_COMPLETION(private->dpms_comp);
535 dpms_work = private->dpms_work;
536 dpms_work->event = e;
537 schedule_work((struct work_struct *)dpms_work);
539 sprd_drm_control_dpms(req->crtc_id, req->dpms);
545 int sprd_drm_dpms_ioctl(struct drm_device *dev,
547 struct drm_file *file)
549 struct drm_control_dpms *req = data;
550 struct sprd_drm_private *private = dev->dev_private;
553 DRM_INFO("[%s][%d][%s]\n", __func__, req->dpms,
554 req->type ? "ASYNC" : "SYNC");
556 ret = sprd_drm_handle_dpms(private, req, file);
559 DRM_INFO("[%s][%d][%s]ret[%d]\n", __func__, req->dpms,
560 req->type ? "ASYNC" : "SYNC", ret);
566 static const struct vm_operations_struct sprd_drm_gem_vm_ops = {
567 .fault = sprd_drm_gem_fault,
568 .open = drm_gem_vm_open,
569 .close = drm_gem_vm_close,
572 static struct drm_ioctl_desc sprd_ioctls[] = {
573 DRM_IOCTL_DEF_DRV(SPRD_GEM_CREATE, sprd_drm_gem_create_ioctl,
574 DRM_UNLOCKED | DRM_AUTH),
575 DRM_IOCTL_DEF_DRV(SPRD_GEM_MAP_OFFSET,
576 sprd_drm_gem_map_offset_ioctl, DRM_UNLOCKED |
578 DRM_IOCTL_DEF_DRV(SPRD_GEM_MMAP,
579 sprd_drm_gem_mmap_ioctl, DRM_UNLOCKED | DRM_AUTH),
580 DRM_IOCTL_DEF_DRV(SPRD_GEM_MMAP_IOMMU,
581 sprd_drm_gem_mmap_iommu_ioctl, DRM_UNLOCKED | DRM_AUTH),
582 DRM_IOCTL_DEF_DRV(SPRD_GEM_UNMAP_IOMMU, sprd_drm_gem_unmap_iommu_ioctl,
583 DRM_UNLOCKED | DRM_AUTH),
584 DRM_IOCTL_DEF_DRV(SPRD_GEM_GET,
585 sprd_drm_gem_get_ioctl, DRM_UNLOCKED),
586 DRM_IOCTL_DEF_DRV(SPRD_GEM_LOCK_HANDLE,
587 sprd_gem_lock_handle_ioctl, DRM_UNLOCKED),
588 DRM_IOCTL_DEF_DRV(SPRD_GEM_UNLOCK_HANDLE,
589 sprd_gem_unlock_handle_ioctl, DRM_UNLOCKED),
590 DRM_IOCTL_DEF_DRV(SPRD_GEM_CACHE_OP,
591 sprd_gem_cache_op_ioctl, DRM_UNLOCKED),
592 DRM_IOCTL_DEF_DRV(SPRD_GEM_INDEX_CREATE, sprd_drm_gem_create_index_ioctl,
593 DRM_UNLOCKED | DRM_AUTH),
594 #ifdef CONFIG_DRM_SPRD_IPP
595 DRM_IOCTL_DEF_DRV(SPRD_IPP_GET_PROPERTY,
596 sprd_drm_ipp_get_property, DRM_UNLOCKED | DRM_AUTH),
597 DRM_IOCTL_DEF_DRV(SPRD_IPP_SET_PROPERTY,
598 sprd_drm_ipp_set_property, DRM_UNLOCKED | DRM_AUTH),
599 DRM_IOCTL_DEF_DRV(SPRD_IPP_QUEUE_BUF,
600 sprd_drm_ipp_queue_buf, DRM_UNLOCKED | DRM_AUTH),
601 DRM_IOCTL_DEF_DRV(SPRD_IPP_CMD_CTRL,
602 sprd_drm_ipp_cmd_ctrl, DRM_UNLOCKED | DRM_AUTH),
604 #ifdef CONFIG_DRM_DPMS_IOCTL
605 DRM_IOCTL_DEF_DRV(DPMS_CONTROL,
606 sprd_drm_dpms_ioctl, DRM_UNLOCKED | DRM_AUTH),
610 static const struct file_operations sprd_drm_driver_fops = {
611 .owner = THIS_MODULE,
613 .mmap = sprd_drm_gem_mmap,
616 .unlocked_ioctl = drm_ioctl,
617 .release = drm_release,
620 static struct drm_driver sprd_drm_driver = {
621 .driver_features = DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED |
622 DRIVER_GEM | DRIVER_PRIME,
623 .load = sprd_drm_load,
624 .unload = sprd_drm_unload,
625 .open = sprd_drm_open,
626 .preclose = sprd_drm_preclose,
627 .lastclose = sprd_drm_lastclose,
628 .postclose = sprd_drm_postclose,
629 .get_vblank_counter = sprd_drm_get_vblank_counter,
630 .prepare_vblank = sprd_prepare_vblank,
631 .enable_vblank = sprd_enable_vblank,
632 .disable_vblank = sprd_disable_vblank,
633 .gem_init_object = sprd_drm_gem_init_object,
634 .gem_free_object = sprd_drm_gem_free_object,
635 .gem_vm_ops = &sprd_drm_gem_vm_ops,
636 .dumb_create = sprd_drm_gem_dumb_create,
637 .dumb_map_offset = sprd_drm_gem_dumb_map_offset,
638 .dumb_destroy = sprd_drm_gem_dumb_destroy,
639 .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
640 .prime_fd_to_handle = sprd_drm_gem_prime_fd_to_handle,
641 #ifdef CONFIG_DRM_SPRD_DMABUF
642 .gem_prime_export = sprd_dmabuf_prime_export,
643 .gem_prime_import = sprd_dmabuf_prime_import,
645 .gem_prime_export = sprd_prime_export,
646 .gem_prime_import = sprd_prime_import,
648 .ioctls = sprd_ioctls,
649 .fops = &sprd_drm_driver_fops,
650 .irq_handler = sprd_drm_irq_handler,
651 .irq_preinstall = sprd_drm_irq_preinstall,
652 .irq_postinstall = sprd_drm_irq_postinstall,
653 .irq_uninstall = sprd_drm_irq_uninstall,
657 .major = DRIVER_MAJOR,
658 .minor = DRIVER_MINOR,
661 static int sprd_drm_platform_probe(struct platform_device *pdev)
663 DRM_DEBUG_DRIVER("%s\n", __FILE__);
665 sprd_drm_driver.num_ioctls = DRM_ARRAY_SIZE(sprd_ioctls);
666 sprd_drm_driver.kdriver.platform_device = pdev;
668 return drm_platform_init(&sprd_drm_driver, pdev);
671 static int sprd_drm_platform_remove(struct platform_device *pdev)
673 DRM_DEBUG_DRIVER("%s\n", __FILE__);
675 drm_platform_exit(&sprd_drm_driver, pdev);
681 static const struct of_device_id sprd_drm_dt_match[] = {
682 { .compatible = "sprd,sprd_drm",},
685 MODULE_DEVICE_TABLE(of, sprd_drm_dt_match);
688 static struct platform_driver sprd_drm_platform_driver = {
689 .probe = sprd_drm_platform_probe,
690 .remove = sprd_drm_platform_remove,
692 .owner = THIS_MODULE,
695 .of_match_table = of_match_ptr(sprd_drm_dt_match),
700 static int __init sprd_drm_init(void)
704 DRM_DEBUG_DRIVER("%s\n", __FILE__);
706 #ifdef CONFIG_DRM_SPRD_GSP
707 ret = platform_driver_register(&gsp_driver);
712 #ifdef CONFIG_DRM_SPRD_IPP
713 ret = platform_driver_register(&ipp_driver);
718 ret = platform_driver_register(&sprd_drm_platform_driver);
725 #ifdef CONFIG_DRM_SPRD_IPP
726 platform_driver_unregister(&ipp_driver);
730 #ifdef CONFIG_DRM_SPRD_GSP
731 platform_driver_unregister(&gsp_driver);
738 static void __exit sprd_drm_exit(void)
740 DRM_DEBUG_DRIVER("%s\n", __FILE__);
742 platform_driver_unregister(&sprd_drm_platform_driver);
744 #ifdef CONFIG_DRM_SPRD_IPP
745 platform_driver_unregister(&ipp_driver);
748 #ifdef CONFIG_DRM_SPRD_GSP
749 platform_driver_unregister(&gsp_driver);
753 //module_init(sprd_drm_init);
754 late_initcall(sprd_drm_init);
755 module_exit(sprd_drm_exit);
757 MODULE_AUTHOR("frank.dong@spreadtrum.com");
758 MODULE_DESCRIPTION("Spreadtrum SoC DRM Driver");
759 MODULE_LICENSE("GPL");