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()
156 struct ivpu_fw_info *fw = vdev->fw; in ivpu_fw_parse() local
157 const struct vpu_firmware_header *fw_hdr = (const void *)fw->file->data; in ivpu_fw_parse()
160 if (fw->file->size <= FW_FILE_IMAGE_OFFSET) { in ivpu_fw_parse()
161 ivpu_err(vdev, "Firmware file is too small: %zu\n", fw->file->size); in ivpu_fw_parse()
180 if (runtime_size < fw->file->size || runtime_size > FW_RUNTIME_MAX_SIZE) { in ivpu_fw_parse()
185 if (FW_FILE_IMAGE_OFFSET + image_size > fw->file->size) { in ivpu_fw_parse()
210 if (!scnprintf(fw->version, sizeof(fw->version), "%s", fw->file->data + VPU_FW_HEADER_SIZE)) in ivpu_fw_parse()
213 ivpu_info(vdev, "Firmware: %s, version: %s\n", fw->name, fw->version); in ivpu_fw_parse()
220 fw->runtime_addr = runtime_addr; in ivpu_fw_parse()
221 fw->runtime_size = runtime_size; in ivpu_fw_parse()
222 fw->image_load_offset = image_load_addr - runtime_addr; in ivpu_fw_parse()
223 fw->image_size = image_size; in ivpu_fw_parse()
224 fw->shave_nn_size = PAGE_ALIGN(fw_hdr->shave_nn_fw_size); in ivpu_fw_parse()
226 fw->cold_boot_entry_point = fw_hdr->entry_point; in ivpu_fw_parse()
227 fw->entry_point = fw->cold_boot_entry_point; in ivpu_fw_parse()
229 fw->trace_level = min_t(u32, ivpu_fw_log_level, IVPU_FW_LOG_FATAL); in ivpu_fw_parse()
230 fw->trace_destination_mask = VPU_TRACE_DESTINATION_VERBOSE_TRACING; in ivpu_fw_parse()
231 fw->trace_hw_component_mask = -1; in ivpu_fw_parse()
233 fw->dvfs_mode = 0; in ivpu_fw_parse()
235 fw->sched_mode = ivpu_fw_sched_mode_select(vdev, fw_hdr); in ivpu_fw_parse()
236 ivpu_info(vdev, "Scheduler mode: %s\n", fw->sched_mode ? "HW" : "OS"); in ivpu_fw_parse()
239 fw->primary_preempt_buf_size = fw_hdr->preemption_buffer_1_max_size; in ivpu_fw_parse()
241 fw->primary_preempt_buf_size = fw_hdr->preemption_buffer_1_size; in ivpu_fw_parse()
244 fw->secondary_preempt_buf_size = fw_hdr->preemption_buffer_2_max_size; in ivpu_fw_parse()
246 fw->secondary_preempt_buf_size = fw_hdr->preemption_buffer_2_size; in ivpu_fw_parse()
248 fw->primary_preempt_buf_size, fw->secondary_preempt_buf_size); in ivpu_fw_parse()
259 fw->read_only_addr = fw_hdr->ro_section_start_address; in ivpu_fw_parse()
260 fw->read_only_size = fw_hdr->ro_section_size; in ivpu_fw_parse()
263 fw->file->size, fw->image_size, fw->runtime_size, fw->shave_nn_size); in ivpu_fw_parse()
265 fw->runtime_addr, image_load_addr, fw->entry_point); in ivpu_fw_parse()
267 fw->read_only_addr, fw->read_only_size); in ivpu_fw_parse()
274 release_firmware(vdev->fw->file); in ivpu_fw_release()
277 /* Initialize workarounds that depend on FW version */
281 const struct vpu_firmware_header *fw_hdr = (const void *)vdev->fw->file->data; in ivpu_fw_init_wa()
296 struct ivpu_fw_info *fw = vdev->fw; in ivpu_fw_update_global_range() local
297 u64 start = ALIGN(fw->runtime_addr + fw->runtime_size, FW_SHARED_MEM_ALIGNMENT); in ivpu_fw_update_global_range()
311 struct ivpu_fw_info *fw = vdev->fw; in ivpu_fw_mem_init() local
320 fw_range.start = fw->runtime_addr; in ivpu_fw_mem_init()
321 fw_range.end = fw->runtime_addr + fw->runtime_size; in ivpu_fw_mem_init()
322 fw->mem = ivpu_bo_create(vdev, &vdev->gctx, &fw_range, fw->runtime_size, in ivpu_fw_mem_init()
324 if (!fw->mem) { in ivpu_fw_mem_init()
329 ret = ivpu_mmu_context_set_pages_ro(vdev, &vdev->gctx, fw->read_only_addr, in ivpu_fw_mem_init()
330 fw->read_only_size); in ivpu_fw_mem_init()
336 fw->mem_log_crit = ivpu_bo_create_global(vdev, IVPU_FW_CRITICAL_BUFFER_SIZE, in ivpu_fw_mem_init()
338 if (!fw->mem_log_crit) { in ivpu_fw_mem_init()
349 fw->mem_log_verb = ivpu_bo_create_global(vdev, log_verb_size, in ivpu_fw_mem_init()
351 if (!fw->mem_log_verb) { in ivpu_fw_mem_init()
357 if (fw->shave_nn_size) { in ivpu_fw_mem_init()
358 fw->mem_shave_nn = ivpu_bo_create(vdev, &vdev->gctx, &vdev->hw->ranges.shave, in ivpu_fw_mem_init()
359 fw->shave_nn_size, DRM_IVPU_BO_WC); in ivpu_fw_mem_init()
360 if (!fw->mem_shave_nn) { in ivpu_fw_mem_init()
370 ivpu_bo_free(fw->mem_log_verb); in ivpu_fw_mem_init()
372 ivpu_bo_free(fw->mem_log_crit); in ivpu_fw_mem_init()
374 ivpu_bo_free(fw->mem); in ivpu_fw_mem_init()
380 struct ivpu_fw_info *fw = vdev->fw; in ivpu_fw_mem_fini() local
382 if (fw->mem_shave_nn) { in ivpu_fw_mem_fini()
383 ivpu_bo_free(fw->mem_shave_nn); in ivpu_fw_mem_fini()
384 fw->mem_shave_nn = NULL; in ivpu_fw_mem_fini()
387 ivpu_bo_free(fw->mem_log_verb); in ivpu_fw_mem_fini()
388 ivpu_bo_free(fw->mem_log_crit); in ivpu_fw_mem_fini()
389 ivpu_bo_free(fw->mem); in ivpu_fw_mem_fini()
391 fw->mem_log_verb = NULL; in ivpu_fw_mem_fini()
392 fw->mem_log_crit = NULL; in ivpu_fw_mem_fini()
393 fw->mem = NULL; in ivpu_fw_mem_fini()
431 struct ivpu_fw_info *fw = vdev->fw; in ivpu_fw_load() local
432 u64 image_end_offset = fw->image_load_offset + fw->image_size; in ivpu_fw_load()
434 memset(ivpu_bo_vaddr(fw->mem), 0, fw->image_load_offset); in ivpu_fw_load()
435 memcpy(ivpu_bo_vaddr(fw->mem) + fw->image_load_offset, in ivpu_fw_load()
436 fw->file->data + FW_FILE_IMAGE_OFFSET, fw->image_size); in ivpu_fw_load()
439 u8 *start = ivpu_bo_vaddr(fw->mem) + image_end_offset; in ivpu_fw_load()
440 u64 size = ivpu_bo_size(fw->mem) - image_end_offset; in ivpu_fw_load()
445 wmb(); /* Flush WC buffers after writing fw->mem */ in ivpu_fw_load()
614 if (vdev->fw->mem_shave_nn) in ivpu_fw_boot_params_setup()
615 boot_params->shave_nn_fw_base = vdev->fw->mem_shave_nn->vpu_addr; in ivpu_fw_boot_params_setup()
628 boot_params->default_trace_level = vdev->fw->trace_level; in ivpu_fw_boot_params_setup()
630 boot_params->trace_destination_mask = vdev->fw->trace_destination_mask; in ivpu_fw_boot_params_setup()
631 boot_params->trace_hw_component_mask = vdev->fw->trace_hw_component_mask; in ivpu_fw_boot_params_setup()
632 boot_params->crit_tracing_buff_addr = vdev->fw->mem_log_crit->vpu_addr; in ivpu_fw_boot_params_setup()
633 boot_params->crit_tracing_buff_size = ivpu_bo_size(vdev->fw->mem_log_crit); in ivpu_fw_boot_params_setup()
634 boot_params->verbose_tracing_buff_addr = vdev->fw->mem_log_verb->vpu_addr; in ivpu_fw_boot_params_setup()
635 boot_params->verbose_tracing_buff_size = ivpu_bo_size(vdev->fw->mem_log_verb); in ivpu_fw_boot_params_setup()
640 boot_params->vpu_scheduling_mode = vdev->fw->sched_mode; in ivpu_fw_boot_params_setup()
641 if (vdev->fw->sched_mode == VPU_SCHEDULING_MODE_HW) in ivpu_fw_boot_params_setup()
643 boot_params->dvfs_mode = vdev->fw->dvfs_mode; in ivpu_fw_boot_params_setup()