Lines Matching refs:pvr_dev

37 pvr_device_lost(struct pvr_device *pvr_dev)  in pvr_device_lost()  argument
39 if (!pvr_dev->lost) { in pvr_device_lost()
40 pvr_dev->lost = true; in pvr_device_lost()
41 drm_dev_unplug(from_pvr_device(pvr_dev)); in pvr_device_lost()
46 pvr_power_send_command(struct pvr_device *pvr_dev, struct rogue_fwif_kccb_cmd *pow_cmd) in pvr_power_send_command() argument
48 struct pvr_fw_device *fw_dev = &pvr_dev->fw_dev; in pvr_power_send_command()
55 err = pvr_kccb_send_cmd_powered(pvr_dev, pow_cmd, &slot_nr); in pvr_power_send_command()
60 return readl_poll_timeout(pvr_dev->fw_dev.power_sync, value, value != 0, 100, in pvr_power_send_command()
65 pvr_power_request_idle(struct pvr_device *pvr_dev) in pvr_power_request_idle() argument
74 return pvr_power_send_command(pvr_dev, &pow_cmd); in pvr_power_request_idle()
78 pvr_power_request_pwr_off(struct pvr_device *pvr_dev) in pvr_power_request_pwr_off() argument
87 return pvr_power_send_command(pvr_dev, &pow_cmd); in pvr_power_request_pwr_off()
91 pvr_power_fw_disable(struct pvr_device *pvr_dev, bool hard_reset) in pvr_power_fw_disable() argument
96 cancel_delayed_work_sync(&pvr_dev->watchdog.work); in pvr_power_fw_disable()
98 err = pvr_power_request_idle(pvr_dev); in pvr_power_fw_disable()
102 err = pvr_power_request_pwr_off(pvr_dev); in pvr_power_fw_disable()
107 return pvr_fw_stop(pvr_dev); in pvr_power_fw_disable()
111 pvr_power_fw_enable(struct pvr_device *pvr_dev) in pvr_power_fw_enable() argument
115 err = pvr_fw_start(pvr_dev); in pvr_power_fw_enable()
119 err = pvr_wait_for_fw_boot(pvr_dev); in pvr_power_fw_enable()
121 drm_err(from_pvr_device(pvr_dev), "Firmware failed to boot\n"); in pvr_power_fw_enable()
122 pvr_fw_stop(pvr_dev); in pvr_power_fw_enable()
126 queue_delayed_work(pvr_dev->sched_wq, &pvr_dev->watchdog.work, in pvr_power_fw_enable()
133 pvr_power_is_idle(struct pvr_device *pvr_dev) in pvr_power_is_idle() argument
139 enum rogue_fwif_pow_state pow_state = READ_ONCE(pvr_dev->fw_dev.fwif_sysdata->pow_state); in pvr_power_is_idle()
140 bool kccb_idle = pvr_kccb_is_idle(pvr_dev); in pvr_power_is_idle()
146 pvr_watchdog_kccb_stalled(struct pvr_device *pvr_dev) in pvr_watchdog_kccb_stalled() argument
149 u32 kccb_cmds_executed = pvr_dev->fw_dev.fwif_osdata->kccb_cmds_executed; in pvr_watchdog_kccb_stalled()
150 bool kccb_is_idle = pvr_kccb_is_idle(pvr_dev); in pvr_watchdog_kccb_stalled()
152 if (pvr_dev->watchdog.old_kccb_cmds_executed == kccb_cmds_executed && !kccb_is_idle) { in pvr_watchdog_kccb_stalled()
153 pvr_dev->watchdog.kccb_stall_count++; in pvr_watchdog_kccb_stalled()
159 if (pvr_dev->watchdog.kccb_stall_count == 2) { in pvr_watchdog_kccb_stalled()
160 pvr_dev->watchdog.kccb_stall_count = 0; in pvr_watchdog_kccb_stalled()
163 } else if (pvr_dev->watchdog.old_kccb_cmds_executed == kccb_cmds_executed) { in pvr_watchdog_kccb_stalled()
166 mutex_lock(&pvr_dev->queues.lock); in pvr_watchdog_kccb_stalled()
167 has_active_contexts = list_empty(&pvr_dev->queues.active); in pvr_watchdog_kccb_stalled()
168 mutex_unlock(&pvr_dev->queues.lock); in pvr_watchdog_kccb_stalled()
176 pvr_kccb_send_cmd_powered(pvr_dev, &health_check_cmd, NULL); in pvr_watchdog_kccb_stalled()
179 pvr_dev->watchdog.old_kccb_cmds_executed = kccb_cmds_executed; in pvr_watchdog_kccb_stalled()
180 pvr_dev->watchdog.kccb_stall_count = 0; in pvr_watchdog_kccb_stalled()
189 struct pvr_device *pvr_dev = container_of(work, struct pvr_device, in pvr_watchdog_worker() local
193 if (pvr_dev->lost) in pvr_watchdog_worker()
196 if (pm_runtime_get_if_in_use(from_pvr_device(pvr_dev)->dev) <= 0) in pvr_watchdog_worker()
199 if (!pvr_dev->fw_dev.booted) in pvr_watchdog_worker()
202 stalled = pvr_watchdog_kccb_stalled(pvr_dev); in pvr_watchdog_worker()
205 drm_err(from_pvr_device(pvr_dev), "FW stalled, trying hard reset"); in pvr_watchdog_worker()
207 pvr_power_reset(pvr_dev, true); in pvr_watchdog_worker()
212 pm_runtime_put(from_pvr_device(pvr_dev)->dev); in pvr_watchdog_worker()
215 if (!pvr_dev->lost) { in pvr_watchdog_worker()
216 queue_delayed_work(pvr_dev->sched_wq, &pvr_dev->watchdog.work, in pvr_watchdog_worker()
230 pvr_watchdog_init(struct pvr_device *pvr_dev) in pvr_watchdog_init() argument
232 INIT_DELAYED_WORK(&pvr_dev->watchdog.work, pvr_watchdog_worker); in pvr_watchdog_init()
242 struct pvr_device *pvr_dev = to_pvr_device(drm_dev); in pvr_power_device_suspend() local
249 if (pvr_dev->fw_dev.booted) { in pvr_power_device_suspend()
250 err = pvr_power_fw_disable(pvr_dev, false); in pvr_power_device_suspend()
255 clk_disable_unprepare(pvr_dev->mem_clk); in pvr_power_device_suspend()
256 clk_disable_unprepare(pvr_dev->sys_clk); in pvr_power_device_suspend()
257 clk_disable_unprepare(pvr_dev->core_clk); in pvr_power_device_suspend()
259 err = reset_control_assert(pvr_dev->reset); in pvr_power_device_suspend()
272 struct pvr_device *pvr_dev = to_pvr_device(drm_dev); in pvr_power_device_resume() local
279 err = clk_prepare_enable(pvr_dev->core_clk); in pvr_power_device_resume()
283 err = clk_prepare_enable(pvr_dev->sys_clk); in pvr_power_device_resume()
287 err = clk_prepare_enable(pvr_dev->mem_clk); in pvr_power_device_resume()
301 err = reset_control_deassert(pvr_dev->reset); in pvr_power_device_resume()
305 if (pvr_dev->fw_dev.booted) { in pvr_power_device_resume()
306 err = pvr_power_fw_enable(pvr_dev); in pvr_power_device_resume()
316 reset_control_assert(pvr_dev->reset); in pvr_power_device_resume()
319 clk_disable_unprepare(pvr_dev->mem_clk); in pvr_power_device_resume()
322 clk_disable_unprepare(pvr_dev->sys_clk); in pvr_power_device_resume()
325 clk_disable_unprepare(pvr_dev->core_clk); in pvr_power_device_resume()
338 struct pvr_device *pvr_dev = to_pvr_device(drm_dev); in pvr_power_device_idle() local
340 return pvr_power_is_idle(pvr_dev) ? 0 : -EBUSY; in pvr_power_device_idle()
344 pvr_power_clear_error(struct pvr_device *pvr_dev) in pvr_power_clear_error() argument
346 struct device *dev = from_pvr_device(pvr_dev)->dev; in pvr_power_clear_error()
359 drm_err(from_pvr_device(pvr_dev), in pvr_power_clear_error()
381 pvr_power_get_clear(struct pvr_device *pvr_dev) in pvr_power_get_clear() argument
385 err = pvr_power_get(pvr_dev); in pvr_power_get_clear()
389 drm_warn(from_pvr_device(pvr_dev), in pvr_power_get_clear()
393 err = pvr_power_clear_error(pvr_dev); in pvr_power_get_clear()
397 return pvr_power_get(pvr_dev); in pvr_power_get_clear()
415 pvr_power_reset(struct pvr_device *pvr_dev, bool hard_reset) in pvr_power_reset() argument
424 WARN_ON(pvr_power_get_clear(pvr_dev)); in pvr_power_reset()
426 down_write(&pvr_dev->reset_sem); in pvr_power_reset()
428 if (pvr_dev->lost) { in pvr_power_reset()
434 disable_irq(pvr_dev->irq); in pvr_power_reset()
438 pvr_queue_device_pre_reset(pvr_dev); in pvr_power_reset()
442 err = pvr_power_fw_disable(pvr_dev, hard_reset); in pvr_power_reset()
445 pvr_dev->fw_dev.booted = false; in pvr_power_reset()
446 WARN_ON(pvr_power_device_suspend(from_pvr_device(pvr_dev)->dev)); in pvr_power_reset()
448 err = pvr_fw_hard_reset(pvr_dev); in pvr_power_reset()
452 err = pvr_power_device_resume(from_pvr_device(pvr_dev)->dev); in pvr_power_reset()
453 pvr_dev->fw_dev.booted = true; in pvr_power_reset()
458 pvr_dev->fw_dev.fwif_sysdata->hwr_state_flags &= in pvr_power_reset()
463 pvr_fw_irq_clear(pvr_dev); in pvr_power_reset()
465 err = pvr_power_fw_enable(pvr_dev); in pvr_power_reset()
472 drm_err(from_pvr_device(pvr_dev), "FW stalled, trying hard reset"); in pvr_power_reset()
478 pvr_queue_device_post_reset(pvr_dev); in pvr_power_reset()
480 enable_irq(pvr_dev->irq); in pvr_power_reset()
482 up_write(&pvr_dev->reset_sem); in pvr_power_reset()
484 pvr_power_put(pvr_dev); in pvr_power_reset()
489 drm_err(from_pvr_device(pvr_dev), "GPU device lost"); in pvr_power_reset()
490 pvr_device_lost(pvr_dev); in pvr_power_reset()
495 pvr_queue_device_post_reset(pvr_dev); in pvr_power_reset()
498 up_write(&pvr_dev->reset_sem); in pvr_power_reset()
500 pvr_power_put(pvr_dev); in pvr_power_reset()
510 pvr_watchdog_fini(struct pvr_device *pvr_dev) in pvr_watchdog_fini() argument
512 cancel_delayed_work_sync(&pvr_dev->watchdog.work); in pvr_watchdog_fini()
515 int pvr_power_domains_init(struct pvr_device *pvr_dev) in pvr_power_domains_init() argument
517 struct device *dev = from_pvr_device(pvr_dev)->dev; in pvr_power_domains_init()
585 pvr_dev->power = (struct pvr_device_power){ in pvr_power_domains_init()
606 void pvr_power_domains_fini(struct pvr_device *pvr_dev) in pvr_power_domains_fini() argument
608 const int domain_count = pvr_dev->power.domain_count; in pvr_power_domains_fini()
613 device_link_del(pvr_dev->power.domain_links[i]); in pvr_power_domains_fini()
618 dev_pm_domain_detach(pvr_dev->power.domain_devs[i], true); in pvr_power_domains_fini()
620 kfree(pvr_dev->power.domain_links); in pvr_power_domains_fini()
621 kfree(pvr_dev->power.domain_devs); in pvr_power_domains_fini()
623 pvr_dev->power = (struct pvr_device_power){ 0 }; in pvr_power_domains_fini()