Lines Matching full:drm
33 #include <drm/drm_aperture.h>
34 #include <drm/drm_drv.h>
35 #include <drm/drm_fbdev_ttm.h>
36 #include <drm/drm_gem_ttm_helper.h>
37 #include <drm/drm_ioctl.h>
38 #include <drm/drm_vblank.h>
211 mutex_lock(&cli->drm->client_mutex); in nouveau_cli_fini()
213 mutex_unlock(&cli->drm->client_mutex); in nouveau_cli_fini()
217 nouveau_cli_init(struct nouveau_drm *drm, const char *sname, in nouveau_cli_init() argument
239 cli->drm = drm; in nouveau_cli_init()
246 mutex_lock(&drm->client_mutex); in nouveau_cli_init()
247 ret = nvif_client_ctor(&drm->_client, cli->name, &cli->base); in nouveau_cli_init()
248 mutex_unlock(&drm->client_mutex); in nouveau_cli_init()
260 cli->device.object.map.ptr = drm->device.object.map.ptr; in nouveau_cli_init()
262 ret = nvif_mmu_ctor(&cli->device.object, "drmMmu", drm->mmu.object.oclass, in nouveau_cli_init()
299 ret = nouveau_sched_create(&cli->sched, drm, NULL, 1); in nouveau_cli_init()
311 nouveau_accel_ce_fini(struct nouveau_drm *drm) in nouveau_accel_ce_fini() argument
313 nouveau_channel_idle(drm->cechan); in nouveau_accel_ce_fini()
314 nvif_object_dtor(&drm->ttm.copy); in nouveau_accel_ce_fini()
315 nouveau_channel_del(&drm->cechan); in nouveau_accel_ce_fini()
319 nouveau_accel_ce_init(struct nouveau_drm *drm) in nouveau_accel_ce_init() argument
321 struct nvif_device *device = &drm->client.device; in nouveau_accel_ce_init()
330 NV_DEBUG(drm, "no ce runlist\n"); in nouveau_accel_ce_init()
334 ret = nouveau_channel_new(&drm->client, true, runm, NvDmaFB, NvDmaTT, &drm->cechan); in nouveau_accel_ce_init()
336 NV_ERROR(drm, "failed to create ce channel, %d\n", ret); in nouveau_accel_ce_init()
340 nouveau_accel_gr_fini(struct nouveau_drm *drm) in nouveau_accel_gr_fini() argument
342 nouveau_channel_idle(drm->channel); in nouveau_accel_gr_fini()
343 nvif_object_dtor(&drm->ntfy); in nouveau_accel_gr_fini()
344 nvkm_gpuobj_del(&drm->notify); in nouveau_accel_gr_fini()
345 nouveau_channel_del(&drm->channel); in nouveau_accel_gr_fini()
349 nouveau_accel_gr_init(struct nouveau_drm *drm) in nouveau_accel_gr_init() argument
351 struct nvif_device *device = &drm->client.device; in nouveau_accel_gr_init()
358 NV_DEBUG(drm, "no gr runlist\n"); in nouveau_accel_gr_init()
362 ret = nouveau_channel_new(&drm->client, false, runm, NvDmaFB, NvDmaTT, &drm->channel); in nouveau_accel_gr_init()
364 NV_ERROR(drm, "failed to create kernel channel, %d\n", ret); in nouveau_accel_gr_init()
365 nouveau_accel_gr_fini(drm); in nouveau_accel_gr_init()
373 if (!drm->channel->nvsw.client && device->info.family < NV_DEVICE_INFO_V0_TESLA) { in nouveau_accel_gr_init()
374 ret = nvif_object_ctor(&drm->channel->user, "drmNvsw", in nouveau_accel_gr_init()
375 NVDRM_NVSW, nouveau_abi16_swclass(drm), in nouveau_accel_gr_init()
376 NULL, 0, &drm->channel->nvsw); in nouveau_accel_gr_init()
379 ret = nvif_object_ctor(&drm->channel->user, "drmBlit", in nouveau_accel_gr_init()
381 NULL, 0, &drm->channel->blit); in nouveau_accel_gr_init()
385 struct nvif_push *push = &drm->channel->chan.push; in nouveau_accel_gr_init()
390 PUSH_NVSQ(push, NV05F, 0x0000, drm->channel->blit.handle); in nouveau_accel_gr_init()
395 PUSH_NVSQ(push, NV_SW, 0x0000, drm->channel->nvsw.handle); in nouveau_accel_gr_init()
400 NV_ERROR(drm, "failed to allocate sw or blit class, %d\n", ret); in nouveau_accel_gr_init()
401 nouveau_accel_gr_fini(drm); in nouveau_accel_gr_init()
411 ret = nvkm_gpuobj_new(nvxx_device(drm), 32, 0, false, NULL, &drm->notify); in nouveau_accel_gr_init()
413 NV_ERROR(drm, "failed to allocate notifier, %d\n", ret); in nouveau_accel_gr_init()
414 nouveau_accel_gr_fini(drm); in nouveau_accel_gr_init()
418 ret = nvif_object_ctor(&drm->channel->user, "drmM2mfNtfy", in nouveau_accel_gr_init()
423 .start = drm->notify->addr, in nouveau_accel_gr_init()
424 .limit = drm->notify->addr + 31 in nouveau_accel_gr_init()
426 &drm->ntfy); in nouveau_accel_gr_init()
428 nouveau_accel_gr_fini(drm); in nouveau_accel_gr_init()
435 nouveau_accel_fini(struct nouveau_drm *drm) in nouveau_accel_fini() argument
437 nouveau_accel_ce_fini(drm); in nouveau_accel_fini()
438 nouveau_accel_gr_fini(drm); in nouveau_accel_fini()
439 if (drm->fence) in nouveau_accel_fini()
440 nouveau_fence(drm)->dtor(drm); in nouveau_accel_fini()
441 nouveau_channels_fini(drm); in nouveau_accel_fini()
445 nouveau_accel_init(struct nouveau_drm *drm) in nouveau_accel_init() argument
447 struct nvif_device *device = &drm->client.device; in nouveau_accel_init()
455 ret = nouveau_channels_init(drm); in nouveau_accel_init()
469 ret = nv04_fence_create(drm); in nouveau_accel_init()
472 ret = nv10_fence_create(drm); in nouveau_accel_init()
476 ret = nv17_fence_create(drm); in nouveau_accel_init()
479 ret = nv50_fence_create(drm); in nouveau_accel_init()
482 ret = nv84_fence_create(drm); in nouveau_accel_init()
493 ret = nvc0_fence_create(drm); in nouveau_accel_init()
502 NV_ERROR(drm, "failed to initialise sync subsystem, %d\n", ret); in nouveau_accel_init()
503 nouveau_accel_fini(drm); in nouveau_accel_init()
508 if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_VOLTA) { in nouveau_accel_init()
515 nouveau_accel_gr_init(drm); in nouveau_accel_init()
516 nouveau_accel_ce_init(drm); in nouveau_accel_init()
519 nouveau_bo_move_init(drm); in nouveau_accel_init()
525 struct nouveau_drm *drm = container_of(object->parent, typeof(*drm), parent); in nouveau_drm_errorf() local
532 NV_ERROR(drm, "%pV", &vaf); in nouveau_drm_errorf()
539 struct nouveau_drm *drm = container_of(object->parent, typeof(*drm), parent); in nouveau_drm_debugf() local
546 NV_DEBUG(drm, "%pV", &vaf); in nouveau_drm_debugf()
557 nouveau_drm_device_fini(struct nouveau_drm *drm) in nouveau_drm_device_fini() argument
559 struct drm_device *dev = drm->dev; in nouveau_drm_device_fini()
568 nouveau_dmem_fini(drm); in nouveau_drm_device_fini()
569 nouveau_svm_fini(drm); in nouveau_drm_device_fini()
571 nouveau_debugfs_fini(drm); in nouveau_drm_device_fini()
577 nouveau_accel_fini(drm); in nouveau_drm_device_fini()
580 nouveau_ttm_fini(drm); in nouveau_drm_device_fini()
581 nouveau_vga_fini(drm); in nouveau_drm_device_fini()
589 mutex_lock(&drm->clients_lock); in nouveau_drm_device_fini()
590 list_for_each_entry_safe(cli, temp_cli, &drm->clients, head) { in nouveau_drm_device_fini()
599 mutex_unlock(&drm->clients_lock); in nouveau_drm_device_fini()
601 nouveau_cli_fini(&drm->client); in nouveau_drm_device_fini()
602 destroy_workqueue(drm->sched_wq); in nouveau_drm_device_fini()
603 mutex_destroy(&drm->clients_lock); in nouveau_drm_device_fini()
607 nouveau_drm_device_init(struct nouveau_drm *drm) in nouveau_drm_device_init() argument
609 struct drm_device *dev = drm->dev; in nouveau_drm_device_init()
612 drm->sched_wq = alloc_workqueue("nouveau_sched_wq_shared", 0, in nouveau_drm_device_init()
614 if (!drm->sched_wq) in nouveau_drm_device_init()
617 ret = nouveau_cli_init(drm, "DRM", &drm->client); in nouveau_drm_device_init()
621 INIT_LIST_HEAD(&drm->clients); in nouveau_drm_device_init()
622 mutex_init(&drm->clients_lock); in nouveau_drm_device_init()
623 spin_lock_init(&drm->tile.lock); in nouveau_drm_device_init()
629 if (drm->client.device.info.chipset == 0xc1) in nouveau_drm_device_init()
630 nvif_mask(&drm->client.device.object, 0x00088080, 0x00000800, 0x00000000); in nouveau_drm_device_init()
632 nouveau_vga_init(drm); in nouveau_drm_device_init()
634 ret = nouveau_ttm_init(drm); in nouveau_drm_device_init()
642 nouveau_accel_init(drm); in nouveau_drm_device_init()
654 nouveau_debugfs_init(drm); in nouveau_drm_device_init()
656 nouveau_svm_init(drm); in nouveau_drm_device_init()
657 nouveau_dmem_init(drm); in nouveau_drm_device_init()
669 ret = drm_dev_register(drm->dev, 0); in nouveau_drm_device_init()
671 nouveau_drm_device_fini(drm); in nouveau_drm_device_init()
679 nouveau_accel_fini(drm); in nouveau_drm_device_init()
682 nouveau_ttm_fini(drm); in nouveau_drm_device_init()
684 nouveau_vga_fini(drm); in nouveau_drm_device_init()
685 nouveau_cli_fini(&drm->client); in nouveau_drm_device_init()
687 destroy_workqueue(drm->sched_wq); in nouveau_drm_device_init()
692 nouveau_drm_device_del(struct nouveau_drm *drm) in nouveau_drm_device_del() argument
694 if (drm->dev) in nouveau_drm_device_del()
695 drm_dev_put(drm->dev); in nouveau_drm_device_del()
697 nvif_mmu_dtor(&drm->mmu); in nouveau_drm_device_del()
698 nvif_device_dtor(&drm->device); in nouveau_drm_device_del()
699 nvif_client_dtor(&drm->_client); in nouveau_drm_device_del()
700 nvif_parent_dtor(&drm->parent); in nouveau_drm_device_del()
702 mutex_destroy(&drm->client_mutex); in nouveau_drm_device_del()
703 kfree(drm); in nouveau_drm_device_del()
717 struct nouveau_drm *drm; in nouveau_drm_device_new() local
720 drm = kzalloc(sizeof(*drm), GFP_KERNEL); in nouveau_drm_device_new()
721 if (!drm) in nouveau_drm_device_new()
724 drm->nvkm = device; in nouveau_drm_device_new()
726 drm->dev = drm_dev_alloc(drm_driver, parent); in nouveau_drm_device_new()
727 if (IS_ERR(drm->dev)) { in nouveau_drm_device_new()
728 ret = PTR_ERR(drm->dev); in nouveau_drm_device_new()
732 drm->dev->dev_private = drm; in nouveau_drm_device_new()
733 dev_set_drvdata(parent, drm); in nouveau_drm_device_new()
735 nvif_parent_ctor(&nouveau_parent, &drm->parent); in nouveau_drm_device_new()
736 mutex_init(&drm->client_mutex); in nouveau_drm_device_new()
737 drm->_client.object.parent = &drm->parent; in nouveau_drm_device_new()
739 ret = nvif_driver_init(NULL, nouveau_config, nouveau_debug, "drm", in nouveau_drm_device_new()
740 nouveau_name(drm->dev), &drm->_client); in nouveau_drm_device_new()
744 ret = nvif_device_ctor(&drm->_client, "drmDevice", &drm->device); in nouveau_drm_device_new()
746 NV_ERROR(drm, "Device allocation failed: %d\n", ret); in nouveau_drm_device_new()
750 ret = nvif_device_map(&drm->device); in nouveau_drm_device_new()
752 NV_ERROR(drm, "Failed to map PRI: %d\n", ret); in nouveau_drm_device_new()
756 ret = nvif_mclass(&drm->device.object, mmus); in nouveau_drm_device_new()
758 NV_ERROR(drm, "No supported MMU class\n"); in nouveau_drm_device_new()
762 ret = nvif_mmu_ctor(&drm->device.object, "drmMmu", mmus[ret].oclass, &drm->mmu); in nouveau_drm_device_new()
764 NV_ERROR(drm, "MMU allocation failed: %d\n", ret); in nouveau_drm_device_new()
770 nouveau_drm_device_del(drm); in nouveau_drm_device_new()
771 drm = NULL; in nouveau_drm_device_new()
774 return ret ? ERR_PTR(ret) : drm; in nouveau_drm_device_new()
819 struct nouveau_drm *drm = pci_get_drvdata(pdev); in quirk_broken_nv_runpm() local
827 drm->old_pm_cap = pdev->pm_cap; in quirk_broken_nv_runpm()
829 NV_INFO(drm, "Disabling PCI power management to avoid bug\n"); in quirk_broken_nv_runpm()
838 struct nouveau_drm *drm; in nouveau_drm_probe() local
861 drm = nouveau_drm_device_new(&driver_pci, &pdev->dev, device); in nouveau_drm_probe()
862 if (IS_ERR(drm)) { in nouveau_drm_probe()
863 ret = PTR_ERR(drm); in nouveau_drm_probe()
871 ret = nouveau_drm_device_init(drm); in nouveau_drm_probe()
875 if (drm->client.device.info.ram_size <= 32 * 1024 * 1024) in nouveau_drm_probe()
876 drm_fbdev_ttm_setup(drm->dev, 8); in nouveau_drm_probe()
878 drm_fbdev_ttm_setup(drm->dev, 32); in nouveau_drm_probe()
886 nouveau_drm_device_del(drm); in nouveau_drm_probe()
893 nouveau_drm_device_remove(struct nouveau_drm *drm) in nouveau_drm_device_remove() argument
895 struct nvkm_device *device = drm->nvkm; in nouveau_drm_device_remove()
897 drm_dev_unplug(drm->dev); in nouveau_drm_device_remove()
899 nouveau_drm_device_fini(drm); in nouveau_drm_device_remove()
900 nouveau_drm_device_del(drm); in nouveau_drm_device_remove()
907 struct nouveau_drm *drm = pci_get_drvdata(pdev); in nouveau_drm_remove() local
910 if (drm->old_pm_cap) in nouveau_drm_remove()
911 pdev->pm_cap = drm->old_pm_cap; in nouveau_drm_remove()
912 nouveau_drm_device_remove(drm); in nouveau_drm_remove()
917 nouveau_do_suspend(struct nouveau_drm *drm, bool runtime) in nouveau_do_suspend() argument
919 struct drm_device *dev = drm->dev; in nouveau_do_suspend()
923 nouveau_svm_suspend(drm); in nouveau_do_suspend()
924 nouveau_dmem_suspend(drm); in nouveau_do_suspend()
928 NV_DEBUG(drm, "suspending display...\n"); in nouveau_do_suspend()
934 NV_DEBUG(drm, "evicting buffers...\n"); in nouveau_do_suspend()
936 man = ttm_manager_type(&drm->ttm.bdev, TTM_PL_VRAM); in nouveau_do_suspend()
937 ttm_resource_manager_evict_all(&drm->ttm.bdev, man); in nouveau_do_suspend()
939 NV_DEBUG(drm, "waiting for kernel channels to go idle...\n"); in nouveau_do_suspend()
940 if (drm->cechan) { in nouveau_do_suspend()
941 ret = nouveau_channel_idle(drm->cechan); in nouveau_do_suspend()
946 if (drm->channel) { in nouveau_do_suspend()
947 ret = nouveau_channel_idle(drm->channel); in nouveau_do_suspend()
952 NV_DEBUG(drm, "suspending fence...\n"); in nouveau_do_suspend()
953 if (drm->fence && nouveau_fence(drm)->suspend) { in nouveau_do_suspend()
954 if (!nouveau_fence(drm)->suspend(drm)) { in nouveau_do_suspend()
960 NV_DEBUG(drm, "suspending object tree...\n"); in nouveau_do_suspend()
961 ret = nvif_client_suspend(&drm->_client); in nouveau_do_suspend()
968 if (drm->fence && nouveau_fence(drm)->resume) in nouveau_do_suspend()
969 nouveau_fence(drm)->resume(drm); in nouveau_do_suspend()
973 NV_DEBUG(drm, "resuming display...\n"); in nouveau_do_suspend()
980 nouveau_do_resume(struct nouveau_drm *drm, bool runtime) in nouveau_do_resume() argument
982 struct drm_device *dev = drm->dev; in nouveau_do_resume()
985 NV_DEBUG(drm, "resuming object tree...\n"); in nouveau_do_resume()
986 ret = nvif_client_resume(&drm->_client); in nouveau_do_resume()
988 NV_ERROR(drm, "Client resume failed with error: %d\n", ret); in nouveau_do_resume()
992 NV_DEBUG(drm, "resuming fence...\n"); in nouveau_do_resume()
993 if (drm->fence && nouveau_fence(drm)->resume) in nouveau_do_resume()
994 nouveau_fence(drm)->resume(drm); in nouveau_do_resume()
999 NV_DEBUG(drm, "resuming display...\n"); in nouveau_do_resume()
1004 nouveau_dmem_resume(drm); in nouveau_do_resume()
1005 nouveau_svm_resume(drm); in nouveau_do_resume()
1013 struct nouveau_drm *drm = pci_get_drvdata(pdev); in nouveau_pmops_suspend() local
1016 if (drm->dev->switch_power_state == DRM_SWITCH_POWER_OFF || in nouveau_pmops_suspend()
1017 drm->dev->switch_power_state == DRM_SWITCH_POWER_DYNAMIC_OFF) in nouveau_pmops_suspend()
1020 ret = nouveau_do_suspend(drm, false); in nouveau_pmops_suspend()
1035 struct nouveau_drm *drm = pci_get_drvdata(pdev); in nouveau_pmops_resume() local
1038 if (drm->dev->switch_power_state == DRM_SWITCH_POWER_OFF || in nouveau_pmops_resume()
1039 drm->dev->switch_power_state == DRM_SWITCH_POWER_DYNAMIC_OFF) in nouveau_pmops_resume()
1049 ret = nouveau_do_resume(drm, false); in nouveau_pmops_resume()
1052 nouveau_display_hpd_resume(drm); in nouveau_pmops_resume()
1060 struct nouveau_drm *drm = dev_get_drvdata(dev); in nouveau_pmops_freeze() local
1062 return nouveau_do_suspend(drm, false); in nouveau_pmops_freeze()
1068 struct nouveau_drm *drm = dev_get_drvdata(dev); in nouveau_pmops_thaw() local
1070 return nouveau_do_resume(drm, false); in nouveau_pmops_thaw()
1085 struct nouveau_drm *drm = pci_get_drvdata(pdev); in nouveau_pmops_runtime_suspend() local
1094 ret = nouveau_do_suspend(drm, true); in nouveau_pmops_runtime_suspend()
1099 drm->dev->switch_power_state = DRM_SWITCH_POWER_DYNAMIC_OFF; in nouveau_pmops_runtime_suspend()
1107 struct nouveau_drm *drm = pci_get_drvdata(pdev); in nouveau_pmops_runtime_resume() local
1108 struct nvif_device *device = &drm->client.device; in nouveau_pmops_runtime_resume()
1123 ret = nouveau_do_resume(drm, true); in nouveau_pmops_runtime_resume()
1125 NV_ERROR(drm, "resume failed with: %d\n", ret); in nouveau_pmops_runtime_resume()
1131 drm->dev->switch_power_state = DRM_SWITCH_POWER_ON; in nouveau_pmops_runtime_resume()
1134 nouveau_display_hpd_resume(drm); in nouveau_pmops_runtime_resume()
1156 struct nouveau_drm *drm = nouveau_drm(dev); in nouveau_drm_open() local
1179 ret = nouveau_cli_init(drm, name, cli); in nouveau_drm_open()
1185 mutex_lock(&drm->clients_lock); in nouveau_drm_open()
1186 list_add(&cli->head, &drm->clients); in nouveau_drm_open()
1187 mutex_unlock(&drm->clients_lock); in nouveau_drm_open()
1204 struct nouveau_drm *drm = nouveau_drm(dev); in nouveau_drm_postclose() local
1223 mutex_lock(&drm->clients_lock); in nouveau_drm_postclose()
1225 mutex_unlock(&drm->clients_lock); in nouveau_drm_postclose()
1390 struct nouveau_drm *drm; in nouveau_platform_device_create() local
1397 drm = nouveau_drm_device_new(&driver_platform, &pdev->dev, *pdevice); in nouveau_platform_device_create()
1398 if (IS_ERR(drm)) { in nouveau_platform_device_create()
1399 err = PTR_ERR(drm); in nouveau_platform_device_create()
1403 err = nouveau_drm_device_init(drm); in nouveau_platform_device_create()
1407 return drm->dev; in nouveau_platform_device_create()
1410 nouveau_drm_device_del(drm); in nouveau_platform_device_create()