Commit 8a27ad81 authored by Wachowski, Karol's avatar Wachowski, Karol Committed by Jacek Lawrynowicz
Browse files

accel/ivpu: Split IP and buttress code



The NPU device consists of two parts: NPU buttress and NPU IP.
Buttress is a platform specific part that integrates the NPU IP with
the CPU.
NPU IP is the platform agnostic part that does the inference.

This separation enables support for multiple platforms using
a single NPU IP, so for example NPU IP 37XX could be integrated into
MTL and LNL platforms.

Signed-off-by: default avatarWachowski, Karol <karol.wachowski@intel.com>
Signed-off-by: default avatarJacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240515113006.457472-3-jacek.lawrynowicz@linux.intel.com
parent 302d5832
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -6,8 +6,9 @@ intel_vpu-y := \
	ivpu_fw.o \
	ivpu_fw_log.o \
	ivpu_gem.o \
	ivpu_hw_37xx.o \
	ivpu_hw_40xx.o \
	ivpu_hw.o \
	ivpu_hw_btrs.o \
	ivpu_hw_ip.o \
	ivpu_ipc.o \
	ivpu_job.o \
	ivpu_jsm_msg.o \
+1 −1
Original line number Diff line number Diff line
@@ -409,7 +409,7 @@ void ivpu_debugfs_init(struct ivpu_device *vdev)
	debugfs_create_file("resume_engine", 0200, debugfs_root, vdev,
			    &ivpu_resume_engine_fops);

	if (ivpu_hw_gen(vdev) >= IVPU_HW_40XX)
	if (ivpu_hw_ip_gen(vdev) >= IVPU_HW_IP_40XX)
		debugfs_create_file("fw_profiling_freq_drive", 0200,
				    debugfs_root, vdev, &fw_profiling_freq_fops);
}
+6 −7
Original line number Diff line number Diff line
@@ -464,9 +464,11 @@ static int ivpu_irq_init(struct ivpu_device *vdev)
		return ret;
	}

	ivpu_irq_handlers_init(vdev);

	vdev->irq = pci_irq_vector(pdev, 0);

	ret = devm_request_threaded_irq(vdev->drm.dev, vdev->irq, vdev->hw->ops->irq_handler,
	ret = devm_request_threaded_irq(vdev->drm.dev, vdev->irq, ivpu_hw_irq_handler,
					ivpu_irq_thread_handler, IRQF_NO_AUTOEN, DRIVER_NAME, vdev);
	if (ret)
		ivpu_err(vdev, "Failed to request an IRQ %d\n", ret);
@@ -543,13 +545,10 @@ static int ivpu_dev_init(struct ivpu_device *vdev)
	if (!vdev->pm)
		return -ENOMEM;

	if (ivpu_hw_gen(vdev) >= IVPU_HW_40XX) {
		vdev->hw->ops = &ivpu_hw_40xx_ops;
	if (ivpu_hw_ip_gen(vdev) >= IVPU_HW_IP_40XX)
		vdev->hw->dma_bits = 48;
	} else {
		vdev->hw->ops = &ivpu_hw_37xx_ops;
	else
		vdev->hw->dma_bits = 38;
	}

	vdev->platform = IVPU_PLATFORM_INVALID;
	vdev->context_xa_limit.min = IVPU_USER_CONTEXT_MIN_SSID;
@@ -578,7 +577,7 @@ static int ivpu_dev_init(struct ivpu_device *vdev)
		goto err_xa_destroy;

	/* Init basic HW info based on buttress registers which are accessible before power up */
	ret = ivpu_hw_info_init(vdev);
	ret = ivpu_hw_init(vdev);
	if (ret)
		goto err_xa_destroy;

+27 −6
Original line number Diff line number Diff line
@@ -27,8 +27,13 @@
#define PCI_DEVICE_ID_ARL   0xad1d
#define PCI_DEVICE_ID_LNL   0x643e

#define IVPU_HW_37XX	37
#define IVPU_HW_40XX	40
#define IVPU_HW_IP_37XX 37
#define IVPU_HW_IP_40XX 40
#define IVPU_HW_IP_50XX 50
#define IVPU_HW_IP_60XX 60

#define IVPU_HW_BTRS_MTL 1
#define IVPU_HW_BTRS_LNL 2

#define IVPU_GLOBAL_CONTEXT_MMU_SSID   0
/* SSID 1 is used by the VPU to represent reserved context */
@@ -198,16 +203,32 @@ static inline u16 ivpu_device_id(struct ivpu_device *vdev)
	return to_pci_dev(vdev->drm.dev)->device;
}

static inline int ivpu_hw_gen(struct ivpu_device *vdev)
static inline int ivpu_hw_ip_gen(struct ivpu_device *vdev)
{
	switch (ivpu_device_id(vdev)) {
	case PCI_DEVICE_ID_MTL:
	case PCI_DEVICE_ID_ARL:
		return IVPU_HW_IP_37XX;
	case PCI_DEVICE_ID_LNL:
		return IVPU_HW_IP_40XX;
	default:
		dump_stack();
		ivpu_err(vdev, "Unknown NPU IP generation\n");
		return 0;
	}
}

static inline int ivpu_hw_btrs_gen(struct ivpu_device *vdev)
{
	switch (ivpu_device_id(vdev)) {
	case PCI_DEVICE_ID_MTL:
	case PCI_DEVICE_ID_ARL:
		return IVPU_HW_37XX;
		return IVPU_HW_BTRS_MTL;
	case PCI_DEVICE_ID_LNL:
		return IVPU_HW_40XX;
		return IVPU_HW_BTRS_LNL;
	default:
		ivpu_err(vdev, "Unknown NPU device\n");
		dump_stack();
		ivpu_err(vdev, "Unknown buttress generation\n");
		return 0;
	}
}
+10 −10
Original line number Diff line number Diff line
@@ -54,10 +54,10 @@ static struct {
	int gen;
	const char *name;
} fw_names[] = {
	{ IVPU_HW_37XX, "vpu_37xx.bin" },
	{ IVPU_HW_37XX, "intel/vpu/vpu_37xx_v0.0.bin" },
	{ IVPU_HW_40XX, "vpu_40xx.bin" },
	{ IVPU_HW_40XX, "intel/vpu/vpu_40xx_v0.0.bin" },
	{ IVPU_HW_IP_37XX, "vpu_37xx.bin" },
	{ IVPU_HW_IP_37XX, "intel/vpu/vpu_37xx_v0.0.bin" },
	{ IVPU_HW_IP_40XX, "vpu_40xx.bin" },
	{ IVPU_HW_IP_40XX, "intel/vpu/vpu_40xx_v0.0.bin" },
};

static int ivpu_fw_request(struct ivpu_device *vdev)
@@ -73,7 +73,7 @@ static int ivpu_fw_request(struct ivpu_device *vdev)
	}

	for (i = 0; i < ARRAY_SIZE(fw_names); i++) {
		if (fw_names[i].gen != ivpu_hw_gen(vdev))
		if (fw_names[i].gen != ivpu_hw_ip_gen(vdev))
			continue;

		ret = firmware_request_nowarn(&vdev->fw->file, fw_names[i].name, vdev->drm.dev);
@@ -246,7 +246,7 @@ static int ivpu_fw_update_global_range(struct ivpu_device *vdev)
		return -EINVAL;
	}

	ivpu_hw_init_range(&vdev->hw->ranges.global, start, size);
	ivpu_hw_range_init(&vdev->hw->ranges.global, start, size);
	return 0;
}

@@ -511,7 +511,7 @@ void ivpu_fw_boot_params_setup(struct ivpu_device *vdev, struct vpu_boot_params

	boot_params->magic = VPU_BOOT_PARAMS_MAGIC;
	boot_params->vpu_id = to_pci_dev(vdev->drm.dev)->bus->number;
	boot_params->frequency = ivpu_hw_reg_pll_freq_get(vdev);
	boot_params->frequency = ivpu_hw_pll_freq_get(vdev);

	/*
	 * This param is a debug firmware feature.  It switches default clock
@@ -568,9 +568,9 @@ void ivpu_fw_boot_params_setup(struct ivpu_device *vdev, struct vpu_boot_params
	boot_params->verbose_tracing_buff_addr = vdev->fw->mem_log_verb->vpu_addr;
	boot_params->verbose_tracing_buff_size = ivpu_bo_size(vdev->fw->mem_log_verb);

	boot_params->punit_telemetry_sram_base = ivpu_hw_reg_telemetry_offset_get(vdev);
	boot_params->punit_telemetry_sram_size = ivpu_hw_reg_telemetry_size_get(vdev);
	boot_params->vpu_telemetry_enable = ivpu_hw_reg_telemetry_enable_get(vdev);
	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_focus_present_timer_ms = IVPU_FOCUS_PRESENT_TIMER_MS;
Loading