]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
accel/ivpu: Add support for Nova Lake's NPU
authorMaciej Falkowski <maciej.falkowski@linux.intel.com>
Wed, 22 Oct 2025 10:53:48 +0000 (12:53 +0200)
committerMaciej Falkowski <maciej.falkowski@linux.intel.com>
Thu, 23 Oct 2025 10:57:11 +0000 (12:57 +0200)
Add support for NPU6 generation that will be present on Nova Lake CPUs.
As with previous generations, it maintains compatibility
so no bigger functional changes apart from removing
deprecated call to soc_cpu_drive() function.

Quiescing TOP_MMIO in SOC_CPU_NOC as part of boot procedure is no longer
needed starting from 60XX. Remove soc_cpu_drive() call from NPU6 onward.

The VPU_CPU_NOC_QREQN, VPU_CPU_NOC_QACCEPTN, and VPU_CPU_NOC_QDENY
registers are deprecated and non-functional on 60XX. They will be
removed in future generations.

Signed-off-by: Karol Wachowski <karol.wachowski@linux.intel.com>
Reviewed-by: Jeff Hugo <jeff.hugo@oss.qualcomm.com>
Signed-off-by: Maciej Falkowski <maciej.falkowski@linux.intel.com>
Link: https://lore.kernel.org/r/20251022105348.2237273-1-maciej.falkowski@linux.intel.com
drivers/accel/ivpu/ivpu_drv.c
drivers/accel/ivpu/ivpu_drv.h
drivers/accel/ivpu/ivpu_fw.c
drivers/accel/ivpu/ivpu_hw_ip.c

index 1792d0bbec7113f068287b54ce2668a50a4e1a28..c6fe7a408912601d7566cd3c823728fceb2eb80f 100644 (file)
@@ -707,6 +707,7 @@ static struct pci_device_id ivpu_pci_ids[] = {
        { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_LNL) },
        { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_PTL_P) },
        { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_WCL) },
+       { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_NVL) },
        { }
 };
 MODULE_DEVICE_TABLE(pci, ivpu_pci_ids);
index 62ab1c654e6345a116a4e7649dde2477f83a3ca6..98b274a8567f01f1c25e93eb0e38d03643770c4e 100644 (file)
@@ -27,6 +27,7 @@
 #define PCI_DEVICE_ID_LNL      0x643e
 #define PCI_DEVICE_ID_PTL_P    0xb03e
 #define PCI_DEVICE_ID_WCL      0xfd3e
+#define PCI_DEVICE_ID_NVL      0xd71d
 
 #define IVPU_HW_IP_37XX 37
 #define IVPU_HW_IP_40XX 40
@@ -245,6 +246,8 @@ static inline int ivpu_hw_ip_gen(struct ivpu_device *vdev)
        case PCI_DEVICE_ID_PTL_P:
        case PCI_DEVICE_ID_WCL:
                return IVPU_HW_IP_50XX;
+       case PCI_DEVICE_ID_NVL:
+               return IVPU_HW_IP_60XX;
        default:
                dump_stack();
                ivpu_err(vdev, "Unknown NPU IP generation\n");
@@ -261,6 +264,7 @@ static inline int ivpu_hw_btrs_gen(struct ivpu_device *vdev)
        case PCI_DEVICE_ID_LNL:
        case PCI_DEVICE_ID_PTL_P:
        case PCI_DEVICE_ID_WCL:
+       case PCI_DEVICE_ID_NVL:
                return IVPU_HW_BTRS_LNL;
        default:
                dump_stack();
index be1290be77fd8b023ce2fd78de44c1bef2de0b7a..aa032b39dbe30b5ab110dee8c97ae91501bc0806 100644 (file)
@@ -56,12 +56,14 @@ static struct {
        { IVPU_HW_IP_40XX, "intel/vpu/vpu_40xx_v0.0.bin" },
        { IVPU_HW_IP_50XX, "intel/vpu/vpu_50xx_v1.bin" },
        { IVPU_HW_IP_50XX, "intel/vpu/vpu_50xx_v0.0.bin" },
+       { IVPU_HW_IP_60XX, "intel/vpu/vpu_60xx_v1.bin" },
 };
 
 /* Production fw_names from the table above */
 MODULE_FIRMWARE("intel/vpu/vpu_37xx_v1.bin");
 MODULE_FIRMWARE("intel/vpu/vpu_40xx_v1.bin");
 MODULE_FIRMWARE("intel/vpu/vpu_50xx_v1.bin");
+MODULE_FIRMWARE("intel/vpu/vpu_60xx_v1.bin");
 
 static int ivpu_fw_request(struct ivpu_device *vdev)
 {
index 2bf9882ab52e2171472e2567d193bb8c95d0fa29..06aa1e7dc50b17a7d4c171253924ede816be90ed 100644 (file)
@@ -691,6 +691,13 @@ static void pwr_island_delay_set(struct ivpu_device *vdev)
                status = high ? 46 : 3;
                break;
 
+       case PCI_DEVICE_ID_NVL:
+               post = high ? 198 : 17;
+               post1 = 0;
+               post2 = high ? 198 : 17;
+               status = 0;
+               break;
+
        default:
                dump_stack();
                ivpu_err(vdev, "Unknown device ID\n");
@@ -889,6 +896,9 @@ static int soc_cpu_drive_40xx(struct ivpu_device *vdev, bool enable)
 
 static int soc_cpu_enable(struct ivpu_device *vdev)
 {
+       if (ivpu_hw_ip_gen(vdev) >= IVPU_HW_IP_60XX)
+               return 0;
+
        return soc_cpu_drive_40xx(vdev, true);
 }