Lines Matching refs:pvr_dev

49 pvr_ccb_init(struct pvr_device *pvr_dev, struct pvr_ccb *pvr_ccb,  in pvr_ccb_init()  argument
59 err = drmm_mutex_init(from_pvr_device(pvr_dev), &pvr_ccb->lock); in pvr_ccb_init()
67 pvr_ccb->ctrl = pvr_fw_object_create_and_map(pvr_dev, sizeof(*pvr_ccb->ctrl), in pvr_ccb_init()
73 pvr_ccb->ccb = pvr_fw_object_create_and_map(pvr_dev, ccb_size, in pvr_ccb_init()
137 process_fwccb_command(struct pvr_device *pvr_dev, struct rogue_fwif_fwccb_cmd *cmd) in process_fwccb_command() argument
141 pvr_power_reset(pvr_dev, false); in process_fwccb_command()
145 pvr_free_list_process_reconstruct_req(pvr_dev, in process_fwccb_command()
150 pvr_free_list_process_grow_req(pvr_dev, &cmd->cmd_data.cmd_free_list_gs); in process_fwccb_command()
154 drm_info(from_pvr_device(pvr_dev), "Received unknown FWCCB command %x\n", in process_fwccb_command()
164 void pvr_fwccb_process(struct pvr_device *pvr_dev) in pvr_fwccb_process() argument
166 struct rogue_fwif_fwccb_cmd *fwccb = pvr_dev->fwccb.ccb; in pvr_fwccb_process()
167 struct rogue_fwif_ccb_ctl *ctrl = pvr_dev->fwccb.ctrl; in pvr_fwccb_process()
170 mutex_lock(&pvr_dev->fwccb.lock); in pvr_fwccb_process()
178 mutex_unlock(&pvr_dev->fwccb.lock); in pvr_fwccb_process()
180 process_fwccb_command(pvr_dev, &cmd); in pvr_fwccb_process()
182 mutex_lock(&pvr_dev->fwccb.lock); in pvr_fwccb_process()
185 mutex_unlock(&pvr_dev->fwccb.lock); in pvr_fwccb_process()
195 static u32 pvr_kccb_capacity(struct pvr_device *pvr_dev) in pvr_kccb_capacity() argument
202 return pvr_dev->kccb.slot_count - 1; in pvr_kccb_capacity()
215 pvr_kccb_used_slot_count_locked(struct pvr_device *pvr_dev) in pvr_kccb_used_slot_count_locked() argument
217 struct pvr_ccb *pvr_ccb = &pvr_dev->kccb.ccb; in pvr_kccb_used_slot_count_locked()
228 used_count = wr_offset + pvr_dev->kccb.slot_count - rd_offset; in pvr_kccb_used_slot_count_locked()
241 pvr_kccb_send_cmd_reserved_powered(struct pvr_device *pvr_dev, in pvr_kccb_send_cmd_reserved_powered() argument
245 struct pvr_ccb *pvr_ccb = &pvr_dev->kccb.ccb; in pvr_kccb_send_cmd_reserved_powered()
251 WARN_ON(pvr_dev->lost); in pvr_kccb_send_cmd_reserved_powered()
255 if (WARN_ON(!pvr_dev->kccb.reserved_count)) in pvr_kccb_send_cmd_reserved_powered()
269 WRITE_ONCE(pvr_dev->kccb.rtn[old_write_offset], in pvr_kccb_send_cmd_reserved_powered()
274 pvr_dev->kccb.reserved_count--; in pvr_kccb_send_cmd_reserved_powered()
277 pvr_fw_mts_schedule(pvr_dev, in pvr_kccb_send_cmd_reserved_powered()
292 static bool pvr_kccb_try_reserve_slot(struct pvr_device *pvr_dev) in pvr_kccb_try_reserve_slot() argument
297 mutex_lock(&pvr_dev->kccb.ccb.lock); in pvr_kccb_try_reserve_slot()
299 used_count = pvr_kccb_used_slot_count_locked(pvr_dev); in pvr_kccb_try_reserve_slot()
300 if (pvr_dev->kccb.reserved_count < pvr_kccb_capacity(pvr_dev) - used_count) { in pvr_kccb_try_reserve_slot()
301 pvr_dev->kccb.reserved_count++; in pvr_kccb_try_reserve_slot()
305 mutex_unlock(&pvr_dev->kccb.ccb.lock); in pvr_kccb_try_reserve_slot()
319 static int pvr_kccb_reserve_slot_sync(struct pvr_device *pvr_dev) in pvr_kccb_reserve_slot_sync() argument
327 reserved = pvr_kccb_try_reserve_slot(pvr_dev); in pvr_kccb_reserve_slot_sync()
351 pvr_kccb_send_cmd_powered(struct pvr_device *pvr_dev, struct rogue_fwif_kccb_cmd *cmd, in pvr_kccb_send_cmd_powered() argument
356 err = pvr_kccb_reserve_slot_sync(pvr_dev); in pvr_kccb_send_cmd_powered()
360 pvr_kccb_send_cmd_reserved_powered(pvr_dev, cmd, kccb_slot); in pvr_kccb_send_cmd_powered()
375 pvr_kccb_send_cmd(struct pvr_device *pvr_dev, struct rogue_fwif_kccb_cmd *cmd, in pvr_kccb_send_cmd() argument
380 err = pvr_power_get(pvr_dev); in pvr_kccb_send_cmd()
384 err = pvr_kccb_send_cmd_powered(pvr_dev, cmd, kccb_slot); in pvr_kccb_send_cmd()
386 pvr_power_put(pvr_dev); in pvr_kccb_send_cmd()
403 pvr_kccb_wait_for_completion(struct pvr_device *pvr_dev, u32 slot_nr, in pvr_kccb_wait_for_completion() argument
406 int ret = wait_event_timeout(pvr_dev->kccb.rtn_q, READ_ONCE(pvr_dev->kccb.rtn[slot_nr]) & in pvr_kccb_wait_for_completion()
410 *rtn_out = READ_ONCE(pvr_dev->kccb.rtn[slot_nr]); in pvr_kccb_wait_for_completion()
424 pvr_kccb_is_idle(struct pvr_device *pvr_dev) in pvr_kccb_is_idle() argument
426 struct rogue_fwif_ccb_ctl *ctrl = pvr_dev->kccb.ccb.ctrl; in pvr_kccb_is_idle()
429 mutex_lock(&pvr_dev->kccb.ccb.lock); in pvr_kccb_is_idle()
433 mutex_unlock(&pvr_dev->kccb.ccb.lock); in pvr_kccb_is_idle()
472 void pvr_kccb_wake_up_waiters(struct pvr_device *pvr_dev) in pvr_kccb_wake_up_waiters() argument
478 wake_up_all(&pvr_dev->kccb.rtn_q); in pvr_kccb_wake_up_waiters()
481 mutex_lock(&pvr_dev->kccb.ccb.lock); in pvr_kccb_wake_up_waiters()
482 used_count = pvr_kccb_used_slot_count_locked(pvr_dev); in pvr_kccb_wake_up_waiters()
484 if (WARN_ON(used_count + pvr_dev->kccb.reserved_count > pvr_kccb_capacity(pvr_dev))) in pvr_kccb_wake_up_waiters()
487 available_count = pvr_kccb_capacity(pvr_dev) - used_count - pvr_dev->kccb.reserved_count; in pvr_kccb_wake_up_waiters()
488 list_for_each_entry_safe(fence, tmp_fence, &pvr_dev->kccb.waiters, node) { in pvr_kccb_wake_up_waiters()
493 pvr_dev->kccb.reserved_count++; in pvr_kccb_wake_up_waiters()
500 mutex_unlock(&pvr_dev->kccb.ccb.lock); in pvr_kccb_wake_up_waiters()
507 void pvr_kccb_fini(struct pvr_device *pvr_dev) in pvr_kccb_fini() argument
509 pvr_ccb_fini(&pvr_dev->kccb.ccb); in pvr_kccb_fini()
510 WARN_ON(!list_empty(&pvr_dev->kccb.waiters)); in pvr_kccb_fini()
511 WARN_ON(pvr_dev->kccb.reserved_count); in pvr_kccb_fini()
523 pvr_kccb_init(struct pvr_device *pvr_dev) in pvr_kccb_init() argument
525 pvr_dev->kccb.slot_count = 1 << ROGUE_FWIF_KCCB_NUMCMDS_LOG2_DEFAULT; in pvr_kccb_init()
526 INIT_LIST_HEAD(&pvr_dev->kccb.waiters); in pvr_kccb_init()
527 pvr_dev->kccb.fence_ctx.id = dma_fence_context_alloc(1); in pvr_kccb_init()
528 spin_lock_init(&pvr_dev->kccb.fence_ctx.lock); in pvr_kccb_init()
530 return pvr_ccb_init(pvr_dev, &pvr_dev->kccb.ccb, in pvr_kccb_init()
589 pvr_kccb_reserve_slot(struct pvr_device *pvr_dev, struct dma_fence *f) in pvr_kccb_reserve_slot() argument
595 mutex_lock(&pvr_dev->kccb.ccb.lock); in pvr_kccb_reserve_slot()
597 used_count = pvr_kccb_used_slot_count_locked(pvr_dev); in pvr_kccb_reserve_slot()
598 if (pvr_dev->kccb.reserved_count >= pvr_kccb_capacity(pvr_dev) - used_count) { in pvr_kccb_reserve_slot()
600 &pvr_dev->kccb.fence_ctx.lock, in pvr_kccb_reserve_slot()
601 pvr_dev->kccb.fence_ctx.id, in pvr_kccb_reserve_slot()
602 atomic_inc_return(&pvr_dev->kccb.fence_ctx.seqno)); in pvr_kccb_reserve_slot()
604 list_add_tail(&fence->node, &pvr_dev->kccb.waiters); in pvr_kccb_reserve_slot()
607 pvr_dev->kccb.reserved_count++; in pvr_kccb_reserve_slot()
610 mutex_unlock(&pvr_dev->kccb.ccb.lock); in pvr_kccb_reserve_slot()
624 void pvr_kccb_release_slot(struct pvr_device *pvr_dev) in pvr_kccb_release_slot() argument
626 mutex_lock(&pvr_dev->kccb.ccb.lock); in pvr_kccb_release_slot()
627 if (!WARN_ON(!pvr_dev->kccb.reserved_count)) in pvr_kccb_release_slot()
628 pvr_dev->kccb.reserved_count--; in pvr_kccb_release_slot()
629 mutex_unlock(&pvr_dev->kccb.ccb.lock); in pvr_kccb_release_slot()
641 pvr_fwccb_init(struct pvr_device *pvr_dev) in pvr_fwccb_init() argument
643 return pvr_ccb_init(pvr_dev, &pvr_dev->fwccb, in pvr_fwccb_init()