Lines Matching refs:ptdev

25 static int panthor_gpu_coherency_init(struct panthor_device *ptdev)  in panthor_gpu_coherency_init()  argument
27 ptdev->coherent = device_get_dma_attr(ptdev->base.dev) == DEV_DMA_COHERENT; in panthor_gpu_coherency_init()
29 if (!ptdev->coherent) in panthor_gpu_coherency_init()
35 if ((gpu_read(ptdev, GPU_COHERENCY_FEATURES) & in panthor_gpu_coherency_init()
39 drm_err(&ptdev->base, "Coherency not supported by the device"); in panthor_gpu_coherency_init()
43 static int panthor_clk_init(struct panthor_device *ptdev) in panthor_clk_init() argument
45 ptdev->clks.core = devm_clk_get(ptdev->base.dev, NULL); in panthor_clk_init()
46 if (IS_ERR(ptdev->clks.core)) in panthor_clk_init()
47 return dev_err_probe(ptdev->base.dev, in panthor_clk_init()
48 PTR_ERR(ptdev->clks.core), in panthor_clk_init()
51 ptdev->clks.stacks = devm_clk_get_optional(ptdev->base.dev, "stacks"); in panthor_clk_init()
52 if (IS_ERR(ptdev->clks.stacks)) in panthor_clk_init()
53 return dev_err_probe(ptdev->base.dev, in panthor_clk_init()
54 PTR_ERR(ptdev->clks.stacks), in panthor_clk_init()
57 ptdev->clks.coregroup = devm_clk_get_optional(ptdev->base.dev, "coregroup"); in panthor_clk_init()
58 if (IS_ERR(ptdev->clks.coregroup)) in panthor_clk_init()
59 return dev_err_probe(ptdev->base.dev, in panthor_clk_init()
60 PTR_ERR(ptdev->clks.coregroup), in panthor_clk_init()
63 drm_info(&ptdev->base, "clock rate = %lu\n", clk_get_rate(ptdev->clks.core)); in panthor_clk_init()
67 void panthor_device_unplug(struct panthor_device *ptdev) in panthor_device_unplug() argument
75 mutex_lock(&ptdev->unplug.lock); in panthor_device_unplug()
76 if (drm_dev_is_unplugged(&ptdev->base)) { in panthor_device_unplug()
80 mutex_unlock(&ptdev->unplug.lock); in panthor_device_unplug()
81 wait_for_completion(&ptdev->unplug.done); in panthor_device_unplug()
88 drm_dev_unplug(&ptdev->base); in panthor_device_unplug()
93 mutex_unlock(&ptdev->unplug.lock); in panthor_device_unplug()
95 drm_WARN_ON(&ptdev->base, pm_runtime_get_sync(ptdev->base.dev) < 0); in panthor_device_unplug()
100 panthor_sched_unplug(ptdev); in panthor_device_unplug()
101 panthor_fw_unplug(ptdev); in panthor_device_unplug()
102 panthor_mmu_unplug(ptdev); in panthor_device_unplug()
103 panthor_gpu_unplug(ptdev); in panthor_device_unplug()
105 pm_runtime_dont_use_autosuspend(ptdev->base.dev); in panthor_device_unplug()
106 pm_runtime_put_sync_suspend(ptdev->base.dev); in panthor_device_unplug()
110 panthor_device_suspend(ptdev->base.dev); in panthor_device_unplug()
115 complete_all(&ptdev->unplug.done); in panthor_device_unplug()
120 struct panthor_device *ptdev = container_of(ddev, struct panthor_device, base); in panthor_device_reset_cleanup() local
122 cancel_work_sync(&ptdev->reset.work); in panthor_device_reset_cleanup()
123 destroy_workqueue(ptdev->reset.wq); in panthor_device_reset_cleanup()
128 struct panthor_device *ptdev = container_of(work, struct panthor_device, reset.work); in panthor_device_reset_work() local
134 if (atomic_read(&ptdev->pm.state) != PANTHOR_DEVICE_PM_STATE_ACTIVE) in panthor_device_reset_work()
137 if (!drm_dev_enter(&ptdev->base, &cookie)) in panthor_device_reset_work()
140 panthor_sched_pre_reset(ptdev); in panthor_device_reset_work()
141 panthor_fw_pre_reset(ptdev, true); in panthor_device_reset_work()
142 panthor_mmu_pre_reset(ptdev); in panthor_device_reset_work()
143 panthor_gpu_soft_reset(ptdev); in panthor_device_reset_work()
144 panthor_gpu_l2_power_on(ptdev); in panthor_device_reset_work()
145 panthor_mmu_post_reset(ptdev); in panthor_device_reset_work()
146 ret = panthor_fw_post_reset(ptdev); in panthor_device_reset_work()
147 atomic_set(&ptdev->reset.pending, 0); in panthor_device_reset_work()
148 panthor_sched_post_reset(ptdev, ret != 0); in panthor_device_reset_work()
152 panthor_device_unplug(ptdev); in panthor_device_reset_work()
153 drm_err(&ptdev->base, "Failed to boot MCU after reset, making device unusable."); in panthor_device_reset_work()
157 static bool panthor_device_is_initialized(struct panthor_device *ptdev) in panthor_device_is_initialized() argument
159 return !!ptdev->scheduler; in panthor_device_is_initialized()
167 int panthor_device_init(struct panthor_device *ptdev) in panthor_device_init() argument
174 init_completion(&ptdev->unplug.done); in panthor_device_init()
175 ret = drmm_mutex_init(&ptdev->base, &ptdev->unplug.lock); in panthor_device_init()
179 ret = drmm_mutex_init(&ptdev->base, &ptdev->pm.mmio_lock); in panthor_device_init()
184 drmm_mutex_init(&ptdev->base, &ptdev->gems.lock); in panthor_device_init()
185 INIT_LIST_HEAD(&ptdev->gems.node); in panthor_device_init()
188 atomic_set(&ptdev->pm.state, PANTHOR_DEVICE_PM_STATE_SUSPENDED); in panthor_device_init()
193 ptdev->pm.dummy_latest_flush = p; in panthor_device_init()
195 ret = drmm_add_action_or_reset(&ptdev->base, panthor_device_free_page, in panthor_device_init()
196 ptdev->pm.dummy_latest_flush); in panthor_device_init()
208 INIT_WORK(&ptdev->reset.work, panthor_device_reset_work); in panthor_device_init()
209 ptdev->reset.wq = alloc_ordered_workqueue("panthor-reset-wq", 0); in panthor_device_init()
210 if (!ptdev->reset.wq) in panthor_device_init()
213 ret = drmm_add_action_or_reset(&ptdev->base, panthor_device_reset_cleanup, NULL); in panthor_device_init()
217 ret = panthor_clk_init(ptdev); in panthor_device_init()
221 ret = panthor_devfreq_init(ptdev); in panthor_device_init()
225 ptdev->iomem = devm_platform_get_and_ioremap_resource(to_platform_device(ptdev->base.dev), in panthor_device_init()
227 if (IS_ERR(ptdev->iomem)) in panthor_device_init()
228 return PTR_ERR(ptdev->iomem); in panthor_device_init()
230 ptdev->phys_addr = res->start; in panthor_device_init()
232 ret = devm_pm_runtime_enable(ptdev->base.dev); in panthor_device_init()
236 ret = pm_runtime_resume_and_get(ptdev->base.dev); in panthor_device_init()
242 ret = panthor_device_resume(ptdev->base.dev); in panthor_device_init()
247 ret = panthor_gpu_init(ptdev); in panthor_device_init()
251 ret = panthor_gpu_coherency_init(ptdev); in panthor_device_init()
255 ret = panthor_mmu_init(ptdev); in panthor_device_init()
259 ret = panthor_fw_init(ptdev); in panthor_device_init()
263 ret = panthor_sched_init(ptdev); in panthor_device_init()
268 pm_runtime_set_autosuspend_delay(ptdev->base.dev, 50); in panthor_device_init()
269 pm_runtime_use_autosuspend(ptdev->base.dev); in panthor_device_init()
271 ret = drm_dev_register(&ptdev->base, 0); in panthor_device_init()
275 pm_runtime_put_autosuspend(ptdev->base.dev); in panthor_device_init()
279 pm_runtime_dont_use_autosuspend(ptdev->base.dev); in panthor_device_init()
280 panthor_sched_unplug(ptdev); in panthor_device_init()
283 panthor_fw_unplug(ptdev); in panthor_device_init()
286 panthor_mmu_unplug(ptdev); in panthor_device_init()
289 panthor_gpu_unplug(ptdev); in panthor_device_init()
292 pm_runtime_put_sync_suspend(ptdev->base.dev); in panthor_device_init()
356 const char *panthor_exception_name(struct panthor_device *ptdev, u32 exception_code) in panthor_exception_name() argument
368 struct panthor_device *ptdev = vma->vm_private_data; in panthor_mmio_vm_fault() local
376 if (!drm_dev_enter(&ptdev->base, &cookie)) in panthor_mmio_vm_fault()
379 mutex_lock(&ptdev->pm.mmio_lock); in panthor_mmio_vm_fault()
380 active = atomic_read(&ptdev->pm.state) == PANTHOR_DEVICE_PM_STATE_ACTIVE; in panthor_mmio_vm_fault()
385 pfn = __phys_to_pfn(ptdev->phys_addr + CSF_GPU_LATEST_FLUSH_ID); in panthor_mmio_vm_fault()
387 pfn = page_to_pfn(ptdev->pm.dummy_latest_flush); in panthor_mmio_vm_fault()
402 mutex_unlock(&ptdev->pm.mmio_lock); in panthor_mmio_vm_fault()
411 int panthor_device_mmap_io(struct panthor_device *ptdev, struct vm_area_struct *vma) in panthor_device_mmap_io() argument
432 vma->vm_private_data = ptdev; in panthor_device_mmap_io()
440 static int panthor_device_resume_hw_components(struct panthor_device *ptdev) in panthor_device_resume_hw_components() argument
444 panthor_gpu_resume(ptdev); in panthor_device_resume_hw_components()
445 panthor_mmu_resume(ptdev); in panthor_device_resume_hw_components()
447 ret = panthor_fw_resume(ptdev); in panthor_device_resume_hw_components()
451 panthor_mmu_suspend(ptdev); in panthor_device_resume_hw_components()
452 panthor_gpu_suspend(ptdev); in panthor_device_resume_hw_components()
458 struct panthor_device *ptdev = dev_get_drvdata(dev); in panthor_device_resume() local
461 if (atomic_read(&ptdev->pm.state) != PANTHOR_DEVICE_PM_STATE_SUSPENDED) in panthor_device_resume()
464 atomic_set(&ptdev->pm.state, PANTHOR_DEVICE_PM_STATE_RESUMING); in panthor_device_resume()
466 ret = clk_prepare_enable(ptdev->clks.core); in panthor_device_resume()
470 ret = clk_prepare_enable(ptdev->clks.stacks); in panthor_device_resume()
474 ret = clk_prepare_enable(ptdev->clks.coregroup); in panthor_device_resume()
478 panthor_devfreq_resume(ptdev); in panthor_device_resume()
480 if (panthor_device_is_initialized(ptdev) && in panthor_device_resume()
481 drm_dev_enter(&ptdev->base, &cookie)) { in panthor_device_resume()
485 if (atomic_read(&ptdev->reset.pending)) { in panthor_device_resume()
486 ptdev->reset.fast = false; in panthor_device_resume()
487 atomic_set(&ptdev->reset.pending, 0); in panthor_device_resume()
490 ret = panthor_device_resume_hw_components(ptdev); in panthor_device_resume()
491 if (ret && ptdev->reset.fast) { in panthor_device_resume()
492 drm_err(&ptdev->base, "Fast reset failed, trying a slow reset"); in panthor_device_resume()
493 ptdev->reset.fast = false; in panthor_device_resume()
494 ret = panthor_device_resume_hw_components(ptdev); in panthor_device_resume()
498 panthor_sched_resume(ptdev); in panthor_device_resume()
511 mutex_lock(&ptdev->pm.mmio_lock); in panthor_device_resume()
512 unmap_mapping_range(ptdev->base.anon_inode->i_mapping, in panthor_device_resume()
514 atomic_set(&ptdev->pm.state, PANTHOR_DEVICE_PM_STATE_ACTIVE); in panthor_device_resume()
515 mutex_unlock(&ptdev->pm.mmio_lock); in panthor_device_resume()
519 panthor_devfreq_suspend(ptdev); in panthor_device_resume()
520 clk_disable_unprepare(ptdev->clks.coregroup); in panthor_device_resume()
523 clk_disable_unprepare(ptdev->clks.stacks); in panthor_device_resume()
526 clk_disable_unprepare(ptdev->clks.core); in panthor_device_resume()
529 atomic_set(&ptdev->pm.state, PANTHOR_DEVICE_PM_STATE_SUSPENDED); in panthor_device_resume()
530 atomic_set(&ptdev->pm.recovery_needed, 1); in panthor_device_resume()
536 struct panthor_device *ptdev = dev_get_drvdata(dev); in panthor_device_suspend() local
539 if (atomic_read(&ptdev->pm.state) != PANTHOR_DEVICE_PM_STATE_ACTIVE) in panthor_device_suspend()
549 mutex_lock(&ptdev->pm.mmio_lock); in panthor_device_suspend()
550 atomic_set(&ptdev->pm.state, PANTHOR_DEVICE_PM_STATE_SUSPENDING); in panthor_device_suspend()
551 unmap_mapping_range(ptdev->base.anon_inode->i_mapping, in panthor_device_suspend()
553 mutex_unlock(&ptdev->pm.mmio_lock); in panthor_device_suspend()
555 if (panthor_device_is_initialized(ptdev) && in panthor_device_suspend()
556 drm_dev_enter(&ptdev->base, &cookie)) { in panthor_device_suspend()
557 cancel_work_sync(&ptdev->reset.work); in panthor_device_suspend()
562 panthor_sched_suspend(ptdev); in panthor_device_suspend()
563 panthor_fw_suspend(ptdev); in panthor_device_suspend()
564 panthor_mmu_suspend(ptdev); in panthor_device_suspend()
565 panthor_gpu_suspend(ptdev); in panthor_device_suspend()
569 panthor_devfreq_suspend(ptdev); in panthor_device_suspend()
571 clk_disable_unprepare(ptdev->clks.coregroup); in panthor_device_suspend()
572 clk_disable_unprepare(ptdev->clks.stacks); in panthor_device_suspend()
573 clk_disable_unprepare(ptdev->clks.core); in panthor_device_suspend()
574 atomic_set(&ptdev->pm.state, PANTHOR_DEVICE_PM_STATE_SUSPENDED); in panthor_device_suspend()