[PATCH] accel/ivpu: Update FW Boot API to version 3.28.3

Lizhi Hou lizhi.hou at amd.com
Thu Apr 3 20:38:50 UTC 2025


On 4/1/25 08:58, Maciej Falkowski wrote:
> From: Karol Wachowski <karol.wachowski at intel.com>
>
> This commit bumps FW Boot API to 3.28.3.

Bump FW Boot API ...

Please see: 
https://www.kernel.org/doc/html/v6.14/process/submitting-patches.html

Lizhi

>
> Use new preemption buffer size fields from FW header added to
> firmware boot API for preemption buffers allocations,
> if those new fields are zeroed use old values instead.
>
> Signed-off-by: Karol Wachowski <karol.wachowski at intel.com>
> Signed-off-by: Maciej Falkowski <maciej.falkowski at linux.intel.com>
> ---
>   drivers/accel/ivpu/ivpu_fw.c      | 14 ++++++--
>   drivers/accel/ivpu/vpu_boot_api.h | 13 ++++++--
>   drivers/accel/ivpu/vpu_jsm_api.h  | 53 +++++++++++++++++++++----------
>   3 files changed, 58 insertions(+), 22 deletions(-)
>
> diff --git a/drivers/accel/ivpu/ivpu_fw.c b/drivers/accel/ivpu/ivpu_fw.c
> index 7a1bb92d8c81..3799231b39e7 100644
> --- a/drivers/accel/ivpu/ivpu_fw.c
> +++ b/drivers/accel/ivpu/ivpu_fw.c
> @@ -233,10 +233,20 @@ static int ivpu_fw_parse(struct ivpu_device *vdev)
>   	fw->dvfs_mode = 0;
>   
>   	fw->sched_mode = ivpu_fw_sched_mode_select(vdev, fw_hdr);
> -	fw->primary_preempt_buf_size = fw_hdr->preemption_buffer_1_size;
> -	fw->secondary_preempt_buf_size = fw_hdr->preemption_buffer_2_size;
>   	ivpu_info(vdev, "Scheduler mode: %s\n", fw->sched_mode ? "HW" : "OS");
>   
> +	if (fw_hdr->preemption_buffer_1_max_size)
> +		fw->primary_preempt_buf_size = fw_hdr->preemption_buffer_1_max_size;
> +	else
> +		fw->primary_preempt_buf_size = fw_hdr->preemption_buffer_1_size;
> +
> +	if (fw_hdr->preemption_buffer_2_max_size)
> +		fw->secondary_preempt_buf_size = fw_hdr->preemption_buffer_2_max_size;
> +	else
> +		fw->secondary_preempt_buf_size = fw_hdr->preemption_buffer_2_size;
> +	ivpu_dbg(vdev, FW_BOOT, "Preemption buffer sizes: primary %u, secondary %u\n",
> +		 fw->primary_preempt_buf_size, fw->secondary_preempt_buf_size);
> +
>   	if (fw_hdr->ro_section_start_address && !is_within_range(fw_hdr->ro_section_start_address,
>   								 fw_hdr->ro_section_size,
>   								 fw_hdr->image_load_address,
> diff --git a/drivers/accel/ivpu/vpu_boot_api.h b/drivers/accel/ivpu/vpu_boot_api.h
> index 908e68ea1c39..218468bbbcad 100644
> --- a/drivers/accel/ivpu/vpu_boot_api.h
> +++ b/drivers/accel/ivpu/vpu_boot_api.h
> @@ -26,7 +26,7 @@
>    * Minor version changes when API backward compatibility is preserved.
>    * Resets to 0 if Major version is incremented.
>    */
> -#define VPU_BOOT_API_VER_MINOR 26
> +#define VPU_BOOT_API_VER_MINOR 28
>   
>   /*
>    * API header changed (field names, documentation, formatting) but API itself has not been changed
> @@ -76,8 +76,15 @@ struct vpu_firmware_header {
>   	 * submission queue size and device capabilities.
>   	 */
>   	u32 preemption_buffer_2_size;
> +	/*
> +	 * Maximum preemption buffer size that the FW can use: no need for the host
> +	 * driver to allocate more space than that specified by these fields.
> +	 * A value of 0 means no declared limit.
> +	 */
> +	u32 preemption_buffer_1_max_size;
> +	u32 preemption_buffer_2_max_size;
>   	/* Space reserved for future preemption-related fields. */
> -	u32 preemption_reserved[6];
> +	u32 preemption_reserved[4];
>   	/* FW image read only section start address, 4KB aligned */
>   	u64 ro_section_start_address;
>   	/* FW image read only section size, 4KB aligned */
> @@ -134,7 +141,7 @@ enum vpu_trace_destination {
>   /*
>    * Processor bit shifts (for loggable HW components).
>    */
> -#define VPU_TRACE_PROC_BIT_ARM	     0
> +#define VPU_TRACE_PROC_BIT_RESERVED  0
>   #define VPU_TRACE_PROC_BIT_LRT	     1
>   #define VPU_TRACE_PROC_BIT_LNN	     2
>   #define VPU_TRACE_PROC_BIT_SHV_0     3
> diff --git a/drivers/accel/ivpu/vpu_jsm_api.h b/drivers/accel/ivpu/vpu_jsm_api.h
> index 7215c144158c..4b6b2b3d2583 100644
> --- a/drivers/accel/ivpu/vpu_jsm_api.h
> +++ b/drivers/accel/ivpu/vpu_jsm_api.h
> @@ -22,7 +22,7 @@
>   /*
>    * Minor version changes when API backward compatibility is preserved.
>    */
> -#define VPU_JSM_API_VER_MINOR 25
> +#define VPU_JSM_API_VER_MINOR 29
>   
>   /*
>    * API header changed (field names, documentation, formatting) but API itself has not been changed
> @@ -53,8 +53,7 @@
>    * Engine indexes.
>    */
>   #define VPU_ENGINE_COMPUTE 0
> -#define VPU_ENGINE_COPY	   1
> -#define VPU_ENGINE_NB	   2
> +#define VPU_ENGINE_NB	   1
>   
>   /*
>    * VPU status values.
> @@ -126,11 +125,13 @@ enum {
>   	 * When set, indicates that job queue uses native fences (as inline commands
>   	 * in job queue). Such queues may also use legacy fences (as commands in batch buffers).
>   	 * When cleared, indicates the job queue only uses legacy fences.
> -	 * NOTE: For queues using native fences, VPU expects that all jobs in the queue
> -	 * are immediately followed by an inline command object. This object is expected
> -	 * to be a fence signal command in most cases, but can also be a NOP in case the host
> -	 * does not need per-job fence signalling. Other inline commands objects can be
> -	 * inserted between "job and inline command" pairs.
> +	 * NOTES:
> +	 *   1. For queues using native fences, VPU expects that all jobs in the queue
> +	 *      are immediately followed by an inline command object. This object is expected
> +	 *      to be a fence signal command in most cases, but can also be a NOP in case the host
> +	 *      does not need per-job fence signalling. Other inline commands objects can be
> +	 *      inserted between "job and inline command" pairs.
> +	 *  2. Native fence queues are only supported on VPU 40xx onwards.
>   	 */
>   	VPU_JOB_QUEUE_FLAGS_USE_NATIVE_FENCE_MASK = (1 << 1U),
>   
> @@ -275,6 +276,8 @@ struct vpu_inline_cmd {
>   			u64 value;
>   			/* User VA of the log buffer in which to add log entry on completion. */
>   			u64 log_buffer_va;
> +			/* NPU private data. */
> +			u64 npu_private_data;
>   		} fence;
>   		/* Other commands do not have a payload. */
>   		/* Payload definition for future inline commands can be inserted here. */
> @@ -791,12 +794,22 @@ struct vpu_jsm_metric_streamer_update {
>   	/** Metric group mask that identifies metric streamer instance. */
>   	u64 metric_group_mask;
>   	/**
> -	 * Address and size of the buffer where the VPU will write metric data. If
> -	 * the buffer address is 0 or same as the currently used buffer the VPU will
> -	 * continue writing metric data to the current buffer. In this case the
> -	 * buffer size is ignored and the size of the current buffer is unchanged.
> -	 * If the address is non-zero and differs from the current buffer address the
> -	 * VPU will immediately switch data collection to the new buffer.
> +	 * Address and size of the buffer where the VPU will write metric data.
> +	 * This member dictates how the update operation should perform:
> +	 * 1. client needs information about the number of collected samples and the
> +	 *   amount of data written to the current buffer
> +	 * 2. client wants to switch to a new buffer
> +	 *
> +	 * Case 1. is identified by the buffer address being 0 or the same as the
> +	 * currently used buffer address. In this case the buffer size is ignored and
> +	 * the size of the current buffer is unchanged. The VPU will return an update
> +	 * in the vpu_jsm_metric_streamer_done structure. The internal writing position
> +	 * into the buffer is not changed.
> +	 *
> +	 * Case 2. is identified by the address being non-zero and differs from the
> +	 * current buffer address. The VPU will immediately switch data collection to
> +	 * the new buffer. Then the VPU will return an update in the
> +	 * vpu_jsm_metric_streamer_done structure.
>   	 */
>   	u64 buffer_addr;
>   	u64 buffer_size;
> @@ -934,6 +947,7 @@ struct vpu_ipc_msg_payload_hws_priority_band_setup {
>   	/*
>   	 * Default quantum in 100ns units for scheduling across processes
>   	 * within a priority band
> +	 * Minimum value supported by NPU is 1ms (10000 in 100ns units).
>   	 */
>   	u32 process_quantum[VPU_HWS_NUM_PRIORITY_BANDS];
>   	/*
> @@ -946,8 +960,10 @@ struct vpu_ipc_msg_payload_hws_priority_band_setup {
>   	 * in situations when it's starved by the focus band.
>   	 */
>   	u32 normal_band_percentage;
> -	/* Reserved */
> -	u32 reserved_0;
> +	/*
> +	 * TDR timeout value in milliseconds. Default value of 0 meaning no timeout.
> +	 */
> +	u32 tdr_timeout;
>   };
>   
>   /*
> @@ -1024,7 +1040,10 @@ struct vpu_ipc_msg_payload_hws_set_context_sched_properties {
>   	s32 in_process_priority;
>   	/* Zero padding / Reserved */
>   	u32 reserved_1;
> -	/* Context quantum relative to other contexts of same priority in the same process */
> +	/*
> +	 * Context quantum relative to other contexts of same priority in the same process
> +	 * Minimum value supported by NPU is 1ms (10000 in 100ns units).
> +	 */
>   	u64 context_quantum;
>   	/* Grace period when preempting context of the same priority within the same process */
>   	u64 grace_period_same_priority;


More information about the dri-devel mailing list