Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

accel/ivpu: Add support for Nova Lake's NPU

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

+17
+1
drivers/accel/ivpu/ivpu_drv.c
··· 707 707 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_LNL) }, 708 708 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_PTL_P) }, 709 709 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_WCL) }, 710 + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_NVL) }, 710 711 { } 711 712 }; 712 713 MODULE_DEVICE_TABLE(pci, ivpu_pci_ids);
+4
drivers/accel/ivpu/ivpu_drv.h
··· 27 27 #define PCI_DEVICE_ID_LNL 0x643e 28 28 #define PCI_DEVICE_ID_PTL_P 0xb03e 29 29 #define PCI_DEVICE_ID_WCL 0xfd3e 30 + #define PCI_DEVICE_ID_NVL 0xd71d 30 31 31 32 #define IVPU_HW_IP_37XX 37 32 33 #define IVPU_HW_IP_40XX 40 ··· 246 245 case PCI_DEVICE_ID_PTL_P: 247 246 case PCI_DEVICE_ID_WCL: 248 247 return IVPU_HW_IP_50XX; 248 + case PCI_DEVICE_ID_NVL: 249 + return IVPU_HW_IP_60XX; 249 250 default: 250 251 dump_stack(); 251 252 ivpu_err(vdev, "Unknown NPU IP generation\n"); ··· 264 261 case PCI_DEVICE_ID_LNL: 265 262 case PCI_DEVICE_ID_PTL_P: 266 263 case PCI_DEVICE_ID_WCL: 264 + case PCI_DEVICE_ID_NVL: 267 265 return IVPU_HW_BTRS_LNL; 268 266 default: 269 267 dump_stack();
+2
drivers/accel/ivpu/ivpu_fw.c
··· 56 56 { IVPU_HW_IP_40XX, "intel/vpu/vpu_40xx_v0.0.bin" }, 57 57 { IVPU_HW_IP_50XX, "intel/vpu/vpu_50xx_v1.bin" }, 58 58 { IVPU_HW_IP_50XX, "intel/vpu/vpu_50xx_v0.0.bin" }, 59 + { IVPU_HW_IP_60XX, "intel/vpu/vpu_60xx_v1.bin" }, 59 60 }; 60 61 61 62 /* Production fw_names from the table above */ 62 63 MODULE_FIRMWARE("intel/vpu/vpu_37xx_v1.bin"); 63 64 MODULE_FIRMWARE("intel/vpu/vpu_40xx_v1.bin"); 64 65 MODULE_FIRMWARE("intel/vpu/vpu_50xx_v1.bin"); 66 + MODULE_FIRMWARE("intel/vpu/vpu_60xx_v1.bin"); 65 67 66 68 static int ivpu_fw_request(struct ivpu_device *vdev) 67 69 {
+10
drivers/accel/ivpu/ivpu_hw_ip.c
··· 691 691 status = high ? 46 : 3; 692 692 break; 693 693 694 + case PCI_DEVICE_ID_NVL: 695 + post = high ? 198 : 17; 696 + post1 = 0; 697 + post2 = high ? 198 : 17; 698 + status = 0; 699 + break; 700 + 694 701 default: 695 702 dump_stack(); 696 703 ivpu_err(vdev, "Unknown device ID\n"); ··· 896 889 897 890 static int soc_cpu_enable(struct ivpu_device *vdev) 898 891 { 892 + if (ivpu_hw_ip_gen(vdev) >= IVPU_HW_IP_60XX) 893 + return 0; 894 + 899 895 return soc_cpu_drive_40xx(vdev, true); 900 896 } 901 897