Lines Matching refs:pvr_dev
33 pvr_device_lost(struct pvr_device *pvr_dev) in pvr_device_lost() argument
35 if (!pvr_dev->lost) { in pvr_device_lost()
36 pvr_dev->lost = true; in pvr_device_lost()
37 drm_dev_unplug(from_pvr_device(pvr_dev)); in pvr_device_lost()
42 pvr_power_send_command(struct pvr_device *pvr_dev, struct rogue_fwif_kccb_cmd *pow_cmd) in pvr_power_send_command() argument
44 struct pvr_fw_device *fw_dev = &pvr_dev->fw_dev; in pvr_power_send_command()
51 err = pvr_kccb_send_cmd_powered(pvr_dev, pow_cmd, &slot_nr); in pvr_power_send_command()
56 return readl_poll_timeout(pvr_dev->fw_dev.power_sync, value, value != 0, 100, in pvr_power_send_command()
61 pvr_power_request_idle(struct pvr_device *pvr_dev) in pvr_power_request_idle() argument
70 return pvr_power_send_command(pvr_dev, &pow_cmd); in pvr_power_request_idle()
74 pvr_power_request_pwr_off(struct pvr_device *pvr_dev) in pvr_power_request_pwr_off() argument
83 return pvr_power_send_command(pvr_dev, &pow_cmd); in pvr_power_request_pwr_off()
87 pvr_power_fw_disable(struct pvr_device *pvr_dev, bool hard_reset) in pvr_power_fw_disable() argument
92 cancel_delayed_work_sync(&pvr_dev->watchdog.work); in pvr_power_fw_disable()
94 err = pvr_power_request_idle(pvr_dev); in pvr_power_fw_disable()
98 err = pvr_power_request_pwr_off(pvr_dev); in pvr_power_fw_disable()
103 return pvr_fw_stop(pvr_dev); in pvr_power_fw_disable()
107 pvr_power_fw_enable(struct pvr_device *pvr_dev) in pvr_power_fw_enable() argument
111 err = pvr_fw_start(pvr_dev); in pvr_power_fw_enable()
115 err = pvr_wait_for_fw_boot(pvr_dev); in pvr_power_fw_enable()
117 drm_err(from_pvr_device(pvr_dev), "Firmware failed to boot\n"); in pvr_power_fw_enable()
118 pvr_fw_stop(pvr_dev); in pvr_power_fw_enable()
122 queue_delayed_work(pvr_dev->sched_wq, &pvr_dev->watchdog.work, in pvr_power_fw_enable()
129 pvr_power_is_idle(struct pvr_device *pvr_dev) in pvr_power_is_idle() argument
135 enum rogue_fwif_pow_state pow_state = READ_ONCE(pvr_dev->fw_dev.fwif_sysdata->pow_state); in pvr_power_is_idle()
136 bool kccb_idle = pvr_kccb_is_idle(pvr_dev); in pvr_power_is_idle()
142 pvr_watchdog_kccb_stalled(struct pvr_device *pvr_dev) in pvr_watchdog_kccb_stalled() argument
145 u32 kccb_cmds_executed = pvr_dev->fw_dev.fwif_osdata->kccb_cmds_executed; in pvr_watchdog_kccb_stalled()
146 bool kccb_is_idle = pvr_kccb_is_idle(pvr_dev); in pvr_watchdog_kccb_stalled()
148 if (pvr_dev->watchdog.old_kccb_cmds_executed == kccb_cmds_executed && !kccb_is_idle) { in pvr_watchdog_kccb_stalled()
149 pvr_dev->watchdog.kccb_stall_count++; in pvr_watchdog_kccb_stalled()
155 if (pvr_dev->watchdog.kccb_stall_count == 2) { in pvr_watchdog_kccb_stalled()
156 pvr_dev->watchdog.kccb_stall_count = 0; in pvr_watchdog_kccb_stalled()
159 } else if (pvr_dev->watchdog.old_kccb_cmds_executed == kccb_cmds_executed) { in pvr_watchdog_kccb_stalled()
162 mutex_lock(&pvr_dev->queues.lock); in pvr_watchdog_kccb_stalled()
163 has_active_contexts = list_empty(&pvr_dev->queues.active); in pvr_watchdog_kccb_stalled()
164 mutex_unlock(&pvr_dev->queues.lock); in pvr_watchdog_kccb_stalled()
172 pvr_kccb_send_cmd_powered(pvr_dev, &health_check_cmd, NULL); in pvr_watchdog_kccb_stalled()
175 pvr_dev->watchdog.old_kccb_cmds_executed = kccb_cmds_executed; in pvr_watchdog_kccb_stalled()
176 pvr_dev->watchdog.kccb_stall_count = 0; in pvr_watchdog_kccb_stalled()
185 struct pvr_device *pvr_dev = container_of(work, struct pvr_device, in pvr_watchdog_worker() local
189 if (pvr_dev->lost) in pvr_watchdog_worker()
192 if (pm_runtime_get_if_in_use(from_pvr_device(pvr_dev)->dev) <= 0) in pvr_watchdog_worker()
195 if (!pvr_dev->fw_dev.booted) in pvr_watchdog_worker()
198 stalled = pvr_watchdog_kccb_stalled(pvr_dev); in pvr_watchdog_worker()
201 drm_err(from_pvr_device(pvr_dev), "FW stalled, trying hard reset"); in pvr_watchdog_worker()
203 pvr_power_reset(pvr_dev, true); in pvr_watchdog_worker()
208 pm_runtime_put(from_pvr_device(pvr_dev)->dev); in pvr_watchdog_worker()
211 if (!pvr_dev->lost) { in pvr_watchdog_worker()
212 queue_delayed_work(pvr_dev->sched_wq, &pvr_dev->watchdog.work, in pvr_watchdog_worker()
226 pvr_watchdog_init(struct pvr_device *pvr_dev) in pvr_watchdog_init() argument
228 INIT_DELAYED_WORK(&pvr_dev->watchdog.work, pvr_watchdog_worker); in pvr_watchdog_init()
238 struct pvr_device *pvr_dev = to_pvr_device(drm_dev); in pvr_power_device_suspend() local
245 if (pvr_dev->fw_dev.booted) { in pvr_power_device_suspend()
246 err = pvr_power_fw_disable(pvr_dev, false); in pvr_power_device_suspend()
251 clk_disable_unprepare(pvr_dev->mem_clk); in pvr_power_device_suspend()
252 clk_disable_unprepare(pvr_dev->sys_clk); in pvr_power_device_suspend()
253 clk_disable_unprepare(pvr_dev->core_clk); in pvr_power_device_suspend()
266 struct pvr_device *pvr_dev = to_pvr_device(drm_dev); in pvr_power_device_resume() local
273 err = clk_prepare_enable(pvr_dev->core_clk); in pvr_power_device_resume()
277 err = clk_prepare_enable(pvr_dev->sys_clk); in pvr_power_device_resume()
281 err = clk_prepare_enable(pvr_dev->mem_clk); in pvr_power_device_resume()
285 if (pvr_dev->fw_dev.booted) { in pvr_power_device_resume()
286 err = pvr_power_fw_enable(pvr_dev); in pvr_power_device_resume()
296 clk_disable_unprepare(pvr_dev->mem_clk); in pvr_power_device_resume()
299 clk_disable_unprepare(pvr_dev->sys_clk); in pvr_power_device_resume()
302 clk_disable_unprepare(pvr_dev->core_clk); in pvr_power_device_resume()
315 struct pvr_device *pvr_dev = to_pvr_device(drm_dev); in pvr_power_device_idle() local
317 return pvr_power_is_idle(pvr_dev) ? 0 : -EBUSY; in pvr_power_device_idle()
335 pvr_power_reset(struct pvr_device *pvr_dev, bool hard_reset) in pvr_power_reset() argument
344 WARN_ON(pvr_power_get(pvr_dev)); in pvr_power_reset()
346 down_write(&pvr_dev->reset_sem); in pvr_power_reset()
348 if (pvr_dev->lost) { in pvr_power_reset()
354 disable_irq(pvr_dev->irq); in pvr_power_reset()
358 pvr_queue_device_pre_reset(pvr_dev); in pvr_power_reset()
362 err = pvr_power_fw_disable(pvr_dev, hard_reset); in pvr_power_reset()
365 pvr_dev->fw_dev.booted = false; in pvr_power_reset()
366 WARN_ON(pm_runtime_force_suspend(from_pvr_device(pvr_dev)->dev)); in pvr_power_reset()
368 err = pvr_fw_hard_reset(pvr_dev); in pvr_power_reset()
372 err = pm_runtime_force_resume(from_pvr_device(pvr_dev)->dev); in pvr_power_reset()
373 pvr_dev->fw_dev.booted = true; in pvr_power_reset()
378 pvr_dev->fw_dev.fwif_sysdata->hwr_state_flags &= in pvr_power_reset()
383 pvr_fw_irq_clear(pvr_dev); in pvr_power_reset()
385 err = pvr_power_fw_enable(pvr_dev); in pvr_power_reset()
392 drm_err(from_pvr_device(pvr_dev), "FW stalled, trying hard reset"); in pvr_power_reset()
398 pvr_queue_device_post_reset(pvr_dev); in pvr_power_reset()
400 enable_irq(pvr_dev->irq); in pvr_power_reset()
402 up_write(&pvr_dev->reset_sem); in pvr_power_reset()
404 pvr_power_put(pvr_dev); in pvr_power_reset()
409 drm_err(from_pvr_device(pvr_dev), "GPU device lost"); in pvr_power_reset()
410 pvr_device_lost(pvr_dev); in pvr_power_reset()
415 pvr_queue_device_post_reset(pvr_dev); in pvr_power_reset()
418 up_write(&pvr_dev->reset_sem); in pvr_power_reset()
420 pvr_power_put(pvr_dev); in pvr_power_reset()
430 pvr_watchdog_fini(struct pvr_device *pvr_dev) in pvr_watchdog_fini() argument
432 cancel_delayed_work_sync(&pvr_dev->watchdog.work); in pvr_watchdog_fini()