Lines Matching full:fw
35 /* Check if FW API is compatible with the driver */
77 ret = request_firmware(&vdev->fw->file, ivpu_firmware, vdev->drm.dev); in ivpu_fw_request()
79 vdev->fw->name = ivpu_firmware; in ivpu_fw_request()
87 ret = firmware_request_nowarn(&vdev->fw->file, fw_names[i].name, vdev->drm.dev); in ivpu_fw_request()
89 vdev->fw->name = fw_names[i].name; in ivpu_fw_request()
107 ivpu_err(vdev, "Incompatible FW %s API version: %d.%d, required %d.0 or later\n", in ivpu_fw_check_api()
112 ivpu_warn(vdev, "Major FW %s API version different: %d.%d (expected %d.%d)\n", in ivpu_fw_check_api()
115 ivpu_dbg(vdev, FW_BOOT, "FW %s API version: %d.%d (expected %d.%d)\n", in ivpu_fw_check_api()
153 struct ivpu_fw_info *fw = vdev->fw; in ivpu_fw_parse() local
154 const struct vpu_firmware_header *fw_hdr = (const void *)fw->file->data; in ivpu_fw_parse()
157 if (fw->file->size <= FW_FILE_IMAGE_OFFSET) { in ivpu_fw_parse()
158 ivpu_err(vdev, "Firmware file is too small: %zu\n", fw->file->size); in ivpu_fw_parse()
177 if (runtime_size < fw->file->size || runtime_size > FW_RUNTIME_MAX_SIZE) { in ivpu_fw_parse()
182 if (FW_FILE_IMAGE_OFFSET + image_size > fw->file->size) { in ivpu_fw_parse()
207 if (!scnprintf(fw->version, sizeof(fw->version), "%s", fw->file->data + VPU_FW_HEADER_SIZE)) in ivpu_fw_parse()
210 ivpu_info(vdev, "Firmware: %s, version: %s\n", fw->name, fw->version); in ivpu_fw_parse()
217 fw->runtime_addr = runtime_addr; in ivpu_fw_parse()
218 fw->runtime_size = runtime_size; in ivpu_fw_parse()
219 fw->image_load_offset = image_load_addr - runtime_addr; in ivpu_fw_parse()
220 fw->image_size = image_size; in ivpu_fw_parse()
221 fw->shave_nn_size = PAGE_ALIGN(fw_hdr->shave_nn_fw_size); in ivpu_fw_parse()
223 fw->cold_boot_entry_point = fw_hdr->entry_point; in ivpu_fw_parse()
224 fw->entry_point = fw->cold_boot_entry_point; in ivpu_fw_parse()
226 fw->trace_level = min_t(u32, ivpu_fw_log_level, IVPU_FW_LOG_FATAL); in ivpu_fw_parse()
227 fw->trace_destination_mask = VPU_TRACE_DESTINATION_VERBOSE_TRACING; in ivpu_fw_parse()
228 fw->trace_hw_component_mask = -1; in ivpu_fw_parse()
230 fw->dvfs_mode = 0; in ivpu_fw_parse()
232 fw->sched_mode = ivpu_fw_sched_mode_select(vdev, fw_hdr); in ivpu_fw_parse()
233 fw->primary_preempt_buf_size = fw_hdr->preemption_buffer_1_size; in ivpu_fw_parse()
234 fw->secondary_preempt_buf_size = fw_hdr->preemption_buffer_2_size; in ivpu_fw_parse()
235 ivpu_info(vdev, "Scheduler mode: %s\n", fw->sched_mode ? "HW" : "OS"); in ivpu_fw_parse()
246 fw->read_only_addr = fw_hdr->ro_section_start_address; in ivpu_fw_parse()
247 fw->read_only_size = fw_hdr->ro_section_size; in ivpu_fw_parse()
250 fw->file->size, fw->image_size, fw->runtime_size, fw->shave_nn_size); in ivpu_fw_parse()
252 fw->runtime_addr, image_load_addr, fw->entry_point); in ivpu_fw_parse()
254 fw->read_only_addr, fw->read_only_size); in ivpu_fw_parse()
261 release_firmware(vdev->fw->file); in ivpu_fw_release()
264 /* Initialize workarounds that depend on FW version */
268 const struct vpu_firmware_header *fw_hdr = (const void *)vdev->fw->file->data; in ivpu_fw_init_wa()
283 struct ivpu_fw_info *fw = vdev->fw; in ivpu_fw_update_global_range() local
284 u64 start = ALIGN(fw->runtime_addr + fw->runtime_size, FW_SHARED_MEM_ALIGNMENT); in ivpu_fw_update_global_range()
298 struct ivpu_fw_info *fw = vdev->fw; in ivpu_fw_mem_init() local
307 fw_range.start = fw->runtime_addr; in ivpu_fw_mem_init()
308 fw_range.end = fw->runtime_addr + fw->runtime_size; in ivpu_fw_mem_init()
309 fw->mem = ivpu_bo_create(vdev, &vdev->gctx, &fw_range, fw->runtime_size, in ivpu_fw_mem_init()
311 if (!fw->mem) { in ivpu_fw_mem_init()
316 ret = ivpu_mmu_context_set_pages_ro(vdev, &vdev->gctx, fw->read_only_addr, in ivpu_fw_mem_init()
317 fw->read_only_size); in ivpu_fw_mem_init()
323 fw->mem_log_crit = ivpu_bo_create_global(vdev, IVPU_FW_CRITICAL_BUFFER_SIZE, in ivpu_fw_mem_init()
325 if (!fw->mem_log_crit) { in ivpu_fw_mem_init()
336 fw->mem_log_verb = ivpu_bo_create_global(vdev, log_verb_size, in ivpu_fw_mem_init()
338 if (!fw->mem_log_verb) { in ivpu_fw_mem_init()
344 if (fw->shave_nn_size) { in ivpu_fw_mem_init()
345 fw->mem_shave_nn = ivpu_bo_create(vdev, &vdev->gctx, &vdev->hw->ranges.shave, in ivpu_fw_mem_init()
346 fw->shave_nn_size, DRM_IVPU_BO_WC); in ivpu_fw_mem_init()
347 if (!fw->mem_shave_nn) { in ivpu_fw_mem_init()
357 ivpu_bo_free(fw->mem_log_verb); in ivpu_fw_mem_init()
359 ivpu_bo_free(fw->mem_log_crit); in ivpu_fw_mem_init()
361 ivpu_bo_free(fw->mem); in ivpu_fw_mem_init()
367 struct ivpu_fw_info *fw = vdev->fw; in ivpu_fw_mem_fini() local
369 if (fw->mem_shave_nn) { in ivpu_fw_mem_fini()
370 ivpu_bo_free(fw->mem_shave_nn); in ivpu_fw_mem_fini()
371 fw->mem_shave_nn = NULL; in ivpu_fw_mem_fini()
374 ivpu_bo_free(fw->mem_log_verb); in ivpu_fw_mem_fini()
375 ivpu_bo_free(fw->mem_log_crit); in ivpu_fw_mem_fini()
376 ivpu_bo_free(fw->mem); in ivpu_fw_mem_fini()
378 fw->mem_log_verb = NULL; in ivpu_fw_mem_fini()
379 fw->mem_log_crit = NULL; in ivpu_fw_mem_fini()
380 fw->mem = NULL; in ivpu_fw_mem_fini()
418 struct ivpu_fw_info *fw = vdev->fw; in ivpu_fw_load() local
419 u64 image_end_offset = fw->image_load_offset + fw->image_size; in ivpu_fw_load()
421 memset(ivpu_bo_vaddr(fw->mem), 0, fw->image_load_offset); in ivpu_fw_load()
422 memcpy(ivpu_bo_vaddr(fw->mem) + fw->image_load_offset, in ivpu_fw_load()
423 fw->file->data + FW_FILE_IMAGE_OFFSET, fw->image_size); in ivpu_fw_load()
426 u8 *start = ivpu_bo_vaddr(fw->mem) + image_end_offset; in ivpu_fw_load()
427 u64 size = ivpu_bo_size(fw->mem) - image_end_offset; in ivpu_fw_load()
432 wmb(); /* Flush WC buffers after writing fw->mem */ in ivpu_fw_load()
599 if (vdev->fw->mem_shave_nn) in ivpu_fw_boot_params_setup()
600 boot_params->shave_nn_fw_base = vdev->fw->mem_shave_nn->vpu_addr; in ivpu_fw_boot_params_setup()
613 boot_params->default_trace_level = vdev->fw->trace_level; in ivpu_fw_boot_params_setup()
615 boot_params->trace_destination_mask = vdev->fw->trace_destination_mask; in ivpu_fw_boot_params_setup()
616 boot_params->trace_hw_component_mask = vdev->fw->trace_hw_component_mask; in ivpu_fw_boot_params_setup()
617 boot_params->crit_tracing_buff_addr = vdev->fw->mem_log_crit->vpu_addr; in ivpu_fw_boot_params_setup()
618 boot_params->crit_tracing_buff_size = ivpu_bo_size(vdev->fw->mem_log_crit); in ivpu_fw_boot_params_setup()
619 boot_params->verbose_tracing_buff_addr = vdev->fw->mem_log_verb->vpu_addr; in ivpu_fw_boot_params_setup()
620 boot_params->verbose_tracing_buff_size = ivpu_bo_size(vdev->fw->mem_log_verb); in ivpu_fw_boot_params_setup()
625 boot_params->vpu_scheduling_mode = vdev->fw->sched_mode; in ivpu_fw_boot_params_setup()
626 if (vdev->fw->sched_mode == VPU_SCHEDULING_MODE_HW) in ivpu_fw_boot_params_setup()
628 boot_params->dvfs_mode = vdev->fw->dvfs_mode; in ivpu_fw_boot_params_setup()