• Home
  • Raw
  • Download

Lines Matching +full:required +full:- +full:for +full:- +full:hardware +full:- +full:jobs

16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
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()
203 if (cli->sched) in nouveau_cli_fini()
204 nouveau_sched_destroy(&cli->sched); in nouveau_cli_fini()
207 nouveau_vmm_fini(&cli->svm); in nouveau_cli_fini()
208 nouveau_vmm_fini(&cli->vmm); in nouveau_cli_fini()
209 nvif_mmu_dtor(&cli->mmu); in nouveau_cli_fini()
210 cli->device.object.map.ptr = NULL; in nouveau_cli_fini()
211 nvif_device_dtor(&cli->device); in nouveau_cli_fini()
212 mutex_lock(&cli->drm->client_mutex); in nouveau_cli_fini()
213 nvif_client_dtor(&cli->base); in nouveau_cli_fini()
214 mutex_unlock(&cli->drm->client_mutex); 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_VMM_GP100, -1 }, in nouveau_cli_init()
231 { NVIF_CLASS_VMM_GM200, -1 }, in nouveau_cli_init()
232 { NVIF_CLASS_VMM_GF100, -1 }, in nouveau_cli_init()
233 { NVIF_CLASS_VMM_NV50 , -1 }, in nouveau_cli_init()
234 { NVIF_CLASS_VMM_NV04 , -1 }, in nouveau_cli_init()
239 snprintf(cli->name, sizeof(cli->name), "%s", sname); in nouveau_cli_init()
240 cli->drm = drm; in nouveau_cli_init()
241 mutex_init(&cli->mutex); in nouveau_cli_init()
243 INIT_WORK(&cli->work, nouveau_cli_work); in nouveau_cli_init()
244 INIT_LIST_HEAD(&cli->worker); in nouveau_cli_init()
245 mutex_init(&cli->lock); 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()
255 ret = nvif_device_ctor(&cli->base, "drmDevice", &cli->device); 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()
264 &cli->mmu); in nouveau_cli_init()
270 ret = nvif_mclass(&cli->mmu.object, vmms); in nouveau_cli_init()
276 ret = nouveau_vmm_init(cli, vmms[ret].oclass, &cli->vmm); in nouveau_cli_init()
282 ret = nvif_mclass(&cli->mmu.object, mems); in nouveau_cli_init()
288 cli->mem = &mems[ret]; in nouveau_cli_init()
291 * nouveau_sched_create() create a dedicated one for VM_BIND jobs. in nouveau_cli_init()
293 * This is required to ensure that for VM_BIND jobs free_job() work and in nouveau_cli_init()
295 * can never stall run_job() work. For EXEC jobs we don't have this in nouveau_cli_init()
297 * locks which indirectly or directly are held for allocations in nouveau_cli_init()
300 ret = nouveau_sched_create(&cli->sched, drm, NULL, 1); in nouveau_cli_init()
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()
322 struct nvif_device *device = &drm->client.device; in nouveau_accel_ce_init()
327 * engine, to use for TTM buffer moves. in nouveau_accel_ce_init()
335 ret = nouveau_channel_new(&drm->client, true, runm, NvDmaFB, NvDmaTT, &drm->cechan); in nouveau_accel_ce_init()
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()
352 struct nvif_device *device = &drm->client.device; in nouveau_accel_gr_init()
363 ret = nouveau_channel_new(&drm->client, false, runm, NvDmaFB, NvDmaTT, &drm->channel); in nouveau_accel_gr_init()
370 /* A SW class is used on pre-NV50 HW to assist with handling the 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()
377 NULL, 0, &drm->channel->nvsw); in nouveau_accel_gr_init()
379 if (ret == 0 && device->info.chipset >= 0x11) { 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()
390 if (device->info.chipset >= 0x11) { 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()
407 /* NvMemoryToMemoryFormat requires a notifier ctxdma for some reason, in nouveau_accel_gr_init()
409 * any GPU where it's possible we'll end up using M2MF for BO moves. in nouveau_accel_gr_init()
411 if (device->info.family < NV_DEVICE_INFO_V0_FERMI) { in nouveau_accel_gr_init()
412 ret = nvkm_gpuobj_new(nvxx_device(drm), 32, 0, false, NULL, &drm->notify); 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()
440 if (drm->fence) in nouveau_accel_fini()
441 nouveau_fence(drm)->dtor(drm); in nouveau_accel_fini()
448 struct nvif_device *device = &drm->client.device; in nouveau_accel_init()
455 /* Initialise global support for channels, and synchronisation. */ in nouveau_accel_init()
463 ret = n = nvif_object_sclass_get(&device->object, &sclass); in nouveau_accel_init()
467 for (ret = -ENOSYS, i = 0; i < n; i++) { in nouveau_accel_init()
508 /* Volta requires access to a doorbell register for kickoff. */ in nouveau_accel_init()
509 if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_VOLTA) { in nouveau_accel_init()
526 struct nouveau_drm *drm = container_of(object->parent, typeof(*drm), parent); in nouveau_drm_errorf()
540 struct nouveau_drm *drm = container_of(object->parent, typeof(*drm), parent); in nouveau_drm_debugf()
560 struct drm_device *dev = drm->dev; in nouveau_drm_device_fini()
564 pm_runtime_get_sync(dev->dev); in nouveau_drm_device_fini()
565 pm_runtime_forbid(dev->dev); in nouveau_drm_device_fini()
574 if (dev->mode_config.num_crtc) in nouveau_drm_device_fini()
585 * There may be existing clients from as-yet unclosed files. For now, in nouveau_drm_device_fini()
587 * but this likely not correct if we want to support hot-unplugging 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()
592 list_del(&cli->head); in nouveau_drm_device_fini()
593 mutex_lock(&cli->mutex); in nouveau_drm_device_fini()
594 if (cli->abi16) in nouveau_drm_device_fini()
595 nouveau_abi16_fini(cli->abi16); in nouveau_drm_device_fini()
596 mutex_unlock(&cli->mutex); 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()
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()
616 return -ENOMEM; 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()
628 * better fix is found - assuming there is one... 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()
649 if (dev->mode_config.num_crtc) { in nouveau_drm_device_init()
662 pm_runtime_use_autosuspend(dev->dev); in nouveau_drm_device_init()
663 pm_runtime_set_autosuspend_delay(dev->dev, 5000); in nouveau_drm_device_init()
664 pm_runtime_set_active(dev->dev); in nouveau_drm_device_init()
665 pm_runtime_allow(dev->dev); in nouveau_drm_device_init()
666 pm_runtime_mark_last_busy(dev->dev); in nouveau_drm_device_init()
667 pm_runtime_put(dev->dev); in nouveau_drm_device_init()
670 ret = drm_dev_register(drm->dev, 0); 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()
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()
713 { NVIF_CLASS_MMU_GF100, -1 }, in nouveau_drm_device_new()
714 { NVIF_CLASS_MMU_NV50 , -1 }, in nouveau_drm_device_new()
715 { NVIF_CLASS_MMU_NV04 , -1 }, in nouveau_drm_device_new()
723 return ERR_PTR(-ENOMEM); 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()
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()
751 ret = nvif_device_map(&drm->device); in nouveau_drm_device_new()
757 ret = nvif_mclass(&drm->device.object, mmus); in nouveau_drm_device_new()
763 ret = nvif_mmu_ctor(&drm->device.object, "drmMmu", mmus[ret].oclass, &drm->mmu); in nouveau_drm_device_new()
780 * D0 -> D3hot -> D3cold -> D0 sequence causes Nvidia GPUs to not reappear.
786 * - AML code execution to power on the GPU hits an infinite loop (as the
788 * - kernel crashes, as all PCI reads return -1, which most code isn't able
800 * - 0xbc bit 0x20 (publicly available documentation claims 'reserved')
801 * - 0xb0 bit 0x10 (link disable)
814 * "7th Generation Intel® Processor Families for H Platforms Datasheet Volume 2"
823 if (!bridge || bridge->vendor != PCI_VENDOR_ID_INTEL) in quirk_broken_nv_runpm()
826 switch (bridge->device) { in quirk_broken_nv_runpm()
828 drm->old_pm_cap = pdev->pm_cap; in quirk_broken_nv_runpm()
829 pdev->pm_cap = 0; in quirk_broken_nv_runpm()
844 return -EPROBE_DEFER; in nouveau_drm_probe()
847 * fbdev off the hardware, as there's no way to put it back. in nouveau_drm_probe()
863 drm = nouveau_drm_device_new(&driver_pci, &pdev->dev, device); 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()
899 struct nvkm_device *device = drm->nvkm; in nouveau_drm_device_remove()
901 drm_dev_unplug(drm->dev); in nouveau_drm_device_remove()
914 if (drm->old_pm_cap) in nouveau_drm_remove()
915 pdev->pm_cap = drm->old_pm_cap; in nouveau_drm_remove()
923 struct drm_device *dev = drm->dev; in nouveau_do_suspend()
931 if (dev->mode_config.num_crtc) { 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()
957 if (drm->fence && nouveau_fence(drm)->suspend) { in nouveau_do_suspend()
958 if (!nouveau_fence(drm)->suspend(drm)) { in nouveau_do_suspend()
959 ret = -ENOMEM; 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()
976 if (dev->mode_config.num_crtc) { in nouveau_do_suspend()
986 struct drm_device *dev = drm->dev; in nouveau_do_resume()
990 ret = nvif_client_resume(&drm->_client); 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()
1002 if (dev->mode_config.num_crtc) { in nouveau_do_resume()
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()
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()
1080 if (nouveau_runtime_pm == -1) in nouveau_pmops_runtime()
1094 return -EBUSY; in nouveau_pmops_runtime_suspend()
1103 drm->dev->switch_power_state = DRM_SWITCH_POWER_DYNAMIC_OFF; in nouveau_pmops_runtime_suspend()
1112 struct nvif_device *device = &drm->client.device; in nouveau_pmops_runtime_resume()
1117 return -EBUSY; in nouveau_pmops_runtime_resume()
1134 nvif_mask(&device->object, 0x088488, (1 << 25), (1 << 25)); in nouveau_pmops_runtime_resume()
1135 drm->dev->switch_power_state = DRM_SWITCH_POWER_ON; in nouveau_pmops_runtime_resume()
1148 return -EBUSY; in nouveau_pmops_runtime_idle()
1153 /* we don't want the main rpm_idle to call suspend - we want to autosuspend */ in nouveau_pmops_runtime_idle()
1166 ret = pm_runtime_get_sync(dev->dev); in nouveau_drm_open()
1167 if (ret < 0 && ret != -EACCES) { in nouveau_drm_open()
1168 pm_runtime_put_autosuspend(dev->dev); in nouveau_drm_open()
1175 tmpname, pid_nr(rcu_dereference(fpriv->pid))); in nouveau_drm_open()
1179 ret = -ENOMEM; in nouveau_drm_open()
1187 fpriv->driver_priv = 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()
1199 pm_runtime_mark_last_busy(dev->dev); in nouveau_drm_open()
1200 pm_runtime_put_autosuspend(dev->dev); in nouveau_drm_open()
1214 * so that we can support hot-unplugging, but for now we immediately in nouveau_drm_postclose()
1215 * return to avoid a double-free situation. in nouveau_drm_postclose()
1220 pm_runtime_get_sync(dev->dev); in nouveau_drm_postclose()
1222 mutex_lock(&cli->mutex); in nouveau_drm_postclose()
1223 if (cli->abi16) in nouveau_drm_postclose()
1224 nouveau_abi16_fini(cli->abi16); in nouveau_drm_postclose()
1225 mutex_unlock(&cli->mutex); in nouveau_drm_postclose()
1227 mutex_lock(&drm->clients_lock); in nouveau_drm_postclose()
1228 list_del(&cli->head); in nouveau_drm_postclose()
1229 mutex_unlock(&drm->clients_lock); in nouveau_drm_postclose()
1233 pm_runtime_mark_last_busy(dev->dev); in nouveau_drm_postclose()
1234 pm_runtime_put_autosuspend(dev->dev); in nouveau_drm_postclose()
1262 struct drm_file *filp = file->private_data; in nouveau_drm_ioctl()
1263 struct drm_device *dev = filp->minor->dev; in nouveau_drm_ioctl()
1266 ret = pm_runtime_get_sync(dev->dev); in nouveau_drm_ioctl()
1267 if (ret < 0 && ret != -EACCES) { in nouveau_drm_ioctl()
1268 pm_runtime_put_autosuspend(dev->dev); in nouveau_drm_ioctl()
1272 switch (_IOC_NR(cmd) - DRM_COMMAND_BASE) { in nouveau_drm_ioctl()
1281 pm_runtime_mark_last_busy(dev->dev); in nouveau_drm_ioctl()
1282 pm_runtime_put_autosuspend(dev->dev); in nouveau_drm_ioctl()
1403 drm = nouveau_drm_device_new(&driver_platform, &pdev->dev, *pdevice); in nouveau_platform_device_create()
1413 return drm->dev; in nouveau_platform_device_create()
1431 if (nouveau_modeset == -1) { in nouveau_drm_init()