Commit 436b67d6 authored by Jacek Lawrynowicz's avatar Jacek Lawrynowicz
Browse files

accel/ivpu: Add auto selection logic for job scheduler



Add ivpu_fw_sched_mode_select() function that can select scheduling mode
based on HW and FW versions. This prepares for a switch to HWS on
selected platforms.

Reviewed-by: default avatarKarol Wachowski <karol.wachowski@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240930195322.461209-17-jacek.lawrynowicz@linux.intel.com


Signed-off-by: default avatarJacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
parent 707542dd
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -54,9 +54,9 @@ u8 ivpu_pll_max_ratio = U8_MAX;
module_param_named(pll_max_ratio, ivpu_pll_max_ratio, byte, 0644);
MODULE_PARM_DESC(pll_max_ratio, "Maximum PLL ratio used to set NPU frequency");

int ivpu_sched_mode;
int ivpu_sched_mode = IVPU_SCHED_MODE_AUTO;
module_param_named(sched_mode, ivpu_sched_mode, int, 0444);
MODULE_PARM_DESC(sched_mode, "Scheduler mode: 0 - Default scheduler, 1 - Force HW scheduler");
MODULE_PARM_DESC(sched_mode, "Scheduler mode: -1 - Use default scheduler, 0 - Use OS scheduler, 1 - Use HW scheduler");

bool ivpu_disable_mmu_cont_pages;
module_param_named(disable_mmu_cont_pages, ivpu_disable_mmu_cont_pages, bool, 0444);
@@ -347,7 +347,7 @@ static int ivpu_hw_sched_init(struct ivpu_device *vdev)
{
	int ret = 0;

	if (vdev->hw->sched_mode == VPU_SCHEDULING_MODE_HW) {
	if (vdev->fw->sched_mode == VPU_SCHEDULING_MODE_HW) {
		ret = ivpu_jsm_hws_setup_priority_bands(vdev);
		if (ret) {
			ivpu_err(vdev, "Failed to enable hw scheduler: %d", ret);
+2 −0
Original line number Diff line number Diff line
@@ -56,6 +56,8 @@
#define IVPU_PLATFORM_FPGA    3
#define IVPU_PLATFORM_INVALID 8

#define IVPU_SCHED_MODE_AUTO -1

#define IVPU_DBG_REG	 BIT(0)
#define IVPU_DBG_IRQ	 BIT(1)
#define IVPU_DBG_MMU	 BIT(2)
+13 −2
Original line number Diff line number Diff line
@@ -134,6 +134,15 @@ static bool is_within_range(u64 addr, size_t size, u64 range_start, size_t range
	return true;
}

static u32
ivpu_fw_sched_mode_select(struct ivpu_device *vdev, const struct vpu_firmware_header *fw_hdr)
{
	if (ivpu_sched_mode != IVPU_SCHED_MODE_AUTO)
		return ivpu_sched_mode;

	return VPU_SCHEDULING_MODE_OS;
}

static int ivpu_fw_parse(struct ivpu_device *vdev)
{
	struct ivpu_fw_info *fw = vdev->fw;
@@ -215,8 +224,10 @@ 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->ro_section_start_address && !is_within_range(fw_hdr->ro_section_start_address,
								 fw_hdr->ro_section_size,
@@ -605,8 +616,8 @@ void ivpu_fw_boot_params_setup(struct ivpu_device *vdev, struct vpu_boot_params
	boot_params->punit_telemetry_sram_base = ivpu_hw_telemetry_offset_get(vdev);
	boot_params->punit_telemetry_sram_size = ivpu_hw_telemetry_size_get(vdev);
	boot_params->vpu_telemetry_enable = ivpu_hw_telemetry_enable_get(vdev);
	boot_params->vpu_scheduling_mode = vdev->hw->sched_mode;
	if (vdev->hw->sched_mode == VPU_SCHEDULING_MODE_HW)
	boot_params->vpu_scheduling_mode = vdev->fw->sched_mode;
	if (vdev->fw->sched_mode == VPU_SCHEDULING_MODE_HW)
		boot_params->vpu_focus_present_timer_ms = IVPU_FOCUS_PRESENT_TIMER_MS;
	boot_params->dvfs_mode = vdev->fw->dvfs_mode;
	if (!IVPU_WA(disable_d0i3_msg))
+3 −0
Original line number Diff line number Diff line
@@ -6,6 +6,8 @@
#ifndef __IVPU_FW_H__
#define __IVPU_FW_H__

#include "vpu_jsm_api.h"

#define FW_VERSION_HEADER_SIZE	SZ_4K
#define FW_VERSION_STR_SIZE	SZ_256

@@ -36,6 +38,7 @@ struct ivpu_fw_info {
	u32 secondary_preempt_buf_size;
	u64 read_only_addr;
	u32 read_only_size;
	u32 sched_mode;
};

int ivpu_fw_init(struct ivpu_device *vdev);
+0 −1
Original line number Diff line number Diff line
@@ -46,7 +46,6 @@ struct ivpu_hw_info {
		u32 profiling_freq;
	} pll;
	u32 tile_fuse;
	u32 sched_mode;
	u32 sku;
	u16 config;
	int dma_bits;
Loading