1 /* 2 * Copyright (c) 2011 Samsung Electronics Co., Ltd. 3 * Authors: 4 * Inki Dae <inki.dae@samsung.com> 5 * Joonyoung Shim <jy0922.shim@samsung.com> 6 * Seung-Woo Kim <sw0312.kim@samsung.com> 7 * 8 * This program is free software; you can redistribute it and/or modify it 9 * under the terms of the GNU General Public License as published by the 10 * Free Software Foundation; either version 2 of the License, or (at your 11 * option) any later version. 12 */ 13 14 #include <linux/pm_runtime.h> 15 #include <drm/drmP.h> 16 #include <drm/drm_atomic.h> 17 #include <drm/drm_atomic_helper.h> 18 #include <drm/drm_crtc_helper.h> 19 20 #include <linux/component.h> 21 22 #include <drm/exynos_drm.h> 23 24 #include "exynos_drm_drv.h" 25 #include "exynos_drm_fbdev.h" 26 #include "exynos_drm_fb.h" 27 #include "exynos_drm_gem.h" 28 #include "exynos_drm_plane.h" 29 #include "exynos_drm_vidi.h" 30 #include "exynos_drm_g2d.h" 31 #include "exynos_drm_ipp.h" 32 #include "exynos_drm_iommu.h" 33 34 #define DRIVER_NAME "exynos" 35 #define DRIVER_DESC "Samsung SoC DRM" 36 #define DRIVER_DATE "20110530" 37 #define DRIVER_MAJOR 1 38 #define DRIVER_MINOR 0 39 40 static struct device *exynos_drm_get_dma_device(void); 41 42 int exynos_atomic_check(struct drm_device *dev, 43 struct drm_atomic_state *state) 44 { 45 int ret; 46 47 ret = drm_atomic_helper_check_modeset(dev, state); 48 if (ret) 49 return ret; 50 51 ret = drm_atomic_normalize_zpos(dev, state); 52 if (ret) 53 return ret; 54 55 ret = drm_atomic_helper_check_planes(dev, state); 56 if (ret) 57 return ret; 58 59 return ret; 60 } 61 62 static int exynos_drm_open(struct drm_device *dev, struct drm_file *file) 63 { 64 struct drm_exynos_file_private *file_priv; 65 int ret; 66 67 file_priv = kzalloc(sizeof(*file_priv), GFP_KERNEL); 68 if (!file_priv) 69 return -ENOMEM; 70 71 file->driver_priv = file_priv; 72 73 ret = exynos_drm_subdrv_open(dev, file); 74 if (ret) 75 goto err_file_priv_free; 76 77 return ret; 78 79 err_file_priv_free: 80 kfree(file_priv); 81 file->driver_priv = NULL; 82 return ret; 83 } 84 85 static void exynos_drm_preclose(struct drm_device *dev, 86 struct drm_file *file) 87 { 88 exynos_drm_subdrv_close(dev, file); 89 } 90 91 static void exynos_drm_postclose(struct drm_device *dev, struct drm_file *file) 92 { 93 kfree(file->driver_priv); 94 file->driver_priv = NULL; 95 } 96 97 static void exynos_drm_lastclose(struct drm_device *dev) 98 { 99 exynos_drm_fbdev_restore_mode(dev); 100 } 101 102 static const struct vm_operations_struct exynos_drm_gem_vm_ops = { 103 .fault = exynos_drm_gem_fault, 104 .open = drm_gem_vm_open, 105 .close = drm_gem_vm_close, 106 }; 107 108 static const struct drm_ioctl_desc exynos_ioctls[] = { 109 DRM_IOCTL_DEF_DRV(EXYNOS_GEM_CREATE, exynos_drm_gem_create_ioctl, 110 DRM_AUTH | DRM_RENDER_ALLOW), 111 DRM_IOCTL_DEF_DRV(EXYNOS_GEM_MAP, exynos_drm_gem_map_ioctl, 112 DRM_AUTH | DRM_RENDER_ALLOW), 113 DRM_IOCTL_DEF_DRV(EXYNOS_GEM_GET, exynos_drm_gem_get_ioctl, 114 DRM_RENDER_ALLOW), 115 DRM_IOCTL_DEF_DRV(EXYNOS_VIDI_CONNECTION, vidi_connection_ioctl, 116 DRM_AUTH), 117 DRM_IOCTL_DEF_DRV(EXYNOS_G2D_GET_VER, exynos_g2d_get_ver_ioctl, 118 DRM_AUTH | DRM_RENDER_ALLOW), 119 DRM_IOCTL_DEF_DRV(EXYNOS_G2D_SET_CMDLIST, exynos_g2d_set_cmdlist_ioctl, 120 DRM_AUTH | DRM_RENDER_ALLOW), 121 DRM_IOCTL_DEF_DRV(EXYNOS_G2D_EXEC, exynos_g2d_exec_ioctl, 122 DRM_AUTH | DRM_RENDER_ALLOW), 123 DRM_IOCTL_DEF_DRV(EXYNOS_IPP_GET_PROPERTY, exynos_drm_ipp_get_property, 124 DRM_AUTH | DRM_RENDER_ALLOW), 125 DRM_IOCTL_DEF_DRV(EXYNOS_IPP_SET_PROPERTY, exynos_drm_ipp_set_property, 126 DRM_AUTH | DRM_RENDER_ALLOW), 127 DRM_IOCTL_DEF_DRV(EXYNOS_IPP_QUEUE_BUF, exynos_drm_ipp_queue_buf, 128 DRM_AUTH | DRM_RENDER_ALLOW), 129 DRM_IOCTL_DEF_DRV(EXYNOS_IPP_CMD_CTRL, exynos_drm_ipp_cmd_ctrl, 130 DRM_AUTH | DRM_RENDER_ALLOW), 131 }; 132 133 static const struct file_operations exynos_drm_driver_fops = { 134 .owner = THIS_MODULE, 135 .open = drm_open, 136 .mmap = exynos_drm_gem_mmap, 137 .poll = drm_poll, 138 .read = drm_read, 139 .unlocked_ioctl = drm_ioctl, 140 .compat_ioctl = drm_compat_ioctl, 141 .release = drm_release, 142 }; 143 144 static struct drm_driver exynos_drm_driver = { 145 .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME 146 | DRIVER_ATOMIC | DRIVER_RENDER, 147 .open = exynos_drm_open, 148 .preclose = exynos_drm_preclose, 149 .lastclose = exynos_drm_lastclose, 150 .postclose = exynos_drm_postclose, 151 .gem_free_object_unlocked = exynos_drm_gem_free_object, 152 .gem_vm_ops = &exynos_drm_gem_vm_ops, 153 .dumb_create = exynos_drm_gem_dumb_create, 154 .dumb_map_offset = exynos_drm_gem_dumb_map_offset, 155 .dumb_destroy = drm_gem_dumb_destroy, 156 .prime_handle_to_fd = drm_gem_prime_handle_to_fd, 157 .prime_fd_to_handle = drm_gem_prime_fd_to_handle, 158 .gem_prime_export = drm_gem_prime_export, 159 .gem_prime_import = drm_gem_prime_import, 160 .gem_prime_get_sg_table = exynos_drm_gem_prime_get_sg_table, 161 .gem_prime_import_sg_table = exynos_drm_gem_prime_import_sg_table, 162 .gem_prime_vmap = exynos_drm_gem_prime_vmap, 163 .gem_prime_vunmap = exynos_drm_gem_prime_vunmap, 164 .gem_prime_mmap = exynos_drm_gem_prime_mmap, 165 .ioctls = exynos_ioctls, 166 .num_ioctls = ARRAY_SIZE(exynos_ioctls), 167 .fops = &exynos_drm_driver_fops, 168 .name = DRIVER_NAME, 169 .desc = DRIVER_DESC, 170 .date = DRIVER_DATE, 171 .major = DRIVER_MAJOR, 172 .minor = DRIVER_MINOR, 173 }; 174 175 #ifdef CONFIG_PM_SLEEP 176 static int exynos_drm_suspend(struct device *dev) 177 { 178 struct drm_device *drm_dev = dev_get_drvdata(dev); 179 struct drm_connector *connector; 180 181 if (pm_runtime_suspended(dev) || !drm_dev) 182 return 0; 183 184 drm_modeset_lock_all(drm_dev); 185 drm_for_each_connector(connector, drm_dev) { 186 int old_dpms = connector->dpms; 187 188 if (connector->funcs->dpms) 189 connector->funcs->dpms(connector, DRM_MODE_DPMS_OFF); 190 191 /* Set the old mode back to the connector for resume */ 192 connector->dpms = old_dpms; 193 } 194 drm_modeset_unlock_all(drm_dev); 195 196 return 0; 197 } 198 199 static int exynos_drm_resume(struct device *dev) 200 { 201 struct drm_device *drm_dev = dev_get_drvdata(dev); 202 struct drm_connector *connector; 203 204 if (pm_runtime_suspended(dev) || !drm_dev) 205 return 0; 206 207 drm_modeset_lock_all(drm_dev); 208 drm_for_each_connector(connector, drm_dev) { 209 if (connector->funcs->dpms) { 210 int dpms = connector->dpms; 211 212 connector->dpms = DRM_MODE_DPMS_OFF; 213 connector->funcs->dpms(connector, dpms); 214 } 215 } 216 drm_modeset_unlock_all(drm_dev); 217 218 return 0; 219 } 220 #endif 221 222 static const struct dev_pm_ops exynos_drm_pm_ops = { 223 SET_SYSTEM_SLEEP_PM_OPS(exynos_drm_suspend, exynos_drm_resume) 224 }; 225 226 /* forward declaration */ 227 static struct platform_driver exynos_drm_platform_driver; 228 229 struct exynos_drm_driver_info { 230 struct platform_driver *driver; 231 unsigned int flags; 232 }; 233 234 #define DRM_COMPONENT_DRIVER BIT(0) /* supports component framework */ 235 #define DRM_VIRTUAL_DEVICE BIT(1) /* create virtual platform device */ 236 #define DRM_DMA_DEVICE BIT(2) /* can be used for dma allocations */ 237 238 #define DRV_PTR(drv, cond) (IS_ENABLED(cond) ? &drv : NULL) 239 240 /* 241 * Connector drivers should not be placed before associated crtc drivers, 242 * because connector requires pipe number of its crtc during initialization. 243 */ 244 static struct exynos_drm_driver_info exynos_drm_drivers[] = { 245 { 246 DRV_PTR(fimd_driver, CONFIG_DRM_EXYNOS_FIMD), 247 DRM_COMPONENT_DRIVER | DRM_DMA_DEVICE 248 }, { 249 DRV_PTR(exynos5433_decon_driver, CONFIG_DRM_EXYNOS5433_DECON), 250 DRM_COMPONENT_DRIVER | DRM_DMA_DEVICE 251 }, { 252 DRV_PTR(decon_driver, CONFIG_DRM_EXYNOS7_DECON), 253 DRM_COMPONENT_DRIVER | DRM_DMA_DEVICE 254 }, { 255 DRV_PTR(mixer_driver, CONFIG_DRM_EXYNOS_MIXER), 256 DRM_COMPONENT_DRIVER | DRM_DMA_DEVICE 257 }, { 258 DRV_PTR(mic_driver, CONFIG_DRM_EXYNOS_MIC), 259 DRM_COMPONENT_DRIVER 260 }, { 261 DRV_PTR(dp_driver, CONFIG_DRM_EXYNOS_DP), 262 DRM_COMPONENT_DRIVER 263 }, { 264 DRV_PTR(dsi_driver, CONFIG_DRM_EXYNOS_DSI), 265 DRM_COMPONENT_DRIVER 266 }, { 267 DRV_PTR(hdmi_driver, CONFIG_DRM_EXYNOS_HDMI), 268 DRM_COMPONENT_DRIVER 269 }, { 270 DRV_PTR(vidi_driver, CONFIG_DRM_EXYNOS_VIDI), 271 DRM_COMPONENT_DRIVER | DRM_VIRTUAL_DEVICE 272 }, { 273 DRV_PTR(g2d_driver, CONFIG_DRM_EXYNOS_G2D), 274 }, { 275 DRV_PTR(fimc_driver, CONFIG_DRM_EXYNOS_FIMC), 276 }, { 277 DRV_PTR(rotator_driver, CONFIG_DRM_EXYNOS_ROTATOR), 278 }, { 279 DRV_PTR(gsc_driver, CONFIG_DRM_EXYNOS_GSC), 280 }, { 281 DRV_PTR(ipp_driver, CONFIG_DRM_EXYNOS_IPP), 282 DRM_VIRTUAL_DEVICE 283 }, { 284 &exynos_drm_platform_driver, 285 DRM_VIRTUAL_DEVICE 286 } 287 }; 288 289 static int compare_dev(struct device *dev, void *data) 290 { 291 return dev == (struct device *)data; 292 } 293 294 static struct component_match *exynos_drm_match_add(struct device *dev) 295 { 296 struct component_match *match = NULL; 297 int i; 298 299 for (i = 0; i < ARRAY_SIZE(exynos_drm_drivers); ++i) { 300 struct exynos_drm_driver_info *info = &exynos_drm_drivers[i]; 301 struct device *p = NULL, *d; 302 303 if (!info->driver || !(info->flags & DRM_COMPONENT_DRIVER)) 304 continue; 305 306 while ((d = bus_find_device(&platform_bus_type, p, 307 &info->driver->driver, 308 (void *)platform_bus_type.match))) { 309 put_device(p); 310 component_match_add(dev, &match, compare_dev, d); 311 p = d; 312 } 313 put_device(p); 314 } 315 316 return match ?: ERR_PTR(-ENODEV); 317 } 318 319 static int exynos_drm_bind(struct device *dev) 320 { 321 struct exynos_drm_private *private; 322 struct drm_encoder *encoder; 323 struct drm_device *drm; 324 unsigned int clone_mask; 325 int cnt, ret; 326 327 drm = drm_dev_alloc(&exynos_drm_driver, dev); 328 if (IS_ERR(drm)) 329 return PTR_ERR(drm); 330 331 private = kzalloc(sizeof(struct exynos_drm_private), GFP_KERNEL); 332 if (!private) { 333 ret = -ENOMEM; 334 goto err_free_drm; 335 } 336 337 init_waitqueue_head(&private->wait); 338 spin_lock_init(&private->lock); 339 340 dev_set_drvdata(dev, drm); 341 drm->dev_private = (void *)private; 342 343 /* the first real CRTC device is used for all dma mapping operations */ 344 private->dma_dev = exynos_drm_get_dma_device(); 345 if (!private->dma_dev) { 346 DRM_ERROR("no device found for DMA mapping operations.\n"); 347 ret = -ENODEV; 348 goto err_free_private; 349 } 350 DRM_INFO("Exynos DRM: using %s device for DMA mapping operations\n", 351 dev_name(private->dma_dev)); 352 353 /* create common IOMMU mapping for all devices attached to Exynos DRM */ 354 ret = drm_create_iommu_mapping(drm); 355 if (ret < 0) { 356 DRM_ERROR("failed to create iommu mapping.\n"); 357 goto err_free_private; 358 } 359 360 drm_mode_config_init(drm); 361 362 exynos_drm_mode_config_init(drm); 363 364 /* setup possible_clones. */ 365 cnt = 0; 366 clone_mask = 0; 367 list_for_each_entry(encoder, &drm->mode_config.encoder_list, head) 368 clone_mask |= (1 << (cnt++)); 369 370 list_for_each_entry(encoder, &drm->mode_config.encoder_list, head) 371 encoder->possible_clones = clone_mask; 372 373 /* Try to bind all sub drivers. */ 374 ret = component_bind_all(drm->dev, drm); 375 if (ret) 376 goto err_mode_config_cleanup; 377 378 ret = drm_vblank_init(drm, drm->mode_config.num_crtc); 379 if (ret) 380 goto err_unbind_all; 381 382 /* Probe non kms sub drivers and virtual display driver. */ 383 ret = exynos_drm_device_subdrv_probe(drm); 384 if (ret) 385 goto err_cleanup_vblank; 386 387 drm_mode_config_reset(drm); 388 389 /* 390 * enable drm irq mode. 391 * - with irq_enabled = true, we can use the vblank feature. 392 * 393 * P.S. note that we wouldn't use drm irq handler but 394 * just specific driver own one instead because 395 * drm framework supports only one irq handler. 396 */ 397 drm->irq_enabled = true; 398 399 /* init kms poll for handling hpd */ 400 drm_kms_helper_poll_init(drm); 401 402 /* force connectors detection */ 403 drm_helper_hpd_irq_event(drm); 404 405 /* register the DRM device */ 406 ret = drm_dev_register(drm, 0); 407 if (ret < 0) 408 goto err_cleanup_fbdev; 409 410 return 0; 411 412 err_cleanup_fbdev: 413 exynos_drm_fbdev_fini(drm); 414 drm_kms_helper_poll_fini(drm); 415 exynos_drm_device_subdrv_remove(drm); 416 err_cleanup_vblank: 417 drm_vblank_cleanup(drm); 418 err_unbind_all: 419 component_unbind_all(drm->dev, drm); 420 err_mode_config_cleanup: 421 drm_mode_config_cleanup(drm); 422 drm_release_iommu_mapping(drm); 423 err_free_private: 424 kfree(private); 425 err_free_drm: 426 drm_dev_unref(drm); 427 428 return ret; 429 } 430 431 static void exynos_drm_unbind(struct device *dev) 432 { 433 struct drm_device *drm = dev_get_drvdata(dev); 434 435 drm_dev_unregister(drm); 436 437 exynos_drm_device_subdrv_remove(drm); 438 439 exynos_drm_fbdev_fini(drm); 440 drm_kms_helper_poll_fini(drm); 441 442 component_unbind_all(drm->dev, drm); 443 drm_mode_config_cleanup(drm); 444 drm_release_iommu_mapping(drm); 445 446 kfree(drm->dev_private); 447 drm->dev_private = NULL; 448 449 drm_dev_unref(drm); 450 } 451 452 static const struct component_master_ops exynos_drm_ops = { 453 .bind = exynos_drm_bind, 454 .unbind = exynos_drm_unbind, 455 }; 456 457 static int exynos_drm_platform_probe(struct platform_device *pdev) 458 { 459 struct component_match *match; 460 461 pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32); 462 exynos_drm_driver.num_ioctls = ARRAY_SIZE(exynos_ioctls); 463 464 match = exynos_drm_match_add(&pdev->dev); 465 if (IS_ERR(match)) 466 return PTR_ERR(match); 467 468 return component_master_add_with_match(&pdev->dev, &exynos_drm_ops, 469 match); 470 } 471 472 static int exynos_drm_platform_remove(struct platform_device *pdev) 473 { 474 component_master_del(&pdev->dev, &exynos_drm_ops); 475 return 0; 476 } 477 478 static struct platform_driver exynos_drm_platform_driver = { 479 .probe = exynos_drm_platform_probe, 480 .remove = exynos_drm_platform_remove, 481 .driver = { 482 .name = "exynos-drm", 483 .pm = &exynos_drm_pm_ops, 484 }, 485 }; 486 487 static struct device *exynos_drm_get_dma_device(void) 488 { 489 int i; 490 491 for (i = 0; i < ARRAY_SIZE(exynos_drm_drivers); ++i) { 492 struct exynos_drm_driver_info *info = &exynos_drm_drivers[i]; 493 struct device *dev; 494 495 if (!info->driver || !(info->flags & DRM_DMA_DEVICE)) 496 continue; 497 498 while ((dev = bus_find_device(&platform_bus_type, NULL, 499 &info->driver->driver, 500 (void *)platform_bus_type.match))) { 501 put_device(dev); 502 return dev; 503 } 504 } 505 return NULL; 506 } 507 508 static void exynos_drm_unregister_devices(void) 509 { 510 int i; 511 512 for (i = ARRAY_SIZE(exynos_drm_drivers) - 1; i >= 0; --i) { 513 struct exynos_drm_driver_info *info = &exynos_drm_drivers[i]; 514 struct device *dev; 515 516 if (!info->driver || !(info->flags & DRM_VIRTUAL_DEVICE)) 517 continue; 518 519 while ((dev = bus_find_device(&platform_bus_type, NULL, 520 &info->driver->driver, 521 (void *)platform_bus_type.match))) { 522 put_device(dev); 523 platform_device_unregister(to_platform_device(dev)); 524 } 525 } 526 } 527 528 static int exynos_drm_register_devices(void) 529 { 530 struct platform_device *pdev; 531 int i; 532 533 for (i = 0; i < ARRAY_SIZE(exynos_drm_drivers); ++i) { 534 struct exynos_drm_driver_info *info = &exynos_drm_drivers[i]; 535 536 if (!info->driver || !(info->flags & DRM_VIRTUAL_DEVICE)) 537 continue; 538 539 pdev = platform_device_register_simple( 540 info->driver->driver.name, -1, NULL, 0); 541 if (IS_ERR(pdev)) 542 goto fail; 543 } 544 545 return 0; 546 fail: 547 exynos_drm_unregister_devices(); 548 return PTR_ERR(pdev); 549 } 550 551 static void exynos_drm_unregister_drivers(void) 552 { 553 int i; 554 555 for (i = ARRAY_SIZE(exynos_drm_drivers) - 1; i >= 0; --i) { 556 struct exynos_drm_driver_info *info = &exynos_drm_drivers[i]; 557 558 if (!info->driver) 559 continue; 560 561 platform_driver_unregister(info->driver); 562 } 563 } 564 565 static int exynos_drm_register_drivers(void) 566 { 567 int i, ret; 568 569 for (i = 0; i < ARRAY_SIZE(exynos_drm_drivers); ++i) { 570 struct exynos_drm_driver_info *info = &exynos_drm_drivers[i]; 571 572 if (!info->driver) 573 continue; 574 575 ret = platform_driver_register(info->driver); 576 if (ret) 577 goto fail; 578 } 579 return 0; 580 fail: 581 exynos_drm_unregister_drivers(); 582 return ret; 583 } 584 585 static int exynos_drm_init(void) 586 { 587 int ret; 588 589 ret = exynos_drm_register_devices(); 590 if (ret) 591 return ret; 592 593 ret = exynos_drm_register_drivers(); 594 if (ret) 595 goto err_unregister_pdevs; 596 597 return 0; 598 599 err_unregister_pdevs: 600 exynos_drm_unregister_devices(); 601 602 return ret; 603 } 604 605 static void exynos_drm_exit(void) 606 { 607 exynos_drm_unregister_drivers(); 608 exynos_drm_unregister_devices(); 609 } 610 611 module_init(exynos_drm_init); 612 module_exit(exynos_drm_exit); 613 614 MODULE_AUTHOR("Inki Dae <inki.dae@samsung.com>"); 615 MODULE_AUTHOR("Joonyoung Shim <jy0922.shim@samsung.com>"); 616 MODULE_AUTHOR("Seung-Woo Kim <sw0312.kim@samsung.com>"); 617 MODULE_DESCRIPTION("Samsung SoC DRM Driver"); 618 MODULE_LICENSE("GPL"); 619