Lines Matching +full:freeze +full:- +full:bridge +full:- +full:controller
103 int nouveau_modeset = -1;
110 MODULE_PARM_DESC(runpm, "disable (0), force enable (1), optimus only default (-1)");
111 static int nouveau_runtime_pm = -1;
122 * gsp_logs - list of nvif_log GSP-RM logging buffers
125 * upon GSP shutdown if the "keep_gsp_logging" command-line parameter is
127 * GSP-RM logs.
135 u64 name = (u64)pci_domain_nr(pdev->bus) << 32; in nouveau_pci_name()
136 name |= pdev->bus->number << 16; in nouveau_pci_name()
137 name |= PCI_SLOT(pdev->devfn) << 8; in nouveau_pci_name()
138 return name | PCI_FUNC(pdev->devfn); in nouveau_pci_name()
144 return platformdev->id; in nouveau_platform_name()
150 if (dev_is_pci(dev->dev)) in nouveau_name()
151 return nouveau_pci_name(to_pci_dev(dev->dev)); in nouveau_name()
153 return nouveau_platform_name(to_platform_device(dev->dev)); in nouveau_name()
161 spin_lock_irq(fence->lock); in nouveau_cli_work_ready()
164 spin_unlock_irq(fence->lock); in nouveau_cli_work_ready()
176 mutex_lock(&cli->lock); in nouveau_cli_work()
177 list_for_each_entry_safe(work, wtmp, &cli->worker, head) { in nouveau_cli_work()
178 if (!work->fence || nouveau_cli_work_ready(work->fence)) { in nouveau_cli_work()
179 list_del(&work->head); in nouveau_cli_work()
180 work->func(work); in nouveau_cli_work()
183 mutex_unlock(&cli->lock); in nouveau_cli_work()
190 schedule_work(&work->cli->work); in nouveau_cli_work_fence()
197 work->fence = dma_fence_get(fence); in nouveau_cli_work_queue()
198 work->cli = cli; in nouveau_cli_work_queue()
199 mutex_lock(&cli->lock); in nouveau_cli_work_queue()
200 list_add_tail(&work->head, &cli->worker); in nouveau_cli_work_queue()
201 if (dma_fence_add_callback(fence, &work->cb, nouveau_cli_work_fence)) in nouveau_cli_work_queue()
202 nouveau_cli_work_fence(fence, &work->cb); in nouveau_cli_work_queue()
203 mutex_unlock(&cli->lock); in nouveau_cli_work_queue()
216 flush_work(&cli->work); in nouveau_cli_fini()
217 WARN_ON(!list_empty(&cli->worker)); in nouveau_cli_fini()
219 if (cli->sched) in nouveau_cli_fini()
220 nouveau_sched_destroy(&cli->sched); in nouveau_cli_fini()
223 nouveau_vmm_fini(&cli->svm); in nouveau_cli_fini()
224 nouveau_vmm_fini(&cli->vmm); in nouveau_cli_fini()
225 nvif_mmu_dtor(&cli->mmu); in nouveau_cli_fini()
226 cli->device.object.map.ptr = NULL; in nouveau_cli_fini()
227 nvif_device_dtor(&cli->device); in nouveau_cli_fini()
228 mutex_lock(&cli->drm->client_mutex); in nouveau_cli_fini()
229 nvif_client_dtor(&cli->base); in nouveau_cli_fini()
230 mutex_unlock(&cli->drm->client_mutex); in nouveau_cli_fini()
239 { NVIF_CLASS_MEM_GF100, -1 }, in nouveau_cli_init()
240 { NVIF_CLASS_MEM_NV50 , -1 }, in nouveau_cli_init()
241 { NVIF_CLASS_MEM_NV04 , -1 }, in nouveau_cli_init()
246 { NVIF_CLASS_VMM_GP100, -1 }, in nouveau_cli_init()
247 { NVIF_CLASS_VMM_GM200, -1 }, in nouveau_cli_init()
248 { NVIF_CLASS_VMM_GF100, -1 }, in nouveau_cli_init()
249 { NVIF_CLASS_VMM_NV50 , -1 }, in nouveau_cli_init()
250 { NVIF_CLASS_VMM_NV04 , -1 }, in nouveau_cli_init()
255 snprintf(cli->name, sizeof(cli->name), "%s", sname); in nouveau_cli_init()
256 cli->drm = drm; in nouveau_cli_init()
257 mutex_init(&cli->mutex); in nouveau_cli_init()
259 INIT_WORK(&cli->work, nouveau_cli_work); in nouveau_cli_init()
260 INIT_LIST_HEAD(&cli->worker); in nouveau_cli_init()
261 mutex_init(&cli->lock); 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()
271 ret = nvif_device_ctor(&cli->base, "drmDevice", &cli->device); 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()
280 &cli->mmu); in nouveau_cli_init()
286 ret = nvif_mclass(&cli->mmu.object, vmms); in nouveau_cli_init()
292 ret = nouveau_vmm_init(cli, vmms[ret].oclass, &cli->vmm); in nouveau_cli_init()
298 ret = nvif_mclass(&cli->mmu.object, mems); in nouveau_cli_init()
304 cli->mem = &mems[ret]; in nouveau_cli_init()
316 ret = nouveau_sched_create(&cli->sched, drm, NULL, 1); in nouveau_cli_init()
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()
338 struct nvif_device *device = &drm->client.device; in nouveau_accel_ce_init()
351 ret = nouveau_channel_new(&drm->client, true, runm, NvDmaFB, NvDmaTT, &drm->cechan); in nouveau_accel_ce_init()
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()
368 struct nvif_device *device = &drm->client.device; in nouveau_accel_gr_init()
379 ret = nouveau_channel_new(&drm->client, false, runm, NvDmaFB, NvDmaTT, &drm->channel); in nouveau_accel_gr_init()
386 /* A SW class is used on pre-NV50 HW to assist with handling the 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()
393 NULL, 0, &drm->channel->nvsw); in nouveau_accel_gr_init()
395 if (ret == 0 && device->info.chipset >= 0x11) { 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()
406 if (device->info.chipset >= 0x11) { 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()
427 if (device->info.family < NV_DEVICE_INFO_V0_FERMI) { in nouveau_accel_gr_init()
428 ret = nvkm_gpuobj_new(nvxx_device(drm), 32, 0, false, NULL, &drm->notify); 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()
456 if (drm->fence) in nouveau_accel_fini()
457 nouveau_fence(drm)->dtor(drm); in nouveau_accel_fini()
464 struct nvif_device *device = &drm->client.device; in nouveau_accel_init()
479 ret = n = nvif_object_sclass_get(&device->object, &sclass); in nouveau_accel_init()
483 for (ret = -ENOSYS, i = 0; i < n; i++) { in nouveau_accel_init()
525 if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_VOLTA) { in nouveau_accel_init()
542 struct nouveau_drm *drm = container_of(object->parent, typeof(*drm), parent); in nouveau_drm_errorf()
556 struct nouveau_drm *drm = container_of(object->parent, typeof(*drm), parent); in nouveau_drm_debugf()
576 struct drm_device *dev = drm->dev; in nouveau_drm_device_fini()
580 pm_runtime_get_sync(dev->dev); in nouveau_drm_device_fini()
581 pm_runtime_forbid(dev->dev); in nouveau_drm_device_fini()
590 if (dev->mode_config.num_crtc) in nouveau_drm_device_fini()
601 * There may be existing clients from as-yet unclosed files. For now, in nouveau_drm_device_fini()
603 * but this likely not correct if we want to support hot-unplugging 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()
608 list_del(&cli->head); in nouveau_drm_device_fini()
609 mutex_lock(&cli->mutex); in nouveau_drm_device_fini()
610 if (cli->abi16) in nouveau_drm_device_fini()
611 nouveau_abi16_fini(cli->abi16); in nouveau_drm_device_fini()
612 mutex_unlock(&cli->mutex); 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()
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()
632 return -ENOMEM; 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()
644 * better fix is found - assuming there is one... 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()
665 if (dev->mode_config.num_crtc) { in nouveau_drm_device_init()
678 pm_runtime_use_autosuspend(dev->dev); in nouveau_drm_device_init()
679 pm_runtime_set_autosuspend_delay(dev->dev, 5000); in nouveau_drm_device_init()
680 pm_runtime_set_active(dev->dev); in nouveau_drm_device_init()
681 pm_runtime_allow(dev->dev); in nouveau_drm_device_init()
682 pm_runtime_mark_last_busy(dev->dev); in nouveau_drm_device_init()
683 pm_runtime_put(dev->dev); in nouveau_drm_device_init()
686 ret = drm_dev_register(drm->dev, 0); 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()
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()
729 { NVIF_CLASS_MMU_GF100, -1 }, in nouveau_drm_device_new()
730 { NVIF_CLASS_MMU_NV50 , -1 }, in nouveau_drm_device_new()
731 { NVIF_CLASS_MMU_NV04 , -1 }, in nouveau_drm_device_new()
739 return ERR_PTR(-ENOMEM); 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()
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()
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()
767 ret = nvif_device_map(&drm->device); in nouveau_drm_device_new()
773 ret = nvif_mclass(&drm->device.object, mmus); in nouveau_drm_device_new()
779 ret = nvif_mmu_ctor(&drm->device.object, "drmMmu", mmus[ret].oclass, &drm->mmu); in nouveau_drm_device_new()
795 * On some Intel PCIe bridge controllers doing a
796 * D0 -> D3hot -> D3cold -> D0 sequence causes Nvidia GPUs to not reappear.
802 * - AML code execution to power on the GPU hits an infinite loop (as the
804 * - kernel crashes, as all PCI reads return -1, which most code isn't able
812 * documented PCI config space register 0x248 of the Intel PCIe bridge
813 * controller (0x1901) in order to change the state of the PCIe link between
816 * - 0xbc bit 0x20 (publicly available documentation claims 'reserved')
817 * - 0xb0 bit 0x10 (link disable)
826 * this issue only occurs in combination with listed Intel PCIe bridge
829 * documentation on the PCIe bridge controller can be found in the
831 * Section "12 PCI Express* Controller (x16) Registers"
837 struct pci_dev *bridge = pci_upstream_bridge(pdev); in quirk_broken_nv_runpm() local
839 if (!bridge || bridge->vendor != PCI_VENDOR_ID_INTEL) in quirk_broken_nv_runpm()
842 switch (bridge->device) { in quirk_broken_nv_runpm()
844 drm->old_pm_cap = pdev->pm_cap; in quirk_broken_nv_runpm()
845 pdev->pm_cap = 0; in quirk_broken_nv_runpm()
860 return -EPROBE_DEFER; in nouveau_drm_probe()
879 drm = nouveau_drm_device_new(&driver_pci, &pdev->dev, device); 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()
915 struct nvkm_device *device = drm->nvkm; in nouveau_drm_device_remove()
917 drm_dev_unplug(drm->dev); in nouveau_drm_device_remove()
930 if (drm->old_pm_cap) in nouveau_drm_remove()
931 pdev->pm_cap = drm->old_pm_cap; in nouveau_drm_remove()
939 struct drm_device *dev = drm->dev; in nouveau_do_suspend()
947 if (dev->mode_config.num_crtc) { 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()
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()
973 if (drm->fence && nouveau_fence(drm)->suspend) { in nouveau_do_suspend()
974 if (!nouveau_fence(drm)->suspend(drm)) { in nouveau_do_suspend()
975 ret = -ENOMEM; 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()
992 if (dev->mode_config.num_crtc) { in nouveau_do_suspend()
1002 struct drm_device *dev = drm->dev; in nouveau_do_resume()
1006 ret = nvif_client_resume(&drm->_client); 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()
1018 if (dev->mode_config.num_crtc) { in nouveau_do_resume()
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()
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()
1096 if (nouveau_runtime_pm == -1) in nouveau_pmops_runtime()
1110 return -EBUSY; in nouveau_pmops_runtime_suspend()
1119 drm->dev->switch_power_state = DRM_SWITCH_POWER_DYNAMIC_OFF; in nouveau_pmops_runtime_suspend()
1128 struct nvif_device *device = &drm->client.device; in nouveau_pmops_runtime_resume()
1133 return -EBUSY; in nouveau_pmops_runtime_resume()
1150 nvif_mask(&device->object, 0x088488, (1 << 25), (1 << 25)); in nouveau_pmops_runtime_resume()
1151 drm->dev->switch_power_state = DRM_SWITCH_POWER_ON; in nouveau_pmops_runtime_resume()
1164 return -EBUSY; in nouveau_pmops_runtime_idle()
1169 /* we don't want the main rpm_idle to call suspend - we want to autosuspend */ in nouveau_pmops_runtime_idle()
1182 ret = pm_runtime_get_sync(dev->dev); in nouveau_drm_open()
1183 if (ret < 0 && ret != -EACCES) { in nouveau_drm_open()
1184 pm_runtime_put_autosuspend(dev->dev); in nouveau_drm_open()
1190 current->comm, pid_nr(rcu_dereference(fpriv->pid))); in nouveau_drm_open()
1194 ret = -ENOMEM; in nouveau_drm_open()
1202 fpriv->driver_priv = 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()
1214 pm_runtime_mark_last_busy(dev->dev); in nouveau_drm_open()
1215 pm_runtime_put_autosuspend(dev->dev); in nouveau_drm_open()
1229 * so that we can support hot-unplugging, but for now we immediately in nouveau_drm_postclose()
1230 * return to avoid a double-free situation. in nouveau_drm_postclose()
1235 pm_runtime_get_sync(dev->dev); in nouveau_drm_postclose()
1237 mutex_lock(&cli->mutex); in nouveau_drm_postclose()
1238 if (cli->abi16) in nouveau_drm_postclose()
1239 nouveau_abi16_fini(cli->abi16); in nouveau_drm_postclose()
1240 mutex_unlock(&cli->mutex); in nouveau_drm_postclose()
1242 mutex_lock(&drm->clients_lock); in nouveau_drm_postclose()
1243 list_del(&cli->head); in nouveau_drm_postclose()
1244 mutex_unlock(&drm->clients_lock); in nouveau_drm_postclose()
1248 pm_runtime_mark_last_busy(dev->dev); in nouveau_drm_postclose()
1249 pm_runtime_put_autosuspend(dev->dev); in nouveau_drm_postclose()
1277 struct drm_file *filp = file->private_data; in nouveau_drm_ioctl()
1278 struct drm_device *dev = filp->minor->dev; in nouveau_drm_ioctl()
1281 ret = pm_runtime_get_sync(dev->dev); in nouveau_drm_ioctl()
1282 if (ret < 0 && ret != -EACCES) { in nouveau_drm_ioctl()
1283 pm_runtime_put_autosuspend(dev->dev); in nouveau_drm_ioctl()
1287 switch (_IOC_NR(cmd) - DRM_COMMAND_BASE) { in nouveau_drm_ioctl()
1296 pm_runtime_mark_last_busy(dev->dev); in nouveau_drm_ioctl()
1297 pm_runtime_put_autosuspend(dev->dev); in nouveau_drm_ioctl()
1383 .freeze = nouveau_pmops_freeze,
1413 drm = nouveau_drm_device_new(&driver_platform, &pdev->dev, *pdevice); in nouveau_platform_device_create()
1423 return drm->dev; in nouveau_platform_device_create()
1443 if (nouveau_modeset == -1) { in nouveau_drm_init()