Lines Matching refs:ptdev

25 static int panthor_clk_init(struct panthor_device *ptdev)  in panthor_clk_init()  argument
27 ptdev->clks.core = devm_clk_get(ptdev->base.dev, NULL); in panthor_clk_init()
28 if (IS_ERR(ptdev->clks.core)) in panthor_clk_init()
29 return dev_err_probe(ptdev->base.dev, in panthor_clk_init()
30 PTR_ERR(ptdev->clks.core), in panthor_clk_init()
33 ptdev->clks.stacks = devm_clk_get_optional(ptdev->base.dev, "stacks"); in panthor_clk_init()
34 if (IS_ERR(ptdev->clks.stacks)) in panthor_clk_init()
35 return dev_err_probe(ptdev->base.dev, in panthor_clk_init()
36 PTR_ERR(ptdev->clks.stacks), in panthor_clk_init()
39 ptdev->clks.coregroup = devm_clk_get_optional(ptdev->base.dev, "coregroup"); in panthor_clk_init()
40 if (IS_ERR(ptdev->clks.coregroup)) in panthor_clk_init()
41 return dev_err_probe(ptdev->base.dev, in panthor_clk_init()
42 PTR_ERR(ptdev->clks.coregroup), in panthor_clk_init()
45 drm_info(&ptdev->base, "clock rate = %lu\n", clk_get_rate(ptdev->clks.core)); in panthor_clk_init()
49 void panthor_device_unplug(struct panthor_device *ptdev) in panthor_device_unplug() argument
57 mutex_lock(&ptdev->unplug.lock); in panthor_device_unplug()
58 if (drm_dev_is_unplugged(&ptdev->base)) { in panthor_device_unplug()
62 mutex_unlock(&ptdev->unplug.lock); in panthor_device_unplug()
63 wait_for_completion(&ptdev->unplug.done); in panthor_device_unplug()
70 drm_dev_unplug(&ptdev->base); in panthor_device_unplug()
75 mutex_unlock(&ptdev->unplug.lock); in panthor_device_unplug()
77 drm_WARN_ON(&ptdev->base, pm_runtime_get_sync(ptdev->base.dev) < 0); in panthor_device_unplug()
82 panthor_sched_unplug(ptdev); in panthor_device_unplug()
83 panthor_fw_unplug(ptdev); in panthor_device_unplug()
84 panthor_mmu_unplug(ptdev); in panthor_device_unplug()
85 panthor_gpu_unplug(ptdev); in panthor_device_unplug()
87 pm_runtime_dont_use_autosuspend(ptdev->base.dev); in panthor_device_unplug()
88 pm_runtime_put_sync_suspend(ptdev->base.dev); in panthor_device_unplug()
92 panthor_device_suspend(ptdev->base.dev); in panthor_device_unplug()
97 complete_all(&ptdev->unplug.done); in panthor_device_unplug()
102 struct panthor_device *ptdev = container_of(ddev, struct panthor_device, base); in panthor_device_reset_cleanup() local
104 cancel_work_sync(&ptdev->reset.work); in panthor_device_reset_cleanup()
105 destroy_workqueue(ptdev->reset.wq); in panthor_device_reset_cleanup()
110 struct panthor_device *ptdev = container_of(work, struct panthor_device, reset.work); in panthor_device_reset_work() local
113 if (atomic_read(&ptdev->pm.state) != PANTHOR_DEVICE_PM_STATE_ACTIVE) { in panthor_device_reset_work()
118 atomic_set(&ptdev->reset.pending, 0); in panthor_device_reset_work()
122 if (!drm_dev_enter(&ptdev->base, &cookie)) in panthor_device_reset_work()
125 panthor_sched_pre_reset(ptdev); in panthor_device_reset_work()
126 panthor_fw_pre_reset(ptdev, true); in panthor_device_reset_work()
127 panthor_mmu_pre_reset(ptdev); in panthor_device_reset_work()
128 panthor_gpu_soft_reset(ptdev); in panthor_device_reset_work()
129 panthor_gpu_l2_power_on(ptdev); in panthor_device_reset_work()
130 panthor_mmu_post_reset(ptdev); in panthor_device_reset_work()
131 ret = panthor_fw_post_reset(ptdev); in panthor_device_reset_work()
132 atomic_set(&ptdev->reset.pending, 0); in panthor_device_reset_work()
133 panthor_sched_post_reset(ptdev, ret != 0); in panthor_device_reset_work()
137 panthor_device_unplug(ptdev); in panthor_device_reset_work()
138 drm_err(&ptdev->base, "Failed to boot MCU after reset, making device unusable."); in panthor_device_reset_work()
142 static bool panthor_device_is_initialized(struct panthor_device *ptdev) in panthor_device_is_initialized() argument
144 return !!ptdev->scheduler; in panthor_device_is_initialized()
152 int panthor_device_init(struct panthor_device *ptdev) in panthor_device_init() argument
159 ptdev->coherent = device_get_dma_attr(ptdev->base.dev) == DEV_DMA_COHERENT; in panthor_device_init()
161 init_completion(&ptdev->unplug.done); in panthor_device_init()
162 ret = drmm_mutex_init(&ptdev->base, &ptdev->unplug.lock); in panthor_device_init()
166 ret = drmm_mutex_init(&ptdev->base, &ptdev->pm.mmio_lock); in panthor_device_init()
170 atomic_set(&ptdev->pm.state, PANTHOR_DEVICE_PM_STATE_SUSPENDED); in panthor_device_init()
175 ptdev->pm.dummy_latest_flush = p; in panthor_device_init()
177 ret = drmm_add_action_or_reset(&ptdev->base, panthor_device_free_page, in panthor_device_init()
178 ptdev->pm.dummy_latest_flush); in panthor_device_init()
190 INIT_WORK(&ptdev->reset.work, panthor_device_reset_work); in panthor_device_init()
191 ptdev->reset.wq = alloc_ordered_workqueue("panthor-reset-wq", 0); in panthor_device_init()
192 if (!ptdev->reset.wq) in panthor_device_init()
195 ret = drmm_add_action_or_reset(&ptdev->base, panthor_device_reset_cleanup, NULL); in panthor_device_init()
199 ret = panthor_clk_init(ptdev); in panthor_device_init()
203 ret = panthor_devfreq_init(ptdev); in panthor_device_init()
207 ptdev->iomem = devm_platform_get_and_ioremap_resource(to_platform_device(ptdev->base.dev), in panthor_device_init()
209 if (IS_ERR(ptdev->iomem)) in panthor_device_init()
210 return PTR_ERR(ptdev->iomem); in panthor_device_init()
212 ptdev->phys_addr = res->start; in panthor_device_init()
214 ret = devm_pm_runtime_enable(ptdev->base.dev); in panthor_device_init()
218 ret = pm_runtime_resume_and_get(ptdev->base.dev); in panthor_device_init()
224 ret = panthor_device_resume(ptdev->base.dev); in panthor_device_init()
229 ret = panthor_gpu_init(ptdev); in panthor_device_init()
233 ret = panthor_mmu_init(ptdev); in panthor_device_init()
237 ret = panthor_fw_init(ptdev); in panthor_device_init()
241 ret = panthor_sched_init(ptdev); in panthor_device_init()
246 pm_runtime_set_autosuspend_delay(ptdev->base.dev, 50); in panthor_device_init()
247 pm_runtime_use_autosuspend(ptdev->base.dev); in panthor_device_init()
249 ret = drm_dev_register(&ptdev->base, 0); in panthor_device_init()
253 pm_runtime_put_autosuspend(ptdev->base.dev); in panthor_device_init()
257 pm_runtime_dont_use_autosuspend(ptdev->base.dev); in panthor_device_init()
258 panthor_sched_unplug(ptdev); in panthor_device_init()
261 panthor_fw_unplug(ptdev); in panthor_device_init()
264 panthor_mmu_unplug(ptdev); in panthor_device_init()
267 panthor_gpu_unplug(ptdev); in panthor_device_init()
270 pm_runtime_put_sync_suspend(ptdev->base.dev); in panthor_device_init()
334 const char *panthor_exception_name(struct panthor_device *ptdev, u32 exception_code) in panthor_exception_name() argument
346 struct panthor_device *ptdev = vma->vm_private_data; in panthor_mmio_vm_fault() local
354 if (!drm_dev_enter(&ptdev->base, &cookie)) in panthor_mmio_vm_fault()
357 mutex_lock(&ptdev->pm.mmio_lock); in panthor_mmio_vm_fault()
358 active = atomic_read(&ptdev->pm.state) == PANTHOR_DEVICE_PM_STATE_ACTIVE; in panthor_mmio_vm_fault()
363 pfn = __phys_to_pfn(ptdev->phys_addr + CSF_GPU_LATEST_FLUSH_ID); in panthor_mmio_vm_fault()
365 pfn = page_to_pfn(ptdev->pm.dummy_latest_flush); in panthor_mmio_vm_fault()
380 mutex_unlock(&ptdev->pm.mmio_lock); in panthor_mmio_vm_fault()
389 int panthor_device_mmap_io(struct panthor_device *ptdev, struct vm_area_struct *vma) in panthor_device_mmap_io() argument
410 vma->vm_private_data = ptdev; in panthor_device_mmap_io()
420 struct panthor_device *ptdev = dev_get_drvdata(dev); in panthor_device_resume() local
423 if (atomic_read(&ptdev->pm.state) != PANTHOR_DEVICE_PM_STATE_SUSPENDED) in panthor_device_resume()
426 atomic_set(&ptdev->pm.state, PANTHOR_DEVICE_PM_STATE_RESUMING); in panthor_device_resume()
428 ret = clk_prepare_enable(ptdev->clks.core); in panthor_device_resume()
432 ret = clk_prepare_enable(ptdev->clks.stacks); in panthor_device_resume()
436 ret = clk_prepare_enable(ptdev->clks.coregroup); in panthor_device_resume()
440 ret = panthor_devfreq_resume(ptdev); in panthor_device_resume()
444 if (panthor_device_is_initialized(ptdev) && in panthor_device_resume()
445 drm_dev_enter(&ptdev->base, &cookie)) { in panthor_device_resume()
446 panthor_gpu_resume(ptdev); in panthor_device_resume()
447 panthor_mmu_resume(ptdev); in panthor_device_resume()
448 ret = drm_WARN_ON(&ptdev->base, panthor_fw_resume(ptdev)); in panthor_device_resume()
450 panthor_sched_resume(ptdev); in panthor_device_resume()
452 panthor_mmu_suspend(ptdev); in panthor_device_resume()
453 panthor_gpu_suspend(ptdev); in panthor_device_resume()
462 if (atomic_read(&ptdev->reset.pending)) in panthor_device_resume()
463 queue_work(ptdev->reset.wq, &ptdev->reset.work); in panthor_device_resume()
470 mutex_lock(&ptdev->pm.mmio_lock); in panthor_device_resume()
471 unmap_mapping_range(ptdev->base.anon_inode->i_mapping, in panthor_device_resume()
473 atomic_set(&ptdev->pm.state, PANTHOR_DEVICE_PM_STATE_ACTIVE); in panthor_device_resume()
474 mutex_unlock(&ptdev->pm.mmio_lock); in panthor_device_resume()
478 panthor_devfreq_suspend(ptdev); in panthor_device_resume()
481 clk_disable_unprepare(ptdev->clks.coregroup); in panthor_device_resume()
484 clk_disable_unprepare(ptdev->clks.stacks); in panthor_device_resume()
487 clk_disable_unprepare(ptdev->clks.core); in panthor_device_resume()
490 atomic_set(&ptdev->pm.state, PANTHOR_DEVICE_PM_STATE_SUSPENDED); in panthor_device_resume()
496 struct panthor_device *ptdev = dev_get_drvdata(dev); in panthor_device_suspend() local
499 if (atomic_read(&ptdev->pm.state) != PANTHOR_DEVICE_PM_STATE_ACTIVE) in panthor_device_suspend()
509 mutex_lock(&ptdev->pm.mmio_lock); in panthor_device_suspend()
510 atomic_set(&ptdev->pm.state, PANTHOR_DEVICE_PM_STATE_SUSPENDING); in panthor_device_suspend()
511 unmap_mapping_range(ptdev->base.anon_inode->i_mapping, in panthor_device_suspend()
513 mutex_unlock(&ptdev->pm.mmio_lock); in panthor_device_suspend()
515 if (panthor_device_is_initialized(ptdev) && in panthor_device_suspend()
516 drm_dev_enter(&ptdev->base, &cookie)) { in panthor_device_suspend()
517 cancel_work_sync(&ptdev->reset.work); in panthor_device_suspend()
522 panthor_sched_suspend(ptdev); in panthor_device_suspend()
523 panthor_fw_suspend(ptdev); in panthor_device_suspend()
524 panthor_mmu_suspend(ptdev); in panthor_device_suspend()
525 panthor_gpu_suspend(ptdev); in panthor_device_suspend()
529 ret = panthor_devfreq_suspend(ptdev); in panthor_device_suspend()
531 if (panthor_device_is_initialized(ptdev) && in panthor_device_suspend()
532 drm_dev_enter(&ptdev->base, &cookie)) { in panthor_device_suspend()
533 panthor_gpu_resume(ptdev); in panthor_device_suspend()
534 panthor_mmu_resume(ptdev); in panthor_device_suspend()
535 drm_WARN_ON(&ptdev->base, panthor_fw_resume(ptdev)); in panthor_device_suspend()
536 panthor_sched_resume(ptdev); in panthor_device_suspend()
543 clk_disable_unprepare(ptdev->clks.coregroup); in panthor_device_suspend()
544 clk_disable_unprepare(ptdev->clks.stacks); in panthor_device_suspend()
545 clk_disable_unprepare(ptdev->clks.core); in panthor_device_suspend()
546 atomic_set(&ptdev->pm.state, PANTHOR_DEVICE_PM_STATE_SUSPENDED); in panthor_device_suspend()
555 mutex_lock(&ptdev->pm.mmio_lock); in panthor_device_suspend()
556 atomic_set(&ptdev->pm.state, PANTHOR_DEVICE_PM_STATE_ACTIVE); in panthor_device_suspend()
557 unmap_mapping_range(ptdev->base.anon_inode->i_mapping, in panthor_device_suspend()
559 mutex_unlock(&ptdev->pm.mmio_lock); in panthor_device_suspend()