Lines Matching refs:pvr_dev
53 pvr_device_reg_init(struct pvr_device *pvr_dev) in pvr_device_reg_init() argument
55 struct drm_device *drm_dev = from_pvr_device(pvr_dev); in pvr_device_reg_init()
60 pvr_dev->regs_resource = NULL; in pvr_device_reg_init()
61 pvr_dev->regs = NULL; in pvr_device_reg_init()
68 pvr_dev->regs = regs; in pvr_device_reg_init()
69 pvr_dev->regs_resource = regs_resource; in pvr_device_reg_init()
95 static int pvr_device_clk_init(struct pvr_device *pvr_dev) in pvr_device_clk_init() argument
97 struct drm_device *drm_dev = from_pvr_device(pvr_dev); in pvr_device_clk_init()
117 pvr_dev->core_clk = core_clk; in pvr_device_clk_init()
118 pvr_dev->sys_clk = sys_clk; in pvr_device_clk_init()
119 pvr_dev->mem_clk = mem_clk; in pvr_device_clk_init()
124 static int pvr_device_reset_init(struct pvr_device *pvr_dev) in pvr_device_reset_init() argument
126 struct drm_device *drm_dev = from_pvr_device(pvr_dev); in pvr_device_reset_init()
134 pvr_dev->reset = reset; in pvr_device_reset_init()
146 static void pvr_device_process_active_queues(struct pvr_device *pvr_dev) in pvr_device_process_active_queues() argument
151 mutex_lock(&pvr_dev->queues.lock); in pvr_device_process_active_queues()
157 list_splice_init(&pvr_dev->queues.active, &active_queues); in pvr_device_process_active_queues()
162 mutex_unlock(&pvr_dev->queues.lock); in pvr_device_process_active_queues()
165 static bool pvr_device_safety_irq_pending(struct pvr_device *pvr_dev) in pvr_device_safety_irq_pending() argument
169 WARN_ON_ONCE(!pvr_dev->has_safety_events); in pvr_device_safety_irq_pending()
171 events = pvr_cr_read32(pvr_dev, ROGUE_CR_EVENT_STATUS); in pvr_device_safety_irq_pending()
176 static void pvr_device_safety_irq_clear(struct pvr_device *pvr_dev) in pvr_device_safety_irq_clear() argument
178 WARN_ON_ONCE(!pvr_dev->has_safety_events); in pvr_device_safety_irq_clear()
180 pvr_cr_write32(pvr_dev, ROGUE_CR_EVENT_CLEAR, in pvr_device_safety_irq_clear()
184 static void pvr_device_handle_safety_events(struct pvr_device *pvr_dev) in pvr_device_handle_safety_events() argument
186 struct drm_device *drm_dev = from_pvr_device(pvr_dev); in pvr_device_handle_safety_events()
189 WARN_ON_ONCE(!pvr_dev->has_safety_events); in pvr_device_handle_safety_events()
191 events = pvr_cr_read32(pvr_dev, ROGUE_CR_SAFETY_EVENT_STATUS__ROGUEXE); in pvr_device_handle_safety_events()
197 pvr_cr_write32(pvr_dev, ROGUE_CR_SAFETY_EVENT_CLEAR__ROGUEXE, events); in pvr_device_handle_safety_events()
200 u32 fault_fw = pvr_cr_read32(pvr_dev, ROGUE_CR_FAULT_FW_STATUS); in pvr_device_handle_safety_events()
202 pvr_cr_write32(pvr_dev, ROGUE_CR_FAULT_FW_CLEAR, fault_fw); in pvr_device_handle_safety_events()
218 struct pvr_device *pvr_dev = data; in pvr_device_irq_thread_handler() local
219 struct drm_device *drm_dev = from_pvr_device(pvr_dev); in pvr_device_irq_thread_handler()
226 while (pvr_fw_irq_pending(pvr_dev)) { in pvr_device_irq_thread_handler()
227 pvr_fw_irq_clear(pvr_dev); in pvr_device_irq_thread_handler()
229 if (pvr_dev->fw_dev.booted) { in pvr_device_irq_thread_handler()
230 pvr_fwccb_process(pvr_dev); in pvr_device_irq_thread_handler()
231 pvr_kccb_wake_up_waiters(pvr_dev); in pvr_device_irq_thread_handler()
232 pvr_device_process_active_queues(pvr_dev); in pvr_device_irq_thread_handler()
240 if (pvr_dev->has_safety_events) { in pvr_device_irq_thread_handler()
248 err = pvr_power_get(pvr_dev); in pvr_device_irq_thread_handler()
256 while (pvr_device_safety_irq_pending(pvr_dev)) { in pvr_device_irq_thread_handler()
257 pvr_device_safety_irq_clear(pvr_dev); in pvr_device_irq_thread_handler()
258 pvr_device_handle_safety_events(pvr_dev); in pvr_device_irq_thread_handler()
263 pvr_power_put(pvr_dev); in pvr_device_irq_thread_handler()
271 struct pvr_device *pvr_dev = data; in pvr_device_irq_handler() local
274 if (pvr_dev->has_safety_events) in pvr_device_irq_handler()
275 safety_irq_pending = pvr_device_safety_irq_pending(pvr_dev); in pvr_device_irq_handler()
277 if (!pvr_fw_irq_pending(pvr_dev) && !safety_irq_pending) in pvr_device_irq_handler()
283 static void pvr_device_safety_irq_init(struct pvr_device *pvr_dev) in pvr_device_safety_irq_init() argument
294 if (!PVR_HAS_FEATURE(pvr_dev, roguexe)) { in pvr_device_safety_irq_init()
295 pvr_dev->has_safety_events = false; in pvr_device_safety_irq_init()
299 PVR_FEATURE_VALUE(pvr_dev, ecc_rams, &num_ecc_rams); in pvr_device_safety_irq_init()
301 pvr_dev->has_safety_events = in pvr_device_safety_irq_init()
302 num_ecc_rams > 0 || PVR_HAS_FEATURE(pvr_dev, watchdog_timer); in pvr_device_safety_irq_init()
315 pvr_device_irq_init(struct pvr_device *pvr_dev) in pvr_device_irq_init() argument
317 struct drm_device *drm_dev = from_pvr_device(pvr_dev); in pvr_device_irq_init()
320 init_waitqueue_head(&pvr_dev->kccb.rtn_q); in pvr_device_irq_init()
322 pvr_device_safety_irq_init(pvr_dev); in pvr_device_irq_init()
324 pvr_dev->irq = platform_get_irq(plat_dev, 0); in pvr_device_irq_init()
325 if (pvr_dev->irq < 0) in pvr_device_irq_init()
326 return pvr_dev->irq; in pvr_device_irq_init()
329 pvr_fw_irq_clear(pvr_dev); in pvr_device_irq_init()
331 if (pvr_dev->has_safety_events) in pvr_device_irq_init()
332 pvr_device_safety_irq_clear(pvr_dev); in pvr_device_irq_init()
338 return request_threaded_irq(pvr_dev->irq, pvr_device_irq_handler, in pvr_device_irq_init()
340 IRQF_SHARED | IRQF_ONESHOT, "gpu", pvr_dev); in pvr_device_irq_init()
348 pvr_device_irq_fini(struct pvr_device *pvr_dev) in pvr_device_irq_fini() argument
350 free_irq(pvr_dev->irq, pvr_dev); in pvr_device_irq_fini()
373 pvr_build_firmware_filename(struct pvr_device *pvr_dev, const char *base, in pvr_build_firmware_filename() argument
376 struct pvr_gpu_id *gpu_id = &pvr_dev->gpu_id; in pvr_build_firmware_filename()
385 struct pvr_device *pvr_dev = data; in pvr_release_firmware() local
387 release_firmware(pvr_dev->fw_dev.firmware); in pvr_release_firmware()
402 pvr_request_firmware(struct pvr_device *pvr_dev) in pvr_request_firmware() argument
404 struct drm_device *drm_dev = &pvr_dev->base; in pvr_request_firmware()
409 filename = pvr_build_firmware_filename(pvr_dev, "powervr/rogue", in pvr_request_firmware()
418 err = request_firmware(&fw, filename, pvr_dev->base.dev); in pvr_request_firmware()
428 pvr_dev->fw_dev.firmware = fw; in pvr_request_firmware()
430 return devm_add_action_or_reset(drm_dev->dev, pvr_release_firmware, pvr_dev); in pvr_request_firmware()
446 pvr_load_gpu_id(struct pvr_device *pvr_dev) in pvr_load_gpu_id() argument
448 struct pvr_gpu_id *gpu_id = &pvr_dev->gpu_id; in pvr_load_gpu_id()
455 bvnc = pvr_cr_read64(pvr_dev, ROGUE_CR_CORE_ID__PBVNC); in pvr_load_gpu_id()
463 u32 core_rev = pvr_cr_read32(pvr_dev, ROGUE_CR_CORE_REVISION); in pvr_load_gpu_id()
464 u32 core_id = pvr_cr_read32(pvr_dev, ROGUE_CR_CORE_ID); in pvr_load_gpu_id()
487 pvr_set_dma_info(struct pvr_device *pvr_dev) in pvr_set_dma_info() argument
489 struct drm_device *drm_dev = from_pvr_device(pvr_dev); in pvr_set_dma_info()
493 err = PVR_FEATURE_VALUE(pvr_dev, phys_bus_width, &phys_bus_width); in pvr_set_dma_info()
530 pvr_device_gpu_init(struct pvr_device *pvr_dev) in pvr_device_gpu_init() argument
534 pvr_load_gpu_id(pvr_dev); in pvr_device_gpu_init()
536 err = pvr_request_firmware(pvr_dev); in pvr_device_gpu_init()
540 err = pvr_fw_validate_init_device_info(pvr_dev); in pvr_device_gpu_init()
544 if (PVR_HAS_FEATURE(pvr_dev, meta)) in pvr_device_gpu_init()
545 pvr_dev->fw_dev.processor_type = PVR_FW_PROCESSOR_TYPE_META; in pvr_device_gpu_init()
546 else if (PVR_HAS_FEATURE(pvr_dev, mips)) in pvr_device_gpu_init()
547 pvr_dev->fw_dev.processor_type = PVR_FW_PROCESSOR_TYPE_MIPS; in pvr_device_gpu_init()
548 else if (PVR_HAS_FEATURE(pvr_dev, riscv_fw_processor)) in pvr_device_gpu_init()
549 pvr_dev->fw_dev.processor_type = PVR_FW_PROCESSOR_TYPE_RISCV; in pvr_device_gpu_init()
553 pvr_stream_create_musthave_masks(pvr_dev); in pvr_device_gpu_init()
555 err = pvr_set_dma_info(pvr_dev); in pvr_device_gpu_init()
559 if (pvr_dev->fw_dev.processor_type != PVR_FW_PROCESSOR_TYPE_MIPS) { in pvr_device_gpu_init()
560 pvr_dev->kernel_vm_ctx = pvr_vm_create_context(pvr_dev, false); in pvr_device_gpu_init()
561 if (IS_ERR(pvr_dev->kernel_vm_ctx)) in pvr_device_gpu_init()
562 return PTR_ERR(pvr_dev->kernel_vm_ctx); in pvr_device_gpu_init()
565 err = pvr_fw_init(pvr_dev); in pvr_device_gpu_init()
572 if (pvr_dev->fw_dev.processor_type != PVR_FW_PROCESSOR_TYPE_MIPS) { in pvr_device_gpu_init()
573 pvr_vm_context_put(pvr_dev->kernel_vm_ctx); in pvr_device_gpu_init()
574 pvr_dev->kernel_vm_ctx = NULL; in pvr_device_gpu_init()
585 pvr_device_gpu_fini(struct pvr_device *pvr_dev) in pvr_device_gpu_fini() argument
587 pvr_fw_fini(pvr_dev); in pvr_device_gpu_fini()
589 if (pvr_dev->fw_dev.processor_type != PVR_FW_PROCESSOR_TYPE_MIPS) { in pvr_device_gpu_fini()
590 WARN_ON(!pvr_vm_context_put(pvr_dev->kernel_vm_ctx)); in pvr_device_gpu_fini()
591 pvr_dev->kernel_vm_ctx = NULL; in pvr_device_gpu_fini()
615 pvr_device_init(struct pvr_device *pvr_dev) in pvr_device_init() argument
617 struct drm_device *drm_dev = from_pvr_device(pvr_dev); in pvr_device_init()
625 err = pvr_device_params_init(&pvr_dev->params); in pvr_device_init()
630 err = pvr_device_clk_init(pvr_dev); in pvr_device_init()
635 err = pvr_device_reset_init(pvr_dev); in pvr_device_init()
645 err = pvr_device_reg_init(pvr_dev); in pvr_device_init()
650 err = pvr_device_gpu_init(pvr_dev); in pvr_device_init()
654 err = pvr_device_irq_init(pvr_dev); in pvr_device_init()
663 pvr_device_gpu_fini(pvr_dev); in pvr_device_init()
676 pvr_device_fini(struct pvr_device *pvr_dev) in pvr_device_fini() argument
682 pvr_device_irq_fini(pvr_dev); in pvr_device_fini()
683 pvr_device_gpu_fini(pvr_dev); in pvr_device_fini()
687 pvr_device_has_uapi_quirk(struct pvr_device *pvr_dev, u32 quirk) in pvr_device_has_uapi_quirk() argument
691 return PVR_HAS_QUIRK(pvr_dev, 47217); in pvr_device_has_uapi_quirk()
693 return PVR_HAS_QUIRK(pvr_dev, 48545); in pvr_device_has_uapi_quirk()
695 return PVR_HAS_QUIRK(pvr_dev, 49927); in pvr_device_has_uapi_quirk()
697 return PVR_HAS_QUIRK(pvr_dev, 51764); in pvr_device_has_uapi_quirk()
699 return PVR_HAS_QUIRK(pvr_dev, 62269); in pvr_device_has_uapi_quirk()
706 pvr_device_has_uapi_enhancement(struct pvr_device *pvr_dev, u32 enhancement) in pvr_device_has_uapi_enhancement() argument
710 return PVR_HAS_ENHANCEMENT(pvr_dev, 35421); in pvr_device_has_uapi_enhancement()
712 return PVR_HAS_ENHANCEMENT(pvr_dev, 42064); in pvr_device_has_uapi_enhancement()
728 pvr_device_has_feature(struct pvr_device *pvr_dev, u32 feature) in pvr_device_has_feature() argument
732 return PVR_HAS_FEATURE(pvr_dev, cluster_grouping); in pvr_device_has_feature()
735 return PVR_HAS_FEATURE(pvr_dev, compute_morton_capable); in pvr_device_has_feature()
738 return PVR_HAS_FEATURE(pvr_dev, fb_cdc_v4); in pvr_device_has_feature()
741 return PVR_HAS_FEATURE(pvr_dev, gpu_multicore_support); in pvr_device_has_feature()
744 return PVR_HAS_FEATURE(pvr_dev, isp_zls_d24_s8_packing_ogl_mode); in pvr_device_has_feature()
747 return PVR_HAS_FEATURE(pvr_dev, s7_top_infrastructure); in pvr_device_has_feature()
750 return PVR_HAS_FEATURE(pvr_dev, tessellation); in pvr_device_has_feature()
753 return PVR_HAS_FEATURE(pvr_dev, tpu_dm_global_registers); in pvr_device_has_feature()
756 return PVR_HAS_FEATURE(pvr_dev, vdm_drawindirect); in pvr_device_has_feature()
759 return PVR_HAS_FEATURE(pvr_dev, vdm_object_level_lls); in pvr_device_has_feature()
762 return PVR_HAS_FEATURE(pvr_dev, zls_subtile); in pvr_device_has_feature()
768 PVR_FEATURE_VALUE(pvr_dev, cdm_control_stream_format, &cdm_control_stream_format); in pvr_device_has_feature()
773 if (PVR_HAS_FEATURE(pvr_dev, fbcdc_algorithm)) { in pvr_device_has_feature()
776 PVR_FEATURE_VALUE(pvr_dev, fbcdc_algorithm, &fbcdc_algorithm); in pvr_device_has_feature()
777 return (fbcdc_algorithm < 3 || PVR_HAS_FEATURE(pvr_dev, fb_cdc_v4)); in pvr_device_has_feature()