Lines Matching +full:fw +full:- +full:cfg
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2020-2023 Intel Corporation
27 #define FW_RUNTIME_MAX_ADDR (FW_GLOBAL_MEM_END - FW_SHARED_MEM_SIZE)
46 /* TODO: Remove mtl_vpu.bin from names after transition to generation based FW names */
64 int ret = -ENOENT; in ivpu_fw_request()
68 ret = request_firmware(&vdev->fw->file, ivpu_firmware, vdev->drm.dev); in ivpu_fw_request()
70 vdev->fw->name = ivpu_firmware; in ivpu_fw_request()
78 ret = firmware_request_nowarn(&vdev->fw->file, fw_names[i].name, vdev->drm.dev); in ivpu_fw_request()
80 vdev->fw->name = fw_names[i].name; in ivpu_fw_request()
94 u16 major = (u16)(fw_hdr->api_version[index] >> 16); in ivpu_fw_check_api()
95 u16 minor = (u16)(fw_hdr->api_version[index]); in ivpu_fw_check_api()
98 ivpu_err(vdev, "Incompatible FW %s API version: %d.%d, required %d.0 or later\n", in ivpu_fw_check_api()
100 return -EINVAL; in ivpu_fw_check_api()
103 ivpu_warn(vdev, "Major FW %s API version different: %d.%d (expected %d.%d)\n", in ivpu_fw_check_api()
106 ivpu_dbg(vdev, FW_BOOT, "FW %s API version: %d.%d (expected %d.%d)\n", in ivpu_fw_check_api()
114 struct ivpu_fw_info *fw = vdev->fw; in ivpu_fw_parse() local
115 const struct vpu_firmware_header *fw_hdr = (const void *)fw->file->data; in ivpu_fw_parse()
118 if (fw->file->size <= FW_FILE_IMAGE_OFFSET) { in ivpu_fw_parse()
119 ivpu_err(vdev, "Firmware file is too small: %zu\n", fw->file->size); in ivpu_fw_parse()
120 return -EINVAL; in ivpu_fw_parse()
123 if (fw_hdr->header_version != VPU_FW_HEADER_VERSION) { in ivpu_fw_parse()
124 ivpu_err(vdev, "Invalid firmware header version: %u\n", fw_hdr->header_version); in ivpu_fw_parse()
125 return -EINVAL; in ivpu_fw_parse()
128 runtime_addr = fw_hdr->boot_params_load_address; in ivpu_fw_parse()
129 runtime_size = fw_hdr->runtime_size; in ivpu_fw_parse()
130 image_load_addr = fw_hdr->image_load_address; in ivpu_fw_parse()
131 image_size = fw_hdr->image_size; in ivpu_fw_parse()
135 return -EINVAL; in ivpu_fw_parse()
138 if (runtime_size < fw->file->size || runtime_size > FW_RUNTIME_MAX_SIZE) { in ivpu_fw_parse()
140 return -EINVAL; in ivpu_fw_parse()
143 if (FW_FILE_IMAGE_OFFSET + image_size > fw->file->size) { in ivpu_fw_parse()
145 return -EINVAL; in ivpu_fw_parse()
152 return -EINVAL; in ivpu_fw_parse()
155 if (fw_hdr->shave_nn_fw_size > FW_SHAVE_NN_MAX_SIZE) { in ivpu_fw_parse()
156 ivpu_err(vdev, "SHAVE NN firmware is too big: %u\n", fw_hdr->shave_nn_fw_size); in ivpu_fw_parse()
157 return -EINVAL; in ivpu_fw_parse()
160 if (fw_hdr->entry_point < image_load_addr || in ivpu_fw_parse()
161 fw_hdr->entry_point >= image_load_addr + image_size) { in ivpu_fw_parse()
162 ivpu_err(vdev, "Invalid entry point: 0x%llx\n", fw_hdr->entry_point); in ivpu_fw_parse()
163 return -EINVAL; in ivpu_fw_parse()
166 fw_hdr->header_version, fw_hdr->image_format); in ivpu_fw_parse()
168 ivpu_info(vdev, "Firmware: %s, version: %s", fw->name, in ivpu_fw_parse()
172 return -EINVAL; in ivpu_fw_parse()
174 return -EINVAL; in ivpu_fw_parse()
176 fw->runtime_addr = runtime_addr; in ivpu_fw_parse()
177 fw->runtime_size = runtime_size; in ivpu_fw_parse()
178 fw->image_load_offset = image_load_addr - runtime_addr; in ivpu_fw_parse()
179 fw->image_size = image_size; in ivpu_fw_parse()
180 fw->shave_nn_size = PAGE_ALIGN(fw_hdr->shave_nn_fw_size); in ivpu_fw_parse()
182 fw->cold_boot_entry_point = fw_hdr->entry_point; in ivpu_fw_parse()
183 fw->entry_point = fw->cold_boot_entry_point; in ivpu_fw_parse()
185 fw->trace_level = min_t(u32, ivpu_log_level, IVPU_FW_LOG_FATAL); in ivpu_fw_parse()
186 fw->trace_destination_mask = VPU_TRACE_DESTINATION_VERBOSE_TRACING; in ivpu_fw_parse()
187 fw->trace_hw_component_mask = -1; in ivpu_fw_parse()
190 fw->file->size, fw->image_size, fw->runtime_size, fw->shave_nn_size); in ivpu_fw_parse()
192 fw->runtime_addr, image_load_addr, fw->entry_point); in ivpu_fw_parse()
199 release_firmware(vdev->fw->file); in ivpu_fw_release()
204 struct ivpu_fw_info *fw = vdev->fw; in ivpu_fw_update_global_range() local
205 u64 start = ALIGN(fw->runtime_addr + fw->runtime_size, FW_SHARED_MEM_ALIGNMENT); in ivpu_fw_update_global_range()
210 return -EINVAL; in ivpu_fw_update_global_range()
213 ivpu_hw_init_range(&vdev->hw->ranges.global, start, size); in ivpu_fw_update_global_range()
219 struct ivpu_fw_info *fw = vdev->fw; in ivpu_fw_mem_init() local
227 fw->mem = ivpu_bo_alloc_internal(vdev, fw->runtime_addr, fw->runtime_size, DRM_IVPU_BO_WC); in ivpu_fw_mem_init()
228 if (!fw->mem) { in ivpu_fw_mem_init()
230 return -ENOMEM; in ivpu_fw_mem_init()
233 fw->mem_log_crit = ivpu_bo_alloc_internal(vdev, 0, IVPU_FW_CRITICAL_BUFFER_SIZE, in ivpu_fw_mem_init()
235 if (!fw->mem_log_crit) { in ivpu_fw_mem_init()
237 ret = -ENOMEM; in ivpu_fw_mem_init()
246 fw->mem_log_verb = ivpu_bo_alloc_internal(vdev, 0, log_verb_size, DRM_IVPU_BO_CACHED); in ivpu_fw_mem_init()
247 if (!fw->mem_log_verb) { in ivpu_fw_mem_init()
249 ret = -ENOMEM; in ivpu_fw_mem_init()
253 if (fw->shave_nn_size) { in ivpu_fw_mem_init()
254 fw->mem_shave_nn = ivpu_bo_alloc_internal(vdev, vdev->hw->ranges.shave.start, in ivpu_fw_mem_init()
255 fw->shave_nn_size, DRM_IVPU_BO_UNCACHED); in ivpu_fw_mem_init()
256 if (!fw->mem_shave_nn) { in ivpu_fw_mem_init()
258 ret = -ENOMEM; in ivpu_fw_mem_init()
266 ivpu_bo_free_internal(fw->mem_log_verb); in ivpu_fw_mem_init()
268 ivpu_bo_free_internal(fw->mem_log_crit); in ivpu_fw_mem_init()
270 ivpu_bo_free_internal(fw->mem); in ivpu_fw_mem_init()
276 struct ivpu_fw_info *fw = vdev->fw; in ivpu_fw_mem_fini() local
278 if (fw->mem_shave_nn) { in ivpu_fw_mem_fini()
279 ivpu_bo_free_internal(fw->mem_shave_nn); in ivpu_fw_mem_fini()
280 fw->mem_shave_nn = NULL; in ivpu_fw_mem_fini()
283 ivpu_bo_free_internal(fw->mem_log_verb); in ivpu_fw_mem_fini()
284 ivpu_bo_free_internal(fw->mem_log_crit); in ivpu_fw_mem_fini()
285 ivpu_bo_free_internal(fw->mem); in ivpu_fw_mem_fini()
287 fw->mem_log_verb = NULL; in ivpu_fw_mem_fini()
288 fw->mem_log_crit = NULL; in ivpu_fw_mem_fini()
289 fw->mem = NULL; in ivpu_fw_mem_fini()
323 struct ivpu_fw_info *fw = vdev->fw; in ivpu_fw_load() local
324 u64 image_end_offset = fw->image_load_offset + fw->image_size; in ivpu_fw_load()
326 memset(fw->mem->kvaddr, 0, fw->image_load_offset); in ivpu_fw_load()
327 memcpy(fw->mem->kvaddr + fw->image_load_offset, in ivpu_fw_load()
328 fw->file->data + FW_FILE_IMAGE_OFFSET, fw->image_size); in ivpu_fw_load()
331 u8 *start = fw->mem->kvaddr + image_end_offset; in ivpu_fw_load()
332 u64 size = fw->mem->base.size - image_end_offset; in ivpu_fw_load()
337 wmb(); /* Flush WC buffers after writing fw->mem */ in ivpu_fw_load()
345 boot_params->magic); in ivpu_fw_boot_params_print()
347 boot_params->vpu_id); in ivpu_fw_boot_params_print()
349 boot_params->vpu_count); in ivpu_fw_boot_params_print()
351 boot_params->frequency); in ivpu_fw_boot_params_print()
353 boot_params->perf_clk_frequency); in ivpu_fw_boot_params_print()
356 boot_params->ipc_header_area_start); in ivpu_fw_boot_params_print()
358 boot_params->ipc_header_area_size); in ivpu_fw_boot_params_print()
360 boot_params->shared_region_base); in ivpu_fw_boot_params_print()
362 boot_params->shared_region_size); in ivpu_fw_boot_params_print()
364 boot_params->ipc_payload_area_start); in ivpu_fw_boot_params_print()
366 boot_params->ipc_payload_area_size); in ivpu_fw_boot_params_print()
368 boot_params->global_aliased_pio_base); in ivpu_fw_boot_params_print()
370 boot_params->global_aliased_pio_size); in ivpu_fw_boot_params_print()
373 boot_params->autoconfig); in ivpu_fw_boot_params_print()
376 boot_params->cache_defaults[VPU_BOOT_L2_CACHE_CFG_NN].use); in ivpu_fw_boot_params_print()
377 ivpu_dbg(vdev, FW_BOOT, "boot_params.cache_defaults[VPU_BOOT_L2_CACHE_CFG_NN].cfg = 0x%x\n", in ivpu_fw_boot_params_print()
378 boot_params->cache_defaults[VPU_BOOT_L2_CACHE_CFG_NN].cfg); in ivpu_fw_boot_params_print()
381 boot_params->global_memory_allocator_base); in ivpu_fw_boot_params_print()
383 boot_params->global_memory_allocator_size); in ivpu_fw_boot_params_print()
386 boot_params->shave_nn_fw_base); in ivpu_fw_boot_params_print()
389 boot_params->watchdog_irq_mss); in ivpu_fw_boot_params_print()
391 boot_params->watchdog_irq_nce); in ivpu_fw_boot_params_print()
393 boot_params->host_to_vpu_irq); in ivpu_fw_boot_params_print()
395 boot_params->job_done_irq); in ivpu_fw_boot_params_print()
398 boot_params->host_version_id); in ivpu_fw_boot_params_print()
400 boot_params->si_stepping); in ivpu_fw_boot_params_print()
402 boot_params->device_id); in ivpu_fw_boot_params_print()
404 boot_params->feature_exclusion); in ivpu_fw_boot_params_print()
406 boot_params->sku); in ivpu_fw_boot_params_print()
408 boot_params->min_freq_pll_ratio); in ivpu_fw_boot_params_print()
410 boot_params->pn_freq_pll_ratio); in ivpu_fw_boot_params_print()
412 boot_params->max_freq_pll_ratio); in ivpu_fw_boot_params_print()
414 boot_params->default_trace_level); in ivpu_fw_boot_params_print()
416 boot_params->tracing_buff_message_format_mask); in ivpu_fw_boot_params_print()
418 boot_params->trace_destination_mask); in ivpu_fw_boot_params_print()
420 boot_params->trace_hw_component_mask); in ivpu_fw_boot_params_print()
422 boot_params->boot_type); in ivpu_fw_boot_params_print()
424 boot_params->punit_telemetry_sram_base); in ivpu_fw_boot_params_print()
426 boot_params->punit_telemetry_sram_size); in ivpu_fw_boot_params_print()
428 boot_params->vpu_telemetry_enable); in ivpu_fw_boot_params_print()
433 struct ivpu_bo *ipc_mem_rx = vdev->ipc->mem_rx; in ivpu_fw_boot_params_setup()
437 boot_params->save_restore_ret_address = 0; in ivpu_fw_boot_params_setup()
438 vdev->pm->is_warmboot = true; in ivpu_fw_boot_params_setup()
443 vdev->pm->is_warmboot = false; in ivpu_fw_boot_params_setup()
445 boot_params->magic = VPU_BOOT_PARAMS_MAGIC; in ivpu_fw_boot_params_setup()
446 boot_params->vpu_id = to_pci_dev(vdev->drm.dev)->bus->number; in ivpu_fw_boot_params_setup()
447 boot_params->frequency = ivpu_hw_reg_pll_freq_get(vdev); in ivpu_fw_boot_params_setup()
453 boot_params->shared_region_base = vdev->hw->ranges.global.start; in ivpu_fw_boot_params_setup()
454 boot_params->shared_region_size = vdev->hw->ranges.global.end - in ivpu_fw_boot_params_setup()
455 vdev->hw->ranges.global.start; in ivpu_fw_boot_params_setup()
457 boot_params->ipc_header_area_start = ipc_mem_rx->vpu_addr; in ivpu_fw_boot_params_setup()
458 boot_params->ipc_header_area_size = ipc_mem_rx->base.size / 2; in ivpu_fw_boot_params_setup()
460 boot_params->ipc_payload_area_start = ipc_mem_rx->vpu_addr + ipc_mem_rx->base.size / 2; in ivpu_fw_boot_params_setup()
461 boot_params->ipc_payload_area_size = ipc_mem_rx->base.size / 2; in ivpu_fw_boot_params_setup()
463 boot_params->global_aliased_pio_base = vdev->hw->ranges.user.start; in ivpu_fw_boot_params_setup()
464 boot_params->global_aliased_pio_size = ivpu_hw_range_size(&vdev->hw->ranges.user); in ivpu_fw_boot_params_setup()
467 boot_params->autoconfig = 1; in ivpu_fw_boot_params_setup()
470 boot_params->cache_defaults[VPU_BOOT_L2_CACHE_CFG_NN].use = 1; in ivpu_fw_boot_params_setup()
471 boot_params->cache_defaults[VPU_BOOT_L2_CACHE_CFG_NN].cfg = in ivpu_fw_boot_params_setup()
472 ADDR_TO_L2_CACHE_CFG(vdev->hw->ranges.shave.start); in ivpu_fw_boot_params_setup()
474 if (vdev->fw->mem_shave_nn) in ivpu_fw_boot_params_setup()
475 boot_params->shave_nn_fw_base = vdev->fw->mem_shave_nn->vpu_addr; in ivpu_fw_boot_params_setup()
477 boot_params->watchdog_irq_mss = WATCHDOG_MSS_REDIRECT; in ivpu_fw_boot_params_setup()
478 boot_params->watchdog_irq_nce = WATCHDOG_NCE_REDIRECT; in ivpu_fw_boot_params_setup()
479 boot_params->si_stepping = ivpu_revision(vdev); in ivpu_fw_boot_params_setup()
480 boot_params->device_id = ivpu_device_id(vdev); in ivpu_fw_boot_params_setup()
481 boot_params->feature_exclusion = vdev->hw->tile_fuse; in ivpu_fw_boot_params_setup()
482 boot_params->sku = vdev->hw->sku; in ivpu_fw_boot_params_setup()
484 boot_params->min_freq_pll_ratio = vdev->hw->pll.min_ratio; in ivpu_fw_boot_params_setup()
485 boot_params->pn_freq_pll_ratio = vdev->hw->pll.pn_ratio; in ivpu_fw_boot_params_setup()
486 boot_params->max_freq_pll_ratio = vdev->hw->pll.max_ratio; in ivpu_fw_boot_params_setup()
488 boot_params->default_trace_level = vdev->fw->trace_level; in ivpu_fw_boot_params_setup()
489 boot_params->tracing_buff_message_format_mask = BIT(VPU_TRACING_FORMAT_STRING); in ivpu_fw_boot_params_setup()
490 boot_params->trace_destination_mask = vdev->fw->trace_destination_mask; in ivpu_fw_boot_params_setup()
491 boot_params->trace_hw_component_mask = vdev->fw->trace_hw_component_mask; in ivpu_fw_boot_params_setup()
492 boot_params->crit_tracing_buff_addr = vdev->fw->mem_log_crit->vpu_addr; in ivpu_fw_boot_params_setup()
493 boot_params->crit_tracing_buff_size = vdev->fw->mem_log_crit->base.size; in ivpu_fw_boot_params_setup()
494 boot_params->verbose_tracing_buff_addr = vdev->fw->mem_log_verb->vpu_addr; in ivpu_fw_boot_params_setup()
495 boot_params->verbose_tracing_buff_size = vdev->fw->mem_log_verb->base.size; in ivpu_fw_boot_params_setup()
497 boot_params->punit_telemetry_sram_base = ivpu_hw_reg_telemetry_offset_get(vdev); in ivpu_fw_boot_params_setup()
498 boot_params->punit_telemetry_sram_size = ivpu_hw_reg_telemetry_size_get(vdev); in ivpu_fw_boot_params_setup()
499 boot_params->vpu_telemetry_enable = ivpu_hw_reg_telemetry_enable_get(vdev); in ivpu_fw_boot_params_setup()