Lines Matching full:drm

35 #include <drm/clients/drm_client_setup.h>
36 #include <drm/drm_drv.h>
37 #include <drm/drm_fbdev_ttm.h>
38 #include <drm/drm_gem_ttm_helper.h>
39 #include <drm/drm_ioctl.h>
40 #include <drm/drm_vblank.h>
228 mutex_lock(&cli->drm->client_mutex); in nouveau_cli_fini()
230 mutex_unlock(&cli->drm->client_mutex); in nouveau_cli_fini()
234 nouveau_cli_init(struct nouveau_drm *drm, const char *sname, in nouveau_cli_init() argument
256 cli->drm = drm; in nouveau_cli_init()
263 mutex_lock(&drm->client_mutex); in nouveau_cli_init()
264 ret = nvif_client_ctor(&drm->_client, cli->name, &cli->base); in nouveau_cli_init()
265 mutex_unlock(&drm->client_mutex); in nouveau_cli_init()
277 cli->device.object.map.ptr = drm->device.object.map.ptr; in nouveau_cli_init()
279 ret = nvif_mmu_ctor(&cli->device.object, "drmMmu", drm->mmu.object.oclass, in nouveau_cli_init()
316 ret = nouveau_sched_create(&cli->sched, drm, NULL, 1); in nouveau_cli_init()
328 nouveau_accel_ce_fini(struct nouveau_drm *drm) in nouveau_accel_ce_fini() argument
330 nouveau_channel_idle(drm->cechan); in nouveau_accel_ce_fini()
331 nvif_object_dtor(&drm->ttm.copy); in nouveau_accel_ce_fini()
332 nouveau_channel_del(&drm->cechan); in nouveau_accel_ce_fini()
336 nouveau_accel_ce_init(struct nouveau_drm *drm) in nouveau_accel_ce_init() argument
338 struct nvif_device *device = &drm->client.device; in nouveau_accel_ce_init()
347 NV_DEBUG(drm, "no ce runlist\n"); in nouveau_accel_ce_init()
351 ret = nouveau_channel_new(&drm->client, true, runm, NvDmaFB, NvDmaTT, &drm->cechan); in nouveau_accel_ce_init()
353 NV_ERROR(drm, "failed to create ce channel, %d\n", ret); in nouveau_accel_ce_init()
357 nouveau_accel_gr_fini(struct nouveau_drm *drm) in nouveau_accel_gr_fini() argument
359 nouveau_channel_idle(drm->channel); in nouveau_accel_gr_fini()
360 nvif_object_dtor(&drm->ntfy); in nouveau_accel_gr_fini()
361 nvkm_gpuobj_del(&drm->notify); in nouveau_accel_gr_fini()
362 nouveau_channel_del(&drm->channel); in nouveau_accel_gr_fini()
366 nouveau_accel_gr_init(struct nouveau_drm *drm) in nouveau_accel_gr_init() argument
368 struct nvif_device *device = &drm->client.device; in nouveau_accel_gr_init()
375 NV_DEBUG(drm, "no gr runlist\n"); in nouveau_accel_gr_init()
379 ret = nouveau_channel_new(&drm->client, false, runm, NvDmaFB, NvDmaTT, &drm->channel); in nouveau_accel_gr_init()
381 NV_ERROR(drm, "failed to create kernel channel, %d\n", ret); in nouveau_accel_gr_init()
382 nouveau_accel_gr_fini(drm); in nouveau_accel_gr_init()
390 if (!drm->channel->nvsw.client && device->info.family < NV_DEVICE_INFO_V0_TESLA) { in nouveau_accel_gr_init()
391 ret = nvif_object_ctor(&drm->channel->user, "drmNvsw", in nouveau_accel_gr_init()
392 NVDRM_NVSW, nouveau_abi16_swclass(drm), in nouveau_accel_gr_init()
393 NULL, 0, &drm->channel->nvsw); in nouveau_accel_gr_init()
396 ret = nvif_object_ctor(&drm->channel->user, "drmBlit", in nouveau_accel_gr_init()
398 NULL, 0, &drm->channel->blit); in nouveau_accel_gr_init()
402 struct nvif_push *push = &drm->channel->chan.push; in nouveau_accel_gr_init()
407 PUSH_NVSQ(push, NV05F, 0x0000, drm->channel->blit.handle); in nouveau_accel_gr_init()
412 PUSH_NVSQ(push, NV_SW, 0x0000, drm->channel->nvsw.handle); in nouveau_accel_gr_init()
417 NV_ERROR(drm, "failed to allocate sw or blit class, %d\n", ret); in nouveau_accel_gr_init()
418 nouveau_accel_gr_fini(drm); in nouveau_accel_gr_init()
428 ret = nvkm_gpuobj_new(nvxx_device(drm), 32, 0, false, NULL, &drm->notify); in nouveau_accel_gr_init()
430 NV_ERROR(drm, "failed to allocate notifier, %d\n", ret); in nouveau_accel_gr_init()
431 nouveau_accel_gr_fini(drm); in nouveau_accel_gr_init()
435 ret = nvif_object_ctor(&drm->channel->user, "drmM2mfNtfy", in nouveau_accel_gr_init()
440 .start = drm->notify->addr, in nouveau_accel_gr_init()
441 .limit = drm->notify->addr + 31 in nouveau_accel_gr_init()
443 &drm->ntfy); in nouveau_accel_gr_init()
445 nouveau_accel_gr_fini(drm); in nouveau_accel_gr_init()
452 nouveau_accel_fini(struct nouveau_drm *drm) in nouveau_accel_fini() argument
454 nouveau_accel_ce_fini(drm); in nouveau_accel_fini()
455 nouveau_accel_gr_fini(drm); in nouveau_accel_fini()
456 if (drm->fence) in nouveau_accel_fini()
457 nouveau_fence(drm)->dtor(drm); in nouveau_accel_fini()
458 nouveau_channels_fini(drm); in nouveau_accel_fini()
462 nouveau_accel_init(struct nouveau_drm *drm) in nouveau_accel_init() argument
464 struct nvif_device *device = &drm->client.device; in nouveau_accel_init()
472 ret = nouveau_channels_init(drm); in nouveau_accel_init()
486 ret = nv04_fence_create(drm); in nouveau_accel_init()
489 ret = nv10_fence_create(drm); in nouveau_accel_init()
493 ret = nv17_fence_create(drm); in nouveau_accel_init()
496 ret = nv50_fence_create(drm); in nouveau_accel_init()
499 ret = nv84_fence_create(drm); in nouveau_accel_init()
510 ret = nvc0_fence_create(drm); in nouveau_accel_init()
519 NV_ERROR(drm, "failed to initialise sync subsystem, %d\n", ret); in nouveau_accel_init()
520 nouveau_accel_fini(drm); in nouveau_accel_init()
525 if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_VOLTA) { in nouveau_accel_init()
532 nouveau_accel_gr_init(drm); in nouveau_accel_init()
533 nouveau_accel_ce_init(drm); in nouveau_accel_init()
536 nouveau_bo_move_init(drm); in nouveau_accel_init()
542 struct nouveau_drm *drm = container_of(object->parent, typeof(*drm), parent); in nouveau_drm_errorf() local
549 NV_ERROR(drm, "%pV", &vaf); in nouveau_drm_errorf()
556 struct nouveau_drm *drm = container_of(object->parent, typeof(*drm), parent); in nouveau_drm_debugf() local
563 NV_DEBUG(drm, "%pV", &vaf); in nouveau_drm_debugf()
574 nouveau_drm_device_fini(struct nouveau_drm *drm) in nouveau_drm_device_fini() argument
576 struct drm_device *dev = drm->dev; in nouveau_drm_device_fini()
585 nouveau_dmem_fini(drm); in nouveau_drm_device_fini()
586 nouveau_svm_fini(drm); in nouveau_drm_device_fini()
588 nouveau_debugfs_fini(drm); in nouveau_drm_device_fini()
594 nouveau_accel_fini(drm); in nouveau_drm_device_fini()
597 nouveau_ttm_fini(drm); in nouveau_drm_device_fini()
598 nouveau_vga_fini(drm); in nouveau_drm_device_fini()
606 mutex_lock(&drm->clients_lock); in nouveau_drm_device_fini()
607 list_for_each_entry_safe(cli, temp_cli, &drm->clients, head) { in nouveau_drm_device_fini()
616 mutex_unlock(&drm->clients_lock); in nouveau_drm_device_fini()
618 nouveau_cli_fini(&drm->client); in nouveau_drm_device_fini()
619 destroy_workqueue(drm->sched_wq); in nouveau_drm_device_fini()
620 mutex_destroy(&drm->clients_lock); in nouveau_drm_device_fini()
624 nouveau_drm_device_init(struct nouveau_drm *drm) in nouveau_drm_device_init() argument
626 struct drm_device *dev = drm->dev; in nouveau_drm_device_init()
629 drm->sched_wq = alloc_workqueue("nouveau_sched_wq_shared", 0, in nouveau_drm_device_init()
631 if (!drm->sched_wq) in nouveau_drm_device_init()
634 ret = nouveau_cli_init(drm, "DRM", &drm->client); in nouveau_drm_device_init()
638 INIT_LIST_HEAD(&drm->clients); in nouveau_drm_device_init()
639 mutex_init(&drm->clients_lock); in nouveau_drm_device_init()
640 spin_lock_init(&drm->tile.lock); in nouveau_drm_device_init()
646 if (drm->client.device.info.chipset == 0xc1) in nouveau_drm_device_init()
647 nvif_mask(&drm->client.device.object, 0x00088080, 0x00000800, 0x00000000); in nouveau_drm_device_init()
649 nouveau_vga_init(drm); in nouveau_drm_device_init()
651 ret = nouveau_ttm_init(drm); in nouveau_drm_device_init()
659 nouveau_accel_init(drm); in nouveau_drm_device_init()
671 nouveau_debugfs_init(drm); in nouveau_drm_device_init()
673 nouveau_svm_init(drm); in nouveau_drm_device_init()
674 nouveau_dmem_init(drm); in nouveau_drm_device_init()
686 ret = drm_dev_register(drm->dev, 0); in nouveau_drm_device_init()
688 nouveau_drm_device_fini(drm); in nouveau_drm_device_init()
696 nouveau_accel_fini(drm); in nouveau_drm_device_init()
699 nouveau_ttm_fini(drm); in nouveau_drm_device_init()
701 nouveau_vga_fini(drm); in nouveau_drm_device_init()
702 nouveau_cli_fini(&drm->client); in nouveau_drm_device_init()
704 destroy_workqueue(drm->sched_wq); in nouveau_drm_device_init()
709 nouveau_drm_device_del(struct nouveau_drm *drm) in nouveau_drm_device_del() argument
711 if (drm->dev) in nouveau_drm_device_del()
712 drm_dev_put(drm->dev); in nouveau_drm_device_del()
714 nvif_mmu_dtor(&drm->mmu); in nouveau_drm_device_del()
715 nvif_device_dtor(&drm->device); in nouveau_drm_device_del()
716 nvif_client_dtor(&drm->_client); in nouveau_drm_device_del()
717 nvif_parent_dtor(&drm->parent); in nouveau_drm_device_del()
719 mutex_destroy(&drm->client_mutex); in nouveau_drm_device_del()
720 kfree(drm); in nouveau_drm_device_del()
734 struct nouveau_drm *drm; in nouveau_drm_device_new() local
737 drm = kzalloc(sizeof(*drm), GFP_KERNEL); in nouveau_drm_device_new()
738 if (!drm) in nouveau_drm_device_new()
741 drm->nvkm = device; in nouveau_drm_device_new()
743 drm->dev = drm_dev_alloc(drm_driver, parent); in nouveau_drm_device_new()
744 if (IS_ERR(drm->dev)) { in nouveau_drm_device_new()
745 ret = PTR_ERR(drm->dev); in nouveau_drm_device_new()
749 drm->dev->dev_private = drm; in nouveau_drm_device_new()
750 dev_set_drvdata(parent, drm); in nouveau_drm_device_new()
752 nvif_parent_ctor(&nouveau_parent, &drm->parent); in nouveau_drm_device_new()
753 mutex_init(&drm->client_mutex); in nouveau_drm_device_new()
754 drm->_client.object.parent = &drm->parent; in nouveau_drm_device_new()
756 ret = nvif_driver_init(NULL, nouveau_config, nouveau_debug, "drm", in nouveau_drm_device_new()
757 nouveau_name(drm->dev), &drm->_client); in nouveau_drm_device_new()
761 ret = nvif_device_ctor(&drm->_client, "drmDevice", &drm->device); in nouveau_drm_device_new()
763 NV_ERROR(drm, "Device allocation failed: %d\n", ret); in nouveau_drm_device_new()
767 ret = nvif_device_map(&drm->device); in nouveau_drm_device_new()
769 NV_ERROR(drm, "Failed to map PRI: %d\n", ret); in nouveau_drm_device_new()
773 ret = nvif_mclass(&drm->device.object, mmus); in nouveau_drm_device_new()
775 NV_ERROR(drm, "No supported MMU class\n"); in nouveau_drm_device_new()
779 ret = nvif_mmu_ctor(&drm->device.object, "drmMmu", mmus[ret].oclass, &drm->mmu); in nouveau_drm_device_new()
781 NV_ERROR(drm, "MMU allocation failed: %d\n", ret); in nouveau_drm_device_new()
787 nouveau_drm_device_del(drm); in nouveau_drm_device_new()
788 drm = NULL; in nouveau_drm_device_new()
791 return ret ? ERR_PTR(ret) : drm; in nouveau_drm_device_new()
836 struct nouveau_drm *drm = pci_get_drvdata(pdev); in quirk_broken_nv_runpm() local
844 drm->old_pm_cap = pdev->pm_cap; in quirk_broken_nv_runpm()
846 NV_INFO(drm, "Disabling PCI power management to avoid bug\n"); in quirk_broken_nv_runpm()
855 struct nouveau_drm *drm; in nouveau_drm_probe() local
879 drm = nouveau_drm_device_new(&driver_pci, &pdev->dev, device); in nouveau_drm_probe()
880 if (IS_ERR(drm)) { in nouveau_drm_probe()
881 ret = PTR_ERR(drm); in nouveau_drm_probe()
889 ret = nouveau_drm_device_init(drm); in nouveau_drm_probe()
893 if (drm->client.device.info.ram_size <= 32 * 1024 * 1024) in nouveau_drm_probe()
898 drm_client_setup(drm->dev, format); in nouveau_drm_probe()
906 nouveau_drm_device_del(drm); in nouveau_drm_probe()
913 nouveau_drm_device_remove(struct nouveau_drm *drm) in nouveau_drm_device_remove() argument
915 struct nvkm_device *device = drm->nvkm; in nouveau_drm_device_remove()
917 drm_dev_unplug(drm->dev); in nouveau_drm_device_remove()
919 nouveau_drm_device_fini(drm); in nouveau_drm_device_remove()
920 nouveau_drm_device_del(drm); in nouveau_drm_device_remove()
927 struct nouveau_drm *drm = pci_get_drvdata(pdev); in nouveau_drm_remove() local
930 if (drm->old_pm_cap) in nouveau_drm_remove()
931 pdev->pm_cap = drm->old_pm_cap; in nouveau_drm_remove()
932 nouveau_drm_device_remove(drm); in nouveau_drm_remove()
937 nouveau_do_suspend(struct nouveau_drm *drm, bool runtime) in nouveau_do_suspend() argument
939 struct drm_device *dev = drm->dev; in nouveau_do_suspend()
943 nouveau_svm_suspend(drm); in nouveau_do_suspend()
944 nouveau_dmem_suspend(drm); in nouveau_do_suspend()
948 NV_DEBUG(drm, "suspending display...\n"); in nouveau_do_suspend()
954 NV_DEBUG(drm, "evicting buffers...\n"); in nouveau_do_suspend()
956 man = ttm_manager_type(&drm->ttm.bdev, TTM_PL_VRAM); in nouveau_do_suspend()
957 ttm_resource_manager_evict_all(&drm->ttm.bdev, man); in nouveau_do_suspend()
959 NV_DEBUG(drm, "waiting for kernel channels to go idle...\n"); in nouveau_do_suspend()
960 if (drm->cechan) { in nouveau_do_suspend()
961 ret = nouveau_channel_idle(drm->cechan); in nouveau_do_suspend()
966 if (drm->channel) { in nouveau_do_suspend()
967 ret = nouveau_channel_idle(drm->channel); in nouveau_do_suspend()
972 NV_DEBUG(drm, "suspending fence...\n"); in nouveau_do_suspend()
973 if (drm->fence && nouveau_fence(drm)->suspend) { in nouveau_do_suspend()
974 if (!nouveau_fence(drm)->suspend(drm)) { in nouveau_do_suspend()
980 NV_DEBUG(drm, "suspending object tree...\n"); in nouveau_do_suspend()
981 ret = nvif_client_suspend(&drm->_client); in nouveau_do_suspend()
988 if (drm->fence && nouveau_fence(drm)->resume) in nouveau_do_suspend()
989 nouveau_fence(drm)->resume(drm); in nouveau_do_suspend()
993 NV_DEBUG(drm, "resuming display...\n"); in nouveau_do_suspend()
1000 nouveau_do_resume(struct nouveau_drm *drm, bool runtime) in nouveau_do_resume() argument
1002 struct drm_device *dev = drm->dev; in nouveau_do_resume()
1005 NV_DEBUG(drm, "resuming object tree...\n"); in nouveau_do_resume()
1006 ret = nvif_client_resume(&drm->_client); in nouveau_do_resume()
1008 NV_ERROR(drm, "Client resume failed with error: %d\n", ret); in nouveau_do_resume()
1012 NV_DEBUG(drm, "resuming fence...\n"); in nouveau_do_resume()
1013 if (drm->fence && nouveau_fence(drm)->resume) in nouveau_do_resume()
1014 nouveau_fence(drm)->resume(drm); in nouveau_do_resume()
1019 NV_DEBUG(drm, "resuming display...\n"); in nouveau_do_resume()
1024 nouveau_dmem_resume(drm); in nouveau_do_resume()
1025 nouveau_svm_resume(drm); in nouveau_do_resume()
1033 struct nouveau_drm *drm = pci_get_drvdata(pdev); in nouveau_pmops_suspend() local
1036 if (drm->dev->switch_power_state == DRM_SWITCH_POWER_OFF || in nouveau_pmops_suspend()
1037 drm->dev->switch_power_state == DRM_SWITCH_POWER_DYNAMIC_OFF) in nouveau_pmops_suspend()
1040 ret = nouveau_do_suspend(drm, false); in nouveau_pmops_suspend()
1055 struct nouveau_drm *drm = pci_get_drvdata(pdev); in nouveau_pmops_resume() local
1058 if (drm->dev->switch_power_state == DRM_SWITCH_POWER_OFF || in nouveau_pmops_resume()
1059 drm->dev->switch_power_state == DRM_SWITCH_POWER_DYNAMIC_OFF) in nouveau_pmops_resume()
1069 ret = nouveau_do_resume(drm, false); in nouveau_pmops_resume()
1072 nouveau_display_hpd_resume(drm); in nouveau_pmops_resume()
1080 struct nouveau_drm *drm = dev_get_drvdata(dev); in nouveau_pmops_freeze() local
1082 return nouveau_do_suspend(drm, false); in nouveau_pmops_freeze()
1088 struct nouveau_drm *drm = dev_get_drvdata(dev); in nouveau_pmops_thaw() local
1090 return nouveau_do_resume(drm, false); in nouveau_pmops_thaw()
1105 struct nouveau_drm *drm = pci_get_drvdata(pdev); in nouveau_pmops_runtime_suspend() local
1114 ret = nouveau_do_suspend(drm, true); in nouveau_pmops_runtime_suspend()
1119 drm->dev->switch_power_state = DRM_SWITCH_POWER_DYNAMIC_OFF; in nouveau_pmops_runtime_suspend()
1127 struct nouveau_drm *drm = pci_get_drvdata(pdev); in nouveau_pmops_runtime_resume() local
1128 struct nvif_device *device = &drm->client.device; in nouveau_pmops_runtime_resume()
1143 ret = nouveau_do_resume(drm, true); in nouveau_pmops_runtime_resume()
1145 NV_ERROR(drm, "resume failed with: %d\n", ret); in nouveau_pmops_runtime_resume()
1151 drm->dev->switch_power_state = DRM_SWITCH_POWER_ON; in nouveau_pmops_runtime_resume()
1154 nouveau_display_hpd_resume(drm); in nouveau_pmops_runtime_resume()
1176 struct nouveau_drm *drm = nouveau_drm(dev); in nouveau_drm_open() local
1198 ret = nouveau_cli_init(drm, name, cli); in nouveau_drm_open()
1204 mutex_lock(&drm->clients_lock); in nouveau_drm_open()
1205 list_add(&cli->head, &drm->clients); in nouveau_drm_open()
1206 mutex_unlock(&drm->clients_lock); in nouveau_drm_open()
1223 struct nouveau_drm *drm = nouveau_drm(dev); in nouveau_drm_postclose() local
1242 mutex_lock(&drm->clients_lock); in nouveau_drm_postclose()
1244 mutex_unlock(&drm->clients_lock); in nouveau_drm_postclose()
1406 struct nouveau_drm *drm; in nouveau_platform_device_create() local
1413 drm = nouveau_drm_device_new(&driver_platform, &pdev->dev, *pdevice); in nouveau_platform_device_create()
1414 if (IS_ERR(drm)) { in nouveau_platform_device_create()
1415 err = PTR_ERR(drm); in nouveau_platform_device_create()
1419 err = nouveau_drm_device_init(drm); in nouveau_platform_device_create()
1423 return drm->dev; in nouveau_platform_device_create()
1426 nouveau_drm_device_del(drm); in nouveau_platform_device_create()