Linux 内核 amdxdna 驱动深度解析:AMD NPU 硬件架构、调度机制与驱动实现
发布时间:2026/9/7 15:23:30 作者:尧图编辑部 阅读量:1,286

Linux 内核 amdxdna 驱动深度解析AMD NPU 硬件架构、调度机制与驱动实现【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux本文围绕 Linux 内核中Documentation/accel/amdxdna/下的 AMD NPU 驱动文档展开系统讲解 AMD NPUNeural Processing Unit的 XDNA 硬件架构、空间/时间混合调度机制、overlay 与 ctrlcode 双二进制工作负载模型以及 amdxdna 内核驱动的用户态接口与启动流程。读完后你将能够理解 NPU 在 AMD 客户端 APU 中的定位、上下文与列资源的分配原理并能结合 驱动源码 定位设备探测、mailbox 通信与命令提交流程的实现细节。一、驱动定位与文档体系AMD NPUNeural Processing Unit是集成在 AMD 客户端 APU 中的多用户 AI 推理加速器面向 CNN、LLM 等机器学习负载。文档 index.rst 明确说明该 NPU 基于 AMD XDNA 架构由amdxdna驱动管理文档主体内容位于 amdnpu.rst。在内核中的落地位于 drivers/accel/amdxdna/ 目录其 Kconfig 定义如下见 Kconfigconfig DRM_ACCEL_AMDXDNA tristate AMD AI Engine depends on AMD_IOMMU depends on DRM_ACCEL depends on PCI HAS_IOMEM depends on X86_64 select DRM_SCHED select DRM_GEM_SHMEM_HELPER select FW_LOADER select HMM_MIRROR help Choose this option to enable support for NPU integrated into AMD client CPUs like AMD Ryzen AI 300 Series. AMD NPU can be used to accelerate machine learning applications. If M is selected, the driver module will be amdxdna.从配置依赖可以直接读出该驱动的适用前提与底层依赖配置项含义depends on AMD_IOMMU进程隔离依赖 AMD IOMMU 的 PASID 机制详见下文depends on DRM_ACCEL驱动以 DRM accel 计算加速设备形式暴露用户态通过/dev/dri/accel访问depends on X86_64目前仅支持 x86_64 平台select DRM_SCHED使用 DRM 统一 GPU 调度框架管理执行队列select FW_LOADER通过固件加载框架安全加载签名的 NPU 固件select HMM_MIRROR借助 HMM 机制支持用户内存迁移编译产物由 Makefile 组织核心对象包括amdxdna_pci_drvPCI 驱动入口、amdxdna_ctx上下文、amdxdna_mailbox邮箱通信、amdxdna_cbuf命令缓冲、amdxdna_gemGEM 内存管理、amdxdna_iommu隔离、amdxdna_pm电源管理等其中aie4_sriov.o仅在开启CONFIG_PCI_IOV时编入amdxdna_debugfs.o仅在开启CONFIG_DEBUG_FS时编入说明新代 NPUAIE4支持 SR-IOV 直通虚拟化场景。二、硬件组成XDNA 2D 阵列、L2 与微控制器按 amdnpu.rst 的硬件描述AMD NPU 由以下部件构成。2.1 AMD XDNA ArrayXDNA Array 是由 AMD AI Engine 技术构建的计算/存储 Tile 二维阵列每列包含 4 行计算 Tile 和 1 行存储 Tile每个计算 Tile 内含一个 VLIW 处理器及其专属的程序/数据内存存储 Tile 充当 L2 缓存2D 阵列可以按列边界切分为空间隔离的分区spatial partition每个分区可绑定到一个工作负载上下文每列还拥有专属 DMA 引擎负责在主机 DDR 与存储 Tile 之间搬运数据。不同产品形态的拓扑规格文档给出的关键参数产品平台阵列拓扑L2 容量并发上下文数AMD Phoenix / Hawk Point 客户端 NPU4x54 行 x 5 列2560 KB6AMD Strix Point 客户端 APU4x84 行 x 8 列4096 KB162.2 微控制器与 MERT/ERT 执行模型NPU 内有一颗微控制器运行 NPU 固件负责命令处理、XDNA Array 分区设置、阵列配置、工作负载上下文管理与编排。固件使用两类受隔离保护的上下文ERTElastic Runtime为每个工作负载上下文创建一个实例化的非特权隔离上下文既服务该上下文的请求也执行用户提供的ctrlcodeMERTManagement ERT单个特权隔离上下文专门服务来自 amdxdna 驱动的管理命令。这套“一 MERT 管驱动、一 ERT 服务一个上下文”的模型是多用户安全隔离的核心。2.3 Mailbox 通信通道微控制器与驱动之间的通信走 mailbox 机制特权通道用于上下文建立、遥测、查询、错误处理、用户通道设置等管理任务由 MERT 服务绑定到单个 mailbox用户通道每个工作负载上下文拥有一条专属用户通道主要用于向 NPU 提交工作由对应的 ERT 实例服务每条用户通道绑定独立 mailbox。2.4 PCIe EP 与 BAR 布局NPU 对 x86 宿主 CPU 呈现为一个带多 BAR 和 MSI-X 中断向量的 PCIe 设备读写主机内存走 SoC 级专用高带宽 fabric。中断方面每个 ERT 实例拥有自己的专属 MSI-X 中断MERT 共享单一 MSI-X 中断。文档将 BAR 按功能分为五类并强调具体设备上 BAR 的物理布局会合并或拆分BAR 类型功能PSP BAR暴露 AMD PSPPlatform Security Processor功能SMU BAR暴露 AMD SMUSystem Management Unit功能SRAM BAR暴露 mailbox 的环形缓冲区Mailbox BAR暴露 mailbox 控制寄存器head、tail、ISR 等Public Register BAR暴露公共寄存器文档给出的两个实例AMD PhoenixPSP、SMU、Public Register 三类功能都位于 PCIe BAR 0AMD Strix PointMailbox 与 Public Register 位于 BAR 0而 PSP 的寄存器分散在 BAR 0Public Register BAR与 BAR 4PSP BAR两处。这一细节直接决定了驱动按设备型号区分处理逻辑。源码中 amdxdna_pci_drv.c 用两级表实现这一点先用(vendor_id, device_id)匹配 PCI 设备再用(device_id, revision_id)选择具体设备信息结构体static const struct pci_device_id pci_ids[] { { PCI_DEVICE(PCI_VENDOR_ID_AMD, 0x1502) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, 0x17f0) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, 0x17f2) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, 0x17f3) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, 0x1B0B) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, 0x1B0C) }, {0} }; static const struct amdxdna_device_id amdxdna_ids[] { { 0x1502, 0x0, dev_npu1_info }, { 0x17f0, 0x10, dev_npu4_info }, { 0x17f0, 0x11, dev_npu5_info }, { 0x17f0, 0x20, dev_npu6_info }, { 0x17f2, 0x10, dev_npu3_pf_info }, { 0x17f3, 0x10, dev_npu3_vf_info }, { 0x1B0B, 0x10, dev_npu3_pf_info }, { 0x1B0C, 0x10, dev_npu3_vf_info }, {0} };同 device_id 的设备对宿主驱动接口非常相似因此按 revision 细分到dev_npu1_info~dev_npu6_info各代实现npu3系列还区分 PF物理功能与 VF虚拟功能与 aie4_sriov.c 提供的 SR-IOV 能力对应。各代寄存器偏移定义集中在 npu1_regs.c、npu3_regs.c、npu4_regs.c、npu5_regs.c、npu6_regs.c 中与文档中“BAR 布局因设备而异”的描述相印证。2.5 进程隔离硬件XDNA Array 可被动态划分为空间隔离分区每个分区一列或多列分区由微控制器编程列隔离寄存器建立且每个空间分区都关联一个由微控制器编程的PASID。这样多个空间分区就能以 PASID 保护的方式并发访问主机内存。固件自身则依赖微控制器 MMU 强制的隔离上下文来服务用户/特权通道请求。这一点在驱动侧有直接对应amdxdna_pci_drv.c 的amdxdna_sva_init()在每次用户态打开设备时通过iommu_sva_bind_device()把客户端的mm绑定到 IOMMU SVA 域并用iommu_sva_get_pasid()取出 PASID打开失败时还会回退检查 carveout 配置amdxdna_use_carveout()。这也解释了 Kconfig 中depends on AMD_IOMMU的必要性——没有 IOMMU 就无法建立 PASID 保护的主机内存访问。三、空间与时间混合调度及 Resource SolverXDNA 架构支持对 2D 阵列进行空间 时间共享的混合调度空间分区可以动态建立与拆除以适应不同负载一个空间分区可以排他绑定单个工作负载上下文也可以临时绑定多个上下文时间片轮转对临时共享的分区微控制器会实时更新分区的 PASID使其与当前绑定到该分区的上下文匹配。负责这一过程的是 amdxdna 驱动中的Resource Solver组件每个工作负载在其元数据中描述运行 NPU 二进制所需的列数Resource Solver 综合负载传入的提示hints与自身启发式算法决定 2D 阵列的重新分区策略以及工作负载到空间/时间共享列上的映射最终由固件执行 Resource Solver 做出的“上下文到列”资源绑定决策。源码层面Resource Solver 是一个独立的通用求解器模块 aie2_solver.c其 API 见 aie2_solver.h/* * Structure used to describe a partition. A partition is column based * allocation unit described by its start column and number of columns. */ struct aie_part { u32 start_col; u32 ncols; }; int xrs_allocate_resource(void *hdl, struct alloc_requests *req, void *cb_arg); int xrs_release_resource(void *rid); void *xrsm_init(struct init_config *cfg);其中struct alloc_requests携带 CDOConfiguration Data Object的分区元数据cdo_parts候选起始列数组、列数、QoS 能力与请求的 QoSGOPS、帧率、DMA 带宽、时延、执行时间、优先级初始化配置struct init_config还包含总列数与可用频率表clk_list——求解器会依据频率表选择满足 QoS 的频率等级enum power_level定义了POWER_LEVEL_MIN至POWER_LEVEL_7共 8 个功率等级并在分配/释放时通过xrs_action_ops回调load/unload/set_dft_dpm_level驱动硬件动作。头文件注释还特别指出求解器内部无锁调用者需要自行锁住 XCLBIN 并加锁——这与文档“Resource Solver 决定、固件执行”的职责划分一致。四、应用二进制overlay 与 ctrlcode文档指出一个 NPU 应用负载由 NPU 编译器生成的两个独立二进制组成AMD XDNA Array overlay用于配置 NPU 空间分区内容包含 stream switch 配置与计算 Tile 的 ELF 指令。它由与该工作负载绑定的分区上的 ERT 实例加载到分区上ctrlcode用于编排已加载在空间分区上的 overlay由运行在微控制器上、处于受保护模式的 ERT 在该工作负载上下文中执行。ctrlcode 由一系列名为XAie_TxnOpcode的操作码序列构成。五、特殊主机缓冲区5.1 每上下文指令缓冲Instruction Buffer每个工作负载上下文使用一块主机驻留的 64 MB 缓冲区它被内存映射到服务该工作负载的 ERT 实例中。负载的ctrlcode会被拷贝进这块特殊内存并且和该工作负载的其它输入/输出缓冲区一样受 PASID 保护同时该指令缓冲也映射进用户态工作负载的进程地址空间。驱动侧数据结构与之呼应amdxdna_ctx.h 中上下文描述携带inst_buf指令缓冲地址与inst_size字节数字段aie2_message.c 在构造发送给固件的 mailbox 消息dpu_req、npu_slot等结构时填充inst_buf_addr与文档“MERT 将指令缓冲映射进 ERT 内存”的描述对应。5.2 全局特权缓冲Global Privileged Buffer驱动另外单独分配一块缓冲用于记录来自 MERT 的错误等维护任务。该缓冲使用全局 IOMMU 域且只有 MERT 可访问——它不属于任何用户上下文因此不受任何用户 PASID 管辖。六、高层使用流程11 步与源码印证文档给出的完整运行流程如下可视为用户态程序与 NPU 协作的“合同”将负载编译为 overlay 与ctrlcode两个二进制用户态在驱动中打开上下文并提供 overlay驱动向 Resource Solver 查询是否为该负载供给一组列驱动随后请 MERT 按期望列数在设备上创建上下文MERT 创建 ERT 实例并把指令缓冲映射进 ERT 内存用户态将ctrlcode拷贝到指令缓冲用户态创建指向输入、输出、指令缓冲指针的命令缓冲提交给驱动后睡眠等待完成驱动经由 Mailbox 把命令发给 ERTERT 执行指令缓冲中的ctrlcodectrlcode执行触发与主机 DDR 之间的 DMA 进出境XDNA Array 开始运转ERT 执行到ctrlcode末尾时触发 MSI-X 中断通知驱动驱动唤醒等待中的工作负载。该流程在源码中的落点非常清晰用户态通过一组 DRM ioctl 完成各步骤amdxdna_pci_drv.cstatic const struct drm_ioctl_desc amdxdna_drm_ioctls[] { /* Context */ DRM_IOCTL_DEF_DRV(AMDXDNA_CREATE_HWCTX, amdxdna_drm_create_hwctx_ioctl, 0), DRM_IOCTL_DEF_DRV(AMDXDNA_DESTROY_HWCTX, amdxdna_drm_destroy_hwctx_ioctl, 0), DRM_IOCTL_DEF_DRV(AMDXDNA_CONFIG_HWCTX, amdxdna_drm_config_hwctx_ioctl, 0), /* BO */ DRM_IOCTL_DEF_DRV(AMDXDNA_CREATE_BO, amdxdna_drm_create_bo_ioctl, 0), DRM_IOCTL_DEF_DRV(AMDXDNA_GET_BO_INFO, amdxdna_drm_get_bo_info_ioctl, 0), DRM_IOCTL_DEF_DRV(AMDXDNA_SYNC_BO, amdxdna_drm_sync_bo_ioctl, 0), /* Execution */ DRM_IOCTL_DEF_DRV(AMDXDNA_EXEC_CMD, amdxdna_drm_submit_cmd_ioctl, 0), DRM_IOCTL_DEF_DRV(AMDXDNA_WAIT_CMD, amdxdna_drm_wait_cmd_ioctl, 0), /* AIE hardware */ DRM_IOCTL_DEF_DRV(AMDXDNA_GET_INFO, amdxdna_drm_get_info_ioctl, 0), DRM_IOCTL_DEF_DRV(AMDXDNA_GET_ARRAY, amdxdna_drm_get_array_ioctl, 0), DRM_IOCTL_DEF_DRV(AMDXDNA_SET_STATE, amdxdna_drm_set_state_ioctl, DRM_ROOT_ONLY), };CREATE_HWCTX对应步骤 2–5提交 overlay、列分配、MERT 建上下文、ERT 建实例CREATE_BO/SYNC_BO对应输入/输出/指令缓冲的 GEM 对象管理与同步步骤 6EXEC_CMD与WAIT_CMD对应步骤 7–11 的命令提交与完成等待SET_STATE标记DRM_ROOT_ONLY只有特权可调用符合其“管理面”属性驱动版本注释amdxdna_pci_drv.c显示接口从 0.0 演进到 0.10新增能力包括硬件错误上报、固件调试缓冲、资源信息查询、遥测、抢占、功耗与利用率、BO 用量查询、AIE4 UMQ 等——读者可以据此判断内核版本对应的功能集。驱动以 DRM 计算加速设备呈现amdxdna_drm_drv.driver_features含DRIVER_COMPUTE_ACCEL设备名amdxdna_accel_driver用户态文件操作入口为accel_open/dev/dri/accel节点关闭文件时amdxdna_drm_close会清理该客户端的全部硬件上下文并解除 SVA 绑定保证“进程退出即资源回收”。七、启动流程Boot Flow文档描述的引导路径amdxdna 驱动通过PSP安全加载签名的 NPU 固件并启动 NPU 微控制器驱动随后等待 BAR 0 上特殊位置中的alive 信号握手完成即视为固件就绪SoC 挂起时 NPU 被断电恢复后重新加载 NPU 固件并重复握手。这与源码结构对应PSP 交互封装在 aie_psp.cSMU功耗管理交互在 aie_smu.c电源状态机在 amdxdna_pm.cPCI 驱动的driver.pm同时注册了系统睡眠与运行时 PM 操作SYSTEM_SLEEP_PM_OPS/RUNTIME_PM_OPS覆盖文档提到的 suspend/resume 场景。固件文件由内核固件加载框架按 PCI 设备号 revision 定位源码中声明的固件路径amdxdna_pci_drv.cMODULE_FIRMWARE(amdnpu/1502_00/npu.sbin); MODULE_FIRMWARE(amdnpu/17f0_10/npu.sbin); MODULE_FIRMWARE(amdnpu/17f0_11/npu.sbin); MODULE_FIRMWARE(amdnpu/17f0_20/npu.sbin); MODULE_FIRMWARE(amdnpu/1502_00/npu_7.sbin); MODULE_FIRMWARE(amdnpu/17f0_10/npu_7.sbin); MODULE_FIRMWARE(amdnpu/17f0_11/npu_7.sbin);即amdnpu/device_id_revision/npu.sbin以及带_7后缀的变体部署环境需要把对应型号的固件文件放到lib/firmware/amdnpu/目录下缺失固件会导致 probe 失败。八、用户态组件编译器与 UMD文档明确了与 amdxdna 内核驱动配套的用户态开源组件此处仅列名称具体仓库地址见 amdnpu.rst 的 References 一节Peano基于 LLVM 的开源单核编译器面向 XDNA Array 计算 Tile项目llvm-aieIRON基于 Peano 之上的 XDNA Array 阵列编译器项目mlir-aie负责产出 overlayXRT开源运行时栈是 UMDUser Mode Driver主体负责与 amdxdna 内核驱动交互xdna-driver shimXRT 中针对 NPU 的 shim 层。即典型工具链为Peano/IRON 编译出 overlay ctrlcode → XRT/xdna shim 通过 DRM accel 接口完成上下文创建、缓冲管理与命令提交。九、DMA、错误处理与遥测DMA 操作DMA 指令编码在ctrlcode中表现为XAIE_IO_BLOCKWRITE操作码当 ERT 执行到该操作码时即在主机 DDR 与 L2 存储 Tile 之间完成数据搬运。也就是说主机 DMA 不是用户态直接发起的而是由 ERT 按 ctrlcode 编排触发。错误处理当 MERT 检测到 XDNA Array 出错时暂停该工作负载上下文的执行经特权通道向驱动发送异步消息驱动向 MERT 回传一个缓冲指针MERT 捕获故障分区绑定到出错上下文的分区的寄存器状态驱动读取该缓冲内容解码错误。这一机制依托于第五节的全局特权缓冲仅 MERT 可写驱动侧的错误消息解析集中在 aie2_error.c 与 amdxdna_error.h。遥测MERT 可上报多类遥测信息文档列举包括 L1 中断计数器、DMA 计数器、Deep Sleep 计数器等“etc.” 表示清单不封闭。遥测经由GET_INFO/GET_ARRAY类 ioctl 暴露给用户态驱动版本注释中 0.4/0.5/0.7 分别对应资源信息、遥测与功耗利用率能力。十、DRM 客户端使用统计Usage Statsamdxdna 驱动实现了 DRM client usage stats 规范用户态可通过fdinfo查看客户端内存占用。文档给出的示例输出pos: 0 flags: 0100002 mnt_id: 29 ino: 939 drm-driver: amdxdna_accel_driver drm-client-id: 3219 drm-pdev: 0000:c5:00.1 amdxdna_accel_driver-heap-alloc: 60 KiB amdxdna_accel_driver-internal-alloc: 67588 KiB amdxdna_accel_driver-external-alloc: 0 drm-total-memory: 67632 KiB drm-shared-memory: 0各键的含义可由 amdxdna_pci_drv.c 的amdxdna_show_fdinfo()实现直接读出heap-alloc客户端设备堆dev heapBO 的占用internal-alloc客户端自行创建的内部BO 总量含导入与创建的 HEAP/DEV BOexternal-alloctotal_bo_usage - internal即外部导入部分drm-total-memory/drm-shared-memoryDRM 标准统计total 同时计入 DEV BO 与 HEAP BODEV BO 存在双重计数shared 计入跨进程/跨设备共享的 BO。十一、小结与进一步阅读路径本文沿 amdnpu.rst 的脉络梳理了 AMD NPU 的完整技术图景XDNA 2D 阵列按列分区、列隔离寄存器 PASID 构成进程隔离硬件基础Resource Solver 在驱动侧决定空间/时间共享的列映射固件负责强制执行overlay 配置分区、ctrlcode 由 ERT 编排并触发 DMA64 MB 每上下文指令缓冲与全局特权缓冲分别承载用户 ctrlcode 与 MERT 错误记录PSP 安全加载签名固件完成启动握手。建议结合以下仓库位置继续深入硬件与驱动总览文档index.rst、amdnpu.rstPCI 探测、ioctl 表与 SVA/PASIDamdxdna_pci_drv.c上下文与命令缓冲amdxdna_ctx.c、amdxdna_cbuf.c与固件的 mailbox 协议amdxdna_mailbox.c、aie2_message.c、aie2_msg_priv.h资源求解器aie2_solver.c、aie2_solver.h错误处理与电源管理aie2_error.c、amdxdna_pm.c设备配置与编译选项Kconfig、Makefile。【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考