Lines Matching refs:drm
212 mutex_lock(&cli->drm->client_mutex); in nouveau_cli_fini()
214 mutex_unlock(&cli->drm->client_mutex); in nouveau_cli_fini()
218 nouveau_cli_init(struct nouveau_drm *drm, const char *sname, in nouveau_cli_init() argument
240 cli->drm = drm; in nouveau_cli_init()
247 mutex_lock(&drm->client_mutex); in nouveau_cli_init()
248 ret = nvif_client_ctor(&drm->_client, cli->name, &cli->base); in nouveau_cli_init()
249 mutex_unlock(&drm->client_mutex); in nouveau_cli_init()
261 cli->device.object.map.ptr = drm->device.object.map.ptr; in nouveau_cli_init()
263 ret = nvif_mmu_ctor(&cli->device.object, "drmMmu", drm->mmu.object.oclass, in nouveau_cli_init()
300 ret = nouveau_sched_create(&cli->sched, drm, NULL, 1); in nouveau_cli_init()
312 nouveau_accel_ce_fini(struct nouveau_drm *drm) in nouveau_accel_ce_fini() argument
314 nouveau_channel_idle(drm->cechan); in nouveau_accel_ce_fini()
315 nvif_object_dtor(&drm->ttm.copy); in nouveau_accel_ce_fini()
316 nouveau_channel_del(&drm->cechan); in nouveau_accel_ce_fini()
320 nouveau_accel_ce_init(struct nouveau_drm *drm) in nouveau_accel_ce_init() argument
322 struct nvif_device *device = &drm->client.device; in nouveau_accel_ce_init()
331 NV_DEBUG(drm, "no ce runlist\n"); in nouveau_accel_ce_init()
335 ret = nouveau_channel_new(&drm->client, true, runm, NvDmaFB, NvDmaTT, &drm->cechan); in nouveau_accel_ce_init()
337 NV_ERROR(drm, "failed to create ce channel, %d\n", ret); in nouveau_accel_ce_init()
341 nouveau_accel_gr_fini(struct nouveau_drm *drm) in nouveau_accel_gr_fini() argument
343 nouveau_channel_idle(drm->channel); in nouveau_accel_gr_fini()
344 nvif_object_dtor(&drm->ntfy); in nouveau_accel_gr_fini()
345 nvkm_gpuobj_del(&drm->notify); in nouveau_accel_gr_fini()
346 nouveau_channel_del(&drm->channel); in nouveau_accel_gr_fini()
350 nouveau_accel_gr_init(struct nouveau_drm *drm) in nouveau_accel_gr_init() argument
352 struct nvif_device *device = &drm->client.device; in nouveau_accel_gr_init()
359 NV_DEBUG(drm, "no gr runlist\n"); in nouveau_accel_gr_init()
363 ret = nouveau_channel_new(&drm->client, false, runm, NvDmaFB, NvDmaTT, &drm->channel); in nouveau_accel_gr_init()
365 NV_ERROR(drm, "failed to create kernel channel, %d\n", ret); in nouveau_accel_gr_init()
366 nouveau_accel_gr_fini(drm); in nouveau_accel_gr_init()
374 if (!drm->channel->nvsw.client && device->info.family < NV_DEVICE_INFO_V0_TESLA) { in nouveau_accel_gr_init()
375 ret = nvif_object_ctor(&drm->channel->user, "drmNvsw", in nouveau_accel_gr_init()
376 NVDRM_NVSW, nouveau_abi16_swclass(drm), in nouveau_accel_gr_init()
377 NULL, 0, &drm->channel->nvsw); in nouveau_accel_gr_init()
380 ret = nvif_object_ctor(&drm->channel->user, "drmBlit", in nouveau_accel_gr_init()
382 NULL, 0, &drm->channel->blit); in nouveau_accel_gr_init()
386 struct nvif_push *push = &drm->channel->chan.push; in nouveau_accel_gr_init()
391 PUSH_NVSQ(push, NV05F, 0x0000, drm->channel->blit.handle); in nouveau_accel_gr_init()
396 PUSH_NVSQ(push, NV_SW, 0x0000, drm->channel->nvsw.handle); in nouveau_accel_gr_init()
401 NV_ERROR(drm, "failed to allocate sw or blit class, %d\n", ret); in nouveau_accel_gr_init()
402 nouveau_accel_gr_fini(drm); in nouveau_accel_gr_init()
412 ret = nvkm_gpuobj_new(nvxx_device(drm), 32, 0, false, NULL, &drm->notify); in nouveau_accel_gr_init()
414 NV_ERROR(drm, "failed to allocate notifier, %d\n", ret); in nouveau_accel_gr_init()
415 nouveau_accel_gr_fini(drm); in nouveau_accel_gr_init()
419 ret = nvif_object_ctor(&drm->channel->user, "drmM2mfNtfy", in nouveau_accel_gr_init()
424 .start = drm->notify->addr, in nouveau_accel_gr_init()
425 .limit = drm->notify->addr + 31 in nouveau_accel_gr_init()
427 &drm->ntfy); in nouveau_accel_gr_init()
429 nouveau_accel_gr_fini(drm); in nouveau_accel_gr_init()
436 nouveau_accel_fini(struct nouveau_drm *drm) in nouveau_accel_fini() argument
438 nouveau_accel_ce_fini(drm); in nouveau_accel_fini()
439 nouveau_accel_gr_fini(drm); in nouveau_accel_fini()
440 if (drm->fence) in nouveau_accel_fini()
441 nouveau_fence(drm)->dtor(drm); in nouveau_accel_fini()
442 nouveau_channels_fini(drm); in nouveau_accel_fini()
446 nouveau_accel_init(struct nouveau_drm *drm) in nouveau_accel_init() argument
448 struct nvif_device *device = &drm->client.device; in nouveau_accel_init()
456 ret = nouveau_channels_init(drm); in nouveau_accel_init()
470 ret = nv04_fence_create(drm); in nouveau_accel_init()
473 ret = nv10_fence_create(drm); in nouveau_accel_init()
477 ret = nv17_fence_create(drm); in nouveau_accel_init()
480 ret = nv50_fence_create(drm); in nouveau_accel_init()
483 ret = nv84_fence_create(drm); in nouveau_accel_init()
494 ret = nvc0_fence_create(drm); in nouveau_accel_init()
503 NV_ERROR(drm, "failed to initialise sync subsystem, %d\n", ret); in nouveau_accel_init()
504 nouveau_accel_fini(drm); in nouveau_accel_init()
509 if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_VOLTA) { in nouveau_accel_init()
516 nouveau_accel_gr_init(drm); in nouveau_accel_init()
517 nouveau_accel_ce_init(drm); in nouveau_accel_init()
520 nouveau_bo_move_init(drm); in nouveau_accel_init()
526 struct nouveau_drm *drm = container_of(object->parent, typeof(*drm), parent); in nouveau_drm_errorf() local
533 NV_ERROR(drm, "%pV", &vaf); in nouveau_drm_errorf()
540 struct nouveau_drm *drm = container_of(object->parent, typeof(*drm), parent); in nouveau_drm_debugf() local
547 NV_DEBUG(drm, "%pV", &vaf); in nouveau_drm_debugf()
558 nouveau_drm_device_fini(struct nouveau_drm *drm) in nouveau_drm_device_fini() argument
560 struct drm_device *dev = drm->dev; in nouveau_drm_device_fini()
569 nouveau_dmem_fini(drm); in nouveau_drm_device_fini()
570 nouveau_svm_fini(drm); in nouveau_drm_device_fini()
572 nouveau_debugfs_fini(drm); in nouveau_drm_device_fini()
578 nouveau_accel_fini(drm); in nouveau_drm_device_fini()
581 nouveau_ttm_fini(drm); in nouveau_drm_device_fini()
582 nouveau_vga_fini(drm); in nouveau_drm_device_fini()
590 mutex_lock(&drm->clients_lock); in nouveau_drm_device_fini()
591 list_for_each_entry_safe(cli, temp_cli, &drm->clients, head) { in nouveau_drm_device_fini()
600 mutex_unlock(&drm->clients_lock); in nouveau_drm_device_fini()
602 nouveau_cli_fini(&drm->client); in nouveau_drm_device_fini()
603 destroy_workqueue(drm->sched_wq); in nouveau_drm_device_fini()
604 mutex_destroy(&drm->clients_lock); in nouveau_drm_device_fini()
608 nouveau_drm_device_init(struct nouveau_drm *drm) in nouveau_drm_device_init() argument
610 struct drm_device *dev = drm->dev; in nouveau_drm_device_init()
613 drm->sched_wq = alloc_workqueue("nouveau_sched_wq_shared", 0, in nouveau_drm_device_init()
615 if (!drm->sched_wq) in nouveau_drm_device_init()
618 ret = nouveau_cli_init(drm, "DRM", &drm->client); in nouveau_drm_device_init()
622 INIT_LIST_HEAD(&drm->clients); in nouveau_drm_device_init()
623 mutex_init(&drm->clients_lock); in nouveau_drm_device_init()
624 spin_lock_init(&drm->tile.lock); in nouveau_drm_device_init()
630 if (drm->client.device.info.chipset == 0xc1) in nouveau_drm_device_init()
631 nvif_mask(&drm->client.device.object, 0x00088080, 0x00000800, 0x00000000); in nouveau_drm_device_init()
633 nouveau_vga_init(drm); in nouveau_drm_device_init()
635 ret = nouveau_ttm_init(drm); in nouveau_drm_device_init()
643 nouveau_accel_init(drm); in nouveau_drm_device_init()
655 nouveau_debugfs_init(drm); in nouveau_drm_device_init()
657 nouveau_svm_init(drm); in nouveau_drm_device_init()
658 nouveau_dmem_init(drm); in nouveau_drm_device_init()
670 ret = drm_dev_register(drm->dev, 0); in nouveau_drm_device_init()
672 nouveau_drm_device_fini(drm); in nouveau_drm_device_init()
680 nouveau_accel_fini(drm); in nouveau_drm_device_init()
683 nouveau_ttm_fini(drm); in nouveau_drm_device_init()
685 nouveau_vga_fini(drm); in nouveau_drm_device_init()
686 nouveau_cli_fini(&drm->client); in nouveau_drm_device_init()
688 destroy_workqueue(drm->sched_wq); in nouveau_drm_device_init()
693 nouveau_drm_device_del(struct nouveau_drm *drm) in nouveau_drm_device_del() argument
695 if (drm->dev) in nouveau_drm_device_del()
696 drm_dev_put(drm->dev); in nouveau_drm_device_del()
698 nvif_mmu_dtor(&drm->mmu); in nouveau_drm_device_del()
699 nvif_device_dtor(&drm->device); in nouveau_drm_device_del()
700 nvif_client_dtor(&drm->_client); in nouveau_drm_device_del()
701 nvif_parent_dtor(&drm->parent); in nouveau_drm_device_del()
703 mutex_destroy(&drm->client_mutex); in nouveau_drm_device_del()
704 kfree(drm); in nouveau_drm_device_del()
718 struct nouveau_drm *drm; in nouveau_drm_device_new() local
721 drm = kzalloc(sizeof(*drm), GFP_KERNEL); in nouveau_drm_device_new()
722 if (!drm) in nouveau_drm_device_new()
725 drm->nvkm = device; in nouveau_drm_device_new()
727 drm->dev = drm_dev_alloc(drm_driver, parent); in nouveau_drm_device_new()
728 if (IS_ERR(drm->dev)) { in nouveau_drm_device_new()
729 ret = PTR_ERR(drm->dev); in nouveau_drm_device_new()
733 drm->dev->dev_private = drm; in nouveau_drm_device_new()
734 dev_set_drvdata(parent, drm); in nouveau_drm_device_new()
736 nvif_parent_ctor(&nouveau_parent, &drm->parent); in nouveau_drm_device_new()
737 mutex_init(&drm->client_mutex); in nouveau_drm_device_new()
738 drm->_client.object.parent = &drm->parent; in nouveau_drm_device_new()
741 nouveau_name(drm->dev), &drm->_client); in nouveau_drm_device_new()
745 ret = nvif_device_ctor(&drm->_client, "drmDevice", &drm->device); in nouveau_drm_device_new()
747 NV_ERROR(drm, "Device allocation failed: %d\n", ret); in nouveau_drm_device_new()
751 ret = nvif_device_map(&drm->device); in nouveau_drm_device_new()
753 NV_ERROR(drm, "Failed to map PRI: %d\n", ret); in nouveau_drm_device_new()
757 ret = nvif_mclass(&drm->device.object, mmus); in nouveau_drm_device_new()
759 NV_ERROR(drm, "No supported MMU class\n"); in nouveau_drm_device_new()
763 ret = nvif_mmu_ctor(&drm->device.object, "drmMmu", mmus[ret].oclass, &drm->mmu); in nouveau_drm_device_new()
765 NV_ERROR(drm, "MMU allocation failed: %d\n", ret); in nouveau_drm_device_new()
771 nouveau_drm_device_del(drm); in nouveau_drm_device_new()
772 drm = NULL; in nouveau_drm_device_new()
775 return ret ? ERR_PTR(ret) : drm; in nouveau_drm_device_new()
820 struct nouveau_drm *drm = pci_get_drvdata(pdev); in quirk_broken_nv_runpm() local
828 drm->old_pm_cap = pdev->pm_cap; in quirk_broken_nv_runpm()
830 NV_INFO(drm, "Disabling PCI power management to avoid bug\n"); in quirk_broken_nv_runpm()
839 struct nouveau_drm *drm; in nouveau_drm_probe() local
863 drm = nouveau_drm_device_new(&driver_pci, &pdev->dev, device); in nouveau_drm_probe()
864 if (IS_ERR(drm)) { in nouveau_drm_probe()
865 ret = PTR_ERR(drm); in nouveau_drm_probe()
873 ret = nouveau_drm_device_init(drm); in nouveau_drm_probe()
877 if (drm->client.device.info.ram_size <= 32 * 1024 * 1024) in nouveau_drm_probe()
882 drm_client_setup(drm->dev, format); in nouveau_drm_probe()
890 nouveau_drm_device_del(drm); in nouveau_drm_probe()
897 nouveau_drm_device_remove(struct nouveau_drm *drm) in nouveau_drm_device_remove() argument
899 struct nvkm_device *device = drm->nvkm; in nouveau_drm_device_remove()
901 drm_dev_unplug(drm->dev); in nouveau_drm_device_remove()
903 nouveau_drm_device_fini(drm); in nouveau_drm_device_remove()
904 nouveau_drm_device_del(drm); in nouveau_drm_device_remove()
911 struct nouveau_drm *drm = pci_get_drvdata(pdev); in nouveau_drm_remove() local
914 if (drm->old_pm_cap) in nouveau_drm_remove()
915 pdev->pm_cap = drm->old_pm_cap; in nouveau_drm_remove()
916 nouveau_drm_device_remove(drm); in nouveau_drm_remove()
921 nouveau_do_suspend(struct nouveau_drm *drm, bool runtime) in nouveau_do_suspend() argument
923 struct drm_device *dev = drm->dev; in nouveau_do_suspend()
927 nouveau_svm_suspend(drm); in nouveau_do_suspend()
928 nouveau_dmem_suspend(drm); in nouveau_do_suspend()
932 NV_DEBUG(drm, "suspending display...\n"); in nouveau_do_suspend()
938 NV_DEBUG(drm, "evicting buffers...\n"); in nouveau_do_suspend()
940 man = ttm_manager_type(&drm->ttm.bdev, TTM_PL_VRAM); in nouveau_do_suspend()
941 ttm_resource_manager_evict_all(&drm->ttm.bdev, man); in nouveau_do_suspend()
943 NV_DEBUG(drm, "waiting for kernel channels to go idle...\n"); in nouveau_do_suspend()
944 if (drm->cechan) { in nouveau_do_suspend()
945 ret = nouveau_channel_idle(drm->cechan); in nouveau_do_suspend()
950 if (drm->channel) { in nouveau_do_suspend()
951 ret = nouveau_channel_idle(drm->channel); in nouveau_do_suspend()
956 NV_DEBUG(drm, "suspending fence...\n"); in nouveau_do_suspend()
957 if (drm->fence && nouveau_fence(drm)->suspend) { in nouveau_do_suspend()
958 if (!nouveau_fence(drm)->suspend(drm)) { in nouveau_do_suspend()
964 NV_DEBUG(drm, "suspending object tree...\n"); in nouveau_do_suspend()
965 ret = nvif_client_suspend(&drm->_client); in nouveau_do_suspend()
972 if (drm->fence && nouveau_fence(drm)->resume) in nouveau_do_suspend()
973 nouveau_fence(drm)->resume(drm); in nouveau_do_suspend()
977 NV_DEBUG(drm, "resuming display...\n"); in nouveau_do_suspend()
984 nouveau_do_resume(struct nouveau_drm *drm, bool runtime) in nouveau_do_resume() argument
986 struct drm_device *dev = drm->dev; in nouveau_do_resume()
989 NV_DEBUG(drm, "resuming object tree...\n"); in nouveau_do_resume()
990 ret = nvif_client_resume(&drm->_client); in nouveau_do_resume()
992 NV_ERROR(drm, "Client resume failed with error: %d\n", ret); in nouveau_do_resume()
996 NV_DEBUG(drm, "resuming fence...\n"); in nouveau_do_resume()
997 if (drm->fence && nouveau_fence(drm)->resume) in nouveau_do_resume()
998 nouveau_fence(drm)->resume(drm); in nouveau_do_resume()
1003 NV_DEBUG(drm, "resuming display...\n"); in nouveau_do_resume()
1008 nouveau_dmem_resume(drm); in nouveau_do_resume()
1009 nouveau_svm_resume(drm); in nouveau_do_resume()
1017 struct nouveau_drm *drm = pci_get_drvdata(pdev); in nouveau_pmops_suspend() local
1020 if (drm->dev->switch_power_state == DRM_SWITCH_POWER_OFF || in nouveau_pmops_suspend()
1021 drm->dev->switch_power_state == DRM_SWITCH_POWER_DYNAMIC_OFF) in nouveau_pmops_suspend()
1024 ret = nouveau_do_suspend(drm, false); in nouveau_pmops_suspend()
1039 struct nouveau_drm *drm = pci_get_drvdata(pdev); in nouveau_pmops_resume() local
1042 if (drm->dev->switch_power_state == DRM_SWITCH_POWER_OFF || in nouveau_pmops_resume()
1043 drm->dev->switch_power_state == DRM_SWITCH_POWER_DYNAMIC_OFF) in nouveau_pmops_resume()
1053 ret = nouveau_do_resume(drm, false); in nouveau_pmops_resume()
1056 nouveau_display_hpd_resume(drm); in nouveau_pmops_resume()
1064 struct nouveau_drm *drm = dev_get_drvdata(dev); in nouveau_pmops_freeze() local
1066 return nouveau_do_suspend(drm, false); in nouveau_pmops_freeze()
1072 struct nouveau_drm *drm = dev_get_drvdata(dev); in nouveau_pmops_thaw() local
1074 return nouveau_do_resume(drm, false); in nouveau_pmops_thaw()
1089 struct nouveau_drm *drm = pci_get_drvdata(pdev); in nouveau_pmops_runtime_suspend() local
1098 ret = nouveau_do_suspend(drm, true); in nouveau_pmops_runtime_suspend()
1103 drm->dev->switch_power_state = DRM_SWITCH_POWER_DYNAMIC_OFF; in nouveau_pmops_runtime_suspend()
1111 struct nouveau_drm *drm = pci_get_drvdata(pdev); in nouveau_pmops_runtime_resume() local
1112 struct nvif_device *device = &drm->client.device; in nouveau_pmops_runtime_resume()
1127 ret = nouveau_do_resume(drm, true); in nouveau_pmops_runtime_resume()
1129 NV_ERROR(drm, "resume failed with: %d\n", ret); in nouveau_pmops_runtime_resume()
1135 drm->dev->switch_power_state = DRM_SWITCH_POWER_ON; in nouveau_pmops_runtime_resume()
1138 nouveau_display_hpd_resume(drm); in nouveau_pmops_runtime_resume()
1160 struct nouveau_drm *drm = nouveau_drm(dev); in nouveau_drm_open() local
1183 ret = nouveau_cli_init(drm, name, cli); in nouveau_drm_open()
1189 mutex_lock(&drm->clients_lock); in nouveau_drm_open()
1190 list_add(&cli->head, &drm->clients); in nouveau_drm_open()
1191 mutex_unlock(&drm->clients_lock); in nouveau_drm_open()
1208 struct nouveau_drm *drm = nouveau_drm(dev); in nouveau_drm_postclose() local
1227 mutex_lock(&drm->clients_lock); in nouveau_drm_postclose()
1229 mutex_unlock(&drm->clients_lock); in nouveau_drm_postclose()
1396 struct nouveau_drm *drm; in nouveau_platform_device_create() local
1403 drm = nouveau_drm_device_new(&driver_platform, &pdev->dev, *pdevice); in nouveau_platform_device_create()
1404 if (IS_ERR(drm)) { in nouveau_platform_device_create()
1405 err = PTR_ERR(drm); in nouveau_platform_device_create()
1409 err = nouveau_drm_device_init(drm); in nouveau_platform_device_create()
1413 return drm->dev; in nouveau_platform_device_create()
1416 nouveau_drm_device_del(drm); in nouveau_platform_device_create()