Lines Matching +full:freeze +full:- +full:bridge +full:- +full:controller
101 int nouveau_modeset = -1;
108 MODULE_PARM_DESC(runpm, "disable (0), force enable (1), optimus only default (-1)");
109 static int nouveau_runtime_pm = -1;
119 u64 name = (u64)pci_domain_nr(pdev->bus) << 32; in nouveau_pci_name()
120 name |= pdev->bus->number << 16; in nouveau_pci_name()
121 name |= PCI_SLOT(pdev->devfn) << 8; in nouveau_pci_name()
122 return name | PCI_FUNC(pdev->devfn); in nouveau_pci_name()
128 return platformdev->id; in nouveau_platform_name()
134 if (dev_is_pci(dev->dev)) in nouveau_name()
135 return nouveau_pci_name(to_pci_dev(dev->dev)); in nouveau_name()
137 return nouveau_platform_name(to_platform_device(dev->dev)); in nouveau_name()
145 spin_lock_irq(fence->lock); in nouveau_cli_work_ready()
148 spin_unlock_irq(fence->lock); in nouveau_cli_work_ready()
160 mutex_lock(&cli->lock); in nouveau_cli_work()
161 list_for_each_entry_safe(work, wtmp, &cli->worker, head) { in nouveau_cli_work()
162 if (!work->fence || nouveau_cli_work_ready(work->fence)) { in nouveau_cli_work()
163 list_del(&work->head); in nouveau_cli_work()
164 work->func(work); in nouveau_cli_work()
167 mutex_unlock(&cli->lock); in nouveau_cli_work()
174 schedule_work(&work->cli->work); in nouveau_cli_work_fence()
181 work->fence = dma_fence_get(fence); in nouveau_cli_work_queue()
182 work->cli = cli; in nouveau_cli_work_queue()
183 mutex_lock(&cli->lock); in nouveau_cli_work_queue()
184 list_add_tail(&work->head, &cli->worker); in nouveau_cli_work_queue()
185 if (dma_fence_add_callback(fence, &work->cb, nouveau_cli_work_fence)) in nouveau_cli_work_queue()
186 nouveau_cli_work_fence(fence, &work->cb); in nouveau_cli_work_queue()
187 mutex_unlock(&cli->lock); in nouveau_cli_work_queue()
200 flush_work(&cli->work); in nouveau_cli_fini()
201 WARN_ON(!list_empty(&cli->worker)); in nouveau_cli_fini()
204 if (cli->sched) in nouveau_cli_fini()
205 nouveau_sched_destroy(&cli->sched); in nouveau_cli_fini()
208 nouveau_vmm_fini(&cli->svm); in nouveau_cli_fini()
209 nouveau_vmm_fini(&cli->vmm); in nouveau_cli_fini()
210 nvif_mmu_dtor(&cli->mmu); in nouveau_cli_fini()
211 nvif_device_dtor(&cli->device); in nouveau_cli_fini()
212 mutex_lock(&cli->drm->master.lock); in nouveau_cli_fini()
213 nvif_client_dtor(&cli->base); in nouveau_cli_fini()
214 mutex_unlock(&cli->drm->master.lock); in nouveau_cli_fini()
223 { NVIF_CLASS_MEM_GF100, -1 }, in nouveau_cli_init()
224 { NVIF_CLASS_MEM_NV50 , -1 }, in nouveau_cli_init()
225 { NVIF_CLASS_MEM_NV04 , -1 }, in nouveau_cli_init()
230 { NVIF_CLASS_MMU_GF100, -1 }, in nouveau_cli_init()
231 { NVIF_CLASS_MMU_NV50 , -1 }, in nouveau_cli_init()
232 { NVIF_CLASS_MMU_NV04 , -1 }, in nouveau_cli_init()
237 { NVIF_CLASS_VMM_GP100, -1 }, in nouveau_cli_init()
238 { NVIF_CLASS_VMM_GM200, -1 }, in nouveau_cli_init()
239 { NVIF_CLASS_VMM_GF100, -1 }, in nouveau_cli_init()
240 { NVIF_CLASS_VMM_NV50 , -1 }, in nouveau_cli_init()
241 { NVIF_CLASS_VMM_NV04 , -1 }, in nouveau_cli_init()
244 u64 device = nouveau_name(drm->dev); in nouveau_cli_init()
247 snprintf(cli->name, sizeof(cli->name), "%s", sname); in nouveau_cli_init()
248 cli->drm = drm; in nouveau_cli_init()
249 mutex_init(&cli->mutex); in nouveau_cli_init()
252 INIT_WORK(&cli->work, nouveau_cli_work); in nouveau_cli_init()
253 INIT_LIST_HEAD(&cli->worker); in nouveau_cli_init()
254 mutex_init(&cli->lock); in nouveau_cli_init()
256 if (cli == &drm->master) { in nouveau_cli_init()
258 cli->name, device, &cli->base); in nouveau_cli_init()
260 mutex_lock(&drm->master.lock); in nouveau_cli_init()
261 ret = nvif_client_ctor(&drm->master.base, cli->name, device, in nouveau_cli_init()
262 &cli->base); in nouveau_cli_init()
263 mutex_unlock(&drm->master.lock); in nouveau_cli_init()
270 ret = nvif_device_ctor(&cli->base.object, "drmDevice", 0, NV_DEVICE, in nouveau_cli_init()
275 &cli->device); in nouveau_cli_init()
281 ret = nvif_mclass(&cli->device.object, mmus); in nouveau_cli_init()
287 ret = nvif_mmu_ctor(&cli->device.object, "drmMmu", mmus[ret].oclass, in nouveau_cli_init()
288 &cli->mmu); in nouveau_cli_init()
294 ret = nvif_mclass(&cli->mmu.object, vmms); in nouveau_cli_init()
300 ret = nouveau_vmm_init(cli, vmms[ret].oclass, &cli->vmm); in nouveau_cli_init()
306 ret = nvif_mclass(&cli->mmu.object, mems); in nouveau_cli_init()
312 cli->mem = &mems[ret]; in nouveau_cli_init()
324 ret = nouveau_sched_create(&cli->sched, drm, NULL, 1); in nouveau_cli_init()
338 nouveau_channel_idle(drm->cechan); in nouveau_accel_ce_fini()
339 nvif_object_dtor(&drm->ttm.copy); in nouveau_accel_ce_fini()
340 nouveau_channel_del(&drm->cechan); in nouveau_accel_ce_fini()
346 struct nvif_device *device = &drm->client.device; in nouveau_accel_ce_init()
359 ret = nouveau_channel_new(drm, device, false, runm, NvDmaFB, NvDmaTT, &drm->cechan); in nouveau_accel_ce_init()
367 nouveau_channel_idle(drm->channel); in nouveau_accel_gr_fini()
368 nvif_object_dtor(&drm->ntfy); in nouveau_accel_gr_fini()
369 nvkm_gpuobj_del(&drm->notify); in nouveau_accel_gr_fini()
370 nouveau_channel_del(&drm->channel); in nouveau_accel_gr_fini()
376 struct nvif_device *device = &drm->client.device; in nouveau_accel_gr_init()
387 ret = nouveau_channel_new(drm, device, false, runm, NvDmaFB, NvDmaTT, &drm->channel); in nouveau_accel_gr_init()
394 /* A SW class is used on pre-NV50 HW to assist with handling the in nouveau_accel_gr_init()
398 if (!drm->channel->nvsw.client && device->info.family < NV_DEVICE_INFO_V0_TESLA) { in nouveau_accel_gr_init()
399 ret = nvif_object_ctor(&drm->channel->user, "drmNvsw", in nouveau_accel_gr_init()
401 NULL, 0, &drm->channel->nvsw); in nouveau_accel_gr_init()
403 if (ret == 0 && device->info.chipset >= 0x11) { in nouveau_accel_gr_init()
404 ret = nvif_object_ctor(&drm->channel->user, "drmBlit", in nouveau_accel_gr_init()
406 NULL, 0, &drm->channel->blit); in nouveau_accel_gr_init()
410 struct nvif_push *push = drm->channel->chan.push; in nouveau_accel_gr_init()
413 if (device->info.chipset >= 0x11) { in nouveau_accel_gr_init()
414 PUSH_NVSQ(push, NV05F, 0x0000, drm->channel->blit.handle); in nouveau_accel_gr_init()
419 PUSH_NVSQ(push, NV_SW, 0x0000, drm->channel->nvsw.handle); in nouveau_accel_gr_init()
434 if (device->info.family < NV_DEVICE_INFO_V0_FERMI) { in nouveau_accel_gr_init()
436 &drm->notify); in nouveau_accel_gr_init()
443 ret = nvif_object_ctor(&drm->channel->user, "drmM2mfNtfy", in nouveau_accel_gr_init()
448 .start = drm->notify->addr, in nouveau_accel_gr_init()
449 .limit = drm->notify->addr + 31 in nouveau_accel_gr_init()
451 &drm->ntfy); in nouveau_accel_gr_init()
464 if (drm->fence) in nouveau_accel_fini()
465 nouveau_fence(drm)->dtor(drm); in nouveau_accel_fini()
472 struct nvif_device *device = &drm->client.device; in nouveau_accel_init()
487 ret = n = nvif_object_sclass_get(&device->object, &sclass); in nouveau_accel_init()
491 for (ret = -ENOSYS, i = 0; i < n; i++) { in nouveau_accel_init()
533 if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_VOLTA) { in nouveau_accel_init()
550 struct nouveau_drm *drm = container_of(object->parent, typeof(*drm), parent); in nouveau_drm_errorf()
564 struct nouveau_drm *drm = container_of(object->parent, typeof(*drm), parent); in nouveau_drm_debugf()
588 return -ENOMEM; in nouveau_drm_device_init()
589 dev->dev_private = drm; in nouveau_drm_device_init()
590 drm->dev = dev; in nouveau_drm_device_init()
592 nvif_parent_ctor(&nouveau_parent, &drm->parent); in nouveau_drm_device_init()
593 drm->master.base.object.parent = &drm->parent; in nouveau_drm_device_init()
595 drm->sched_wq = alloc_workqueue("nouveau_sched_wq_shared", 0, in nouveau_drm_device_init()
597 if (!drm->sched_wq) { in nouveau_drm_device_init()
598 ret = -ENOMEM; in nouveau_drm_device_init()
602 ret = nouveau_cli_init(drm, "DRM-master", &drm->master); in nouveau_drm_device_init()
606 ret = nouveau_cli_init(drm, "DRM", &drm->client); in nouveau_drm_device_init()
610 nvxx_client(&drm->client.base)->debug = in nouveau_drm_device_init()
613 INIT_LIST_HEAD(&drm->clients); in nouveau_drm_device_init()
614 mutex_init(&drm->clients_lock); in nouveau_drm_device_init()
615 spin_lock_init(&drm->tile.lock); in nouveau_drm_device_init()
619 * better fix is found - assuming there is one... in nouveau_drm_device_init()
621 if (drm->client.device.info.chipset == 0xc1) in nouveau_drm_device_init()
622 nvif_mask(&drm->client.device.object, 0x00088080, 0x00000800, 0x00000000); in nouveau_drm_device_init()
640 if (dev->mode_config.num_crtc) { in nouveau_drm_device_init()
653 pm_runtime_use_autosuspend(dev->dev); in nouveau_drm_device_init()
654 pm_runtime_set_autosuspend_delay(dev->dev, 5000); in nouveau_drm_device_init()
655 pm_runtime_set_active(dev->dev); in nouveau_drm_device_init()
656 pm_runtime_allow(dev->dev); in nouveau_drm_device_init()
657 pm_runtime_mark_last_busy(dev->dev); in nouveau_drm_device_init()
658 pm_runtime_put(dev->dev); in nouveau_drm_device_init()
671 nouveau_cli_fini(&drm->client); in nouveau_drm_device_init()
673 nouveau_cli_fini(&drm->master); in nouveau_drm_device_init()
675 destroy_workqueue(drm->sched_wq); in nouveau_drm_device_init()
677 nvif_parent_dtor(&drm->parent); in nouveau_drm_device_init()
689 pm_runtime_get_sync(dev->dev); in nouveau_drm_device_fini()
690 pm_runtime_forbid(dev->dev); in nouveau_drm_device_fini()
699 if (dev->mode_config.num_crtc) in nouveau_drm_device_fini()
710 * There may be existing clients from as-yet unclosed files. For now, in nouveau_drm_device_fini()
712 * but this likely not correct if we want to support hot-unplugging in nouveau_drm_device_fini()
715 mutex_lock(&drm->clients_lock); in nouveau_drm_device_fini()
716 list_for_each_entry_safe(cli, temp_cli, &drm->clients, head) { in nouveau_drm_device_fini()
717 list_del(&cli->head); in nouveau_drm_device_fini()
718 mutex_lock(&cli->mutex); in nouveau_drm_device_fini()
719 if (cli->abi16) in nouveau_drm_device_fini()
720 nouveau_abi16_fini(cli->abi16); in nouveau_drm_device_fini()
721 mutex_unlock(&cli->mutex); in nouveau_drm_device_fini()
725 mutex_unlock(&drm->clients_lock); in nouveau_drm_device_fini()
727 nouveau_cli_fini(&drm->client); in nouveau_drm_device_fini()
728 nouveau_cli_fini(&drm->master); in nouveau_drm_device_fini()
729 destroy_workqueue(drm->sched_wq); in nouveau_drm_device_fini()
730 nvif_parent_dtor(&drm->parent); in nouveau_drm_device_fini()
731 mutex_destroy(&drm->clients_lock); in nouveau_drm_device_fini()
736 * On some Intel PCIe bridge controllers doing a
737 * D0 -> D3hot -> D3cold -> D0 sequence causes Nvidia GPUs to not reappear.
743 * - AML code execution to power on the GPU hits an infinite loop (as the
745 * - kernel crashes, as all PCI reads return -1, which most code isn't able
753 * documented PCI config space register 0x248 of the Intel PCIe bridge
754 * controller (0x1901) in order to change the state of the PCIe link between
757 * - 0xbc bit 0x20 (publicly available documentation claims 'reserved')
758 * - 0xb0 bit 0x10 (link disable)
767 * this issue only occurs in combination with listed Intel PCIe bridge
770 * documentation on the PCIe bridge controller can be found in the
772 * Section "12 PCI Express* Controller (x16) Registers"
779 struct pci_dev *bridge = pci_upstream_bridge(pdev); in quirk_broken_nv_runpm() local
781 if (!bridge || bridge->vendor != PCI_VENDOR_ID_INTEL) in quirk_broken_nv_runpm()
784 switch (bridge->device) { in quirk_broken_nv_runpm()
786 drm->old_pm_cap = pdev->pm_cap; in quirk_broken_nv_runpm()
787 pdev->pm_cap = 0; in quirk_broken_nv_runpm()
801 return -EPROBE_DEFER; in nouveau_drm_probe()
828 drm_dev = drm_dev_alloc(&driver_pci, &pdev->dev); in nouveau_drm_probe()
844 ret = drm_dev_register(drm_dev, pent->driver_data); in nouveau_drm_probe()
848 if (nouveau_drm(drm_dev)->client.device.info.ram_size <= 32 * 1024 * 1024) in nouveau_drm_probe()
876 client = nvxx_client(&drm->client.base); in nouveau_drm_device_remove()
877 device = nvkm_device_find(client->device); in nouveau_drm_device_remove()
891 if (drm->old_pm_cap) in nouveau_drm_remove()
892 pdev->pm_cap = drm->old_pm_cap; in nouveau_drm_remove()
908 if (dev->mode_config.num_crtc) { in nouveau_do_suspend()
917 man = ttm_manager_type(&drm->ttm.bdev, TTM_PL_VRAM); in nouveau_do_suspend()
918 ttm_resource_manager_evict_all(&drm->ttm.bdev, man); in nouveau_do_suspend()
921 if (drm->cechan) { in nouveau_do_suspend()
922 ret = nouveau_channel_idle(drm->cechan); in nouveau_do_suspend()
927 if (drm->channel) { in nouveau_do_suspend()
928 ret = nouveau_channel_idle(drm->channel); in nouveau_do_suspend()
934 if (drm->fence && nouveau_fence(drm)->suspend) { in nouveau_do_suspend()
935 if (!nouveau_fence(drm)->suspend(drm)) { in nouveau_do_suspend()
936 ret = -ENOMEM; in nouveau_do_suspend()
942 ret = nvif_client_suspend(&drm->master.base); in nouveau_do_suspend()
949 if (drm->fence && nouveau_fence(drm)->resume) in nouveau_do_suspend()
950 nouveau_fence(drm)->resume(drm); in nouveau_do_suspend()
953 if (dev->mode_config.num_crtc) { in nouveau_do_suspend()
967 ret = nvif_client_resume(&drm->master.base); in nouveau_do_resume()
974 if (drm->fence && nouveau_fence(drm)->resume) in nouveau_do_resume()
975 nouveau_fence(drm)->resume(drm); in nouveau_do_resume()
979 if (dev->mode_config.num_crtc) { in nouveau_do_resume()
997 if (drm_dev->switch_power_state == DRM_SWITCH_POWER_OFF || in nouveau_pmops_suspend()
998 drm_dev->switch_power_state == DRM_SWITCH_POWER_DYNAMIC_OFF) in nouveau_pmops_suspend()
1019 if (drm_dev->switch_power_state == DRM_SWITCH_POWER_OFF || in nouveau_pmops_resume()
1020 drm_dev->switch_power_state == DRM_SWITCH_POWER_DYNAMIC_OFF) in nouveau_pmops_resume()
1057 if (nouveau_runtime_pm == -1) in nouveau_pmops_runtime()
1071 return -EBUSY; in nouveau_pmops_runtime_suspend()
1080 drm_dev->switch_power_state = DRM_SWITCH_POWER_DYNAMIC_OFF; in nouveau_pmops_runtime_suspend()
1090 struct nvif_device *device = &nouveau_drm(drm_dev)->client.device; in nouveau_pmops_runtime_resume()
1095 return -EBUSY; in nouveau_pmops_runtime_resume()
1112 nvif_mask(&device->object, 0x088488, (1 << 25), (1 << 25)); in nouveau_pmops_runtime_resume()
1113 drm_dev->switch_power_state = DRM_SWITCH_POWER_ON; in nouveau_pmops_runtime_resume()
1126 return -EBUSY; in nouveau_pmops_runtime_idle()
1131 /* we don't want the main rpm_idle to call suspend - we want to autosuspend */ in nouveau_pmops_runtime_idle()
1144 ret = pm_runtime_get_sync(dev->dev); in nouveau_drm_open()
1145 if (ret < 0 && ret != -EACCES) { in nouveau_drm_open()
1146 pm_runtime_put_autosuspend(dev->dev); in nouveau_drm_open()
1153 tmpname, pid_nr(rcu_dereference(fpriv->pid))); in nouveau_drm_open()
1157 ret = -ENOMEM; in nouveau_drm_open()
1165 fpriv->driver_priv = cli; in nouveau_drm_open()
1167 mutex_lock(&drm->clients_lock); in nouveau_drm_open()
1168 list_add(&cli->head, &drm->clients); in nouveau_drm_open()
1169 mutex_unlock(&drm->clients_lock); in nouveau_drm_open()
1177 pm_runtime_mark_last_busy(dev->dev); in nouveau_drm_open()
1178 pm_runtime_put_autosuspend(dev->dev); in nouveau_drm_open()
1192 * so that we can support hot-unplugging, but for now we immediately in nouveau_drm_postclose()
1193 * return to avoid a double-free situation. in nouveau_drm_postclose()
1198 pm_runtime_get_sync(dev->dev); in nouveau_drm_postclose()
1200 mutex_lock(&cli->mutex); in nouveau_drm_postclose()
1201 if (cli->abi16) in nouveau_drm_postclose()
1202 nouveau_abi16_fini(cli->abi16); in nouveau_drm_postclose()
1203 mutex_unlock(&cli->mutex); in nouveau_drm_postclose()
1205 mutex_lock(&drm->clients_lock); in nouveau_drm_postclose()
1206 list_del(&cli->head); in nouveau_drm_postclose()
1207 mutex_unlock(&drm->clients_lock); in nouveau_drm_postclose()
1211 pm_runtime_mark_last_busy(dev->dev); in nouveau_drm_postclose()
1212 pm_runtime_put_autosuspend(dev->dev); in nouveau_drm_postclose()
1240 struct drm_file *filp = file->private_data; in nouveau_drm_ioctl()
1241 struct drm_device *dev = filp->minor->dev; in nouveau_drm_ioctl()
1244 ret = pm_runtime_get_sync(dev->dev); in nouveau_drm_ioctl()
1245 if (ret < 0 && ret != -EACCES) { in nouveau_drm_ioctl()
1246 pm_runtime_put_autosuspend(dev->dev); in nouveau_drm_ioctl()
1250 switch (_IOC_NR(cmd) - DRM_COMMAND_BASE) { in nouveau_drm_ioctl()
1259 pm_runtime_mark_last_busy(dev->dev); in nouveau_drm_ioctl()
1260 pm_runtime_put_autosuspend(dev->dev); in nouveau_drm_ioctl()
1349 .freeze = nouveau_pmops_freeze,
1380 drm = drm_dev_alloc(&driver_platform, &pdev->dev); in nouveau_platform_device_create()
1410 if (nouveau_modeset == -1) { in nouveau_drm_init()