当前位置: 首页 > news >正文

Atlas300I推理卡驱动适配Linux 6.12+内核

Ascend 310 NPU 驱动适配 Linux Kernel 6.12.43 修复记录

概述

目前华为官方的提供的所有AI卡驱动都未支持高版本Linux内核(6.8以上)博主花了大量时间去研究华为驱动源码,最终功夫不负有心人成功将Atlas300I卡以及Atlas300I Pro的驱动适配到了Linux-6.12.43内核版本,按道理来讲6.8以上的版本都可以进行驱动包安装,适配工作不易请大家点个关注,在此小编谢谢大家的支持了,编译好的驱动包我也会开源,有需要的小伙伴自行获取即可。

资源获取

修复清单

1.do_exit()/complete_and_exit()kthread_complete_and_exit()

原因:Kernel 6.12 移除了do_exit()complete_and_exit()的导出符号,仅保留kthread_complete_and_exit()

修改文件

文件修改内容
driver/kernel/drv_davinci_intf_host/davinci_intf_init.c#include <linux/version.h>之后添加条件编译宏,将do_exit(0)替换为kthread_complete_and_exit(NULL, 0)
driver/kernel/drv_devmng/drv_devmng_host/ascend910/devdrv_manager.c同上
driver/kernel/dms/status/dms_osc_freq.c同上

修改方式(以davinci_intf_init.c为例):

// 在 #include <linux/version.h> 之后添加:#ifLINUX_VERSION_CODE>=KERNEL_VERSION(6,0,0)#ifndefdo_exit#definedo_exit(x)do{kthread_complete_and_exit(NULL,x);}while(0)#endif#endif

同时将源文件中的do_exit(0);调用替换为kthread_complete_and_exit(NULL, 0);


2.profile_event_register()/profile_event_unregister()移除

原因:Kernel 6.12 完全移除了profile_event_registerprofile_event_unregisterPROFILE_TASK_EXIT

修改方式一Makefile_mini全局宏替换:

# driver/kernel/Makefile_mini 中添加: ccflags-y += -Dprofile_event_register\(a,b\)=0 ccflags-y += -Dprofile_event_unregister\(a,b\)=0 ccflags-y += -DPROFILE_TASK_EXIT=0

修改方式二— 源文件级别替换(Makefile 宏对部分编译单元不生效时需要):

文件修改内容
driver/kernel/drv_devmng/drv_devmng_host/ascend910/devdrv_manager.cprofile_event_register(...)ret = 0;
driver/kernel/dbl/uda/uda_access.cprofile_event_register/unregister(...)(void)0;
driver/kernel/ts_drv_common/tsdrv_nvme/logic/logic_cq.c同上
driver/kernel/soft_fault/soft_fault.c同上
driver/kernel/dms/core/dms_init.c同上

3.pte_offset_map()→ 内联宏替换

原因:Kernel 6.12 中pte_offset_map()变为static inline函数,内部调用未导出的__pte_offset_map()外部函数。由于pte_offset_map()#include <linux/mm.h>时已展开为内联调用,在 include 之后定义__pte_offset_map宏无效,必须#undef pte_offset_map并重新定义。

修改文件(3 个devmm_dev.c):

文件
driver/kernel/svmdrv/common/devmm_dev.c
driver/kernel/svmdrv/pmaster/devmm_dev.c
driver/kernel/svmdrv/pmaster/common/devmm_dev.c

修改方式:在所有#include之后、第一个非 include 行之前添加:

#ifLINUX_VERSION_CODE>=KERNEL_VERSION(6,0,0)/* pte_offset_map() in kernel 6.12 calls unexported __pte_offset_map(); override it */#undefpte_offset_map#definepte_offset_map(pmd,addr)((pte_t*)pmd_page_vaddr(*(pmd))+pte_index(addr))#endif

注意:此修复块必须放在#ifdef CFG_FEATURE_VFIO块之外,确保所有编译路径都能生效。


4.PDE_DATA()pde_data()

原因:Kernel 5.17+ 移除了PDE_DATA()宏,替换为pde_data()内联函数。

修改方式一Makefile_mini全局宏(仅对部分模块生效,不推荐作为唯一方案):

ccflags-y += -DPDE_DATA\(inode\)=pde_data\(inode\)

修改方式二— 源文件级别替换(推荐,更可靠):

在以下 11 个文件的#include区域之后添加:

#ifndefPDE_DATA#definePDE_DATA(inode)pde_data(inode)#endif

修改文件清单

文件
driver/kernel/event_sched/comm/soft_sched/irq_sched/esched_table_proc_fs.c
driver/kernel/drv_devmng/drv_devmng_host/ascend310/drv_log.c
driver/kernel/drv_devmng/drv_devmng_host/ascend910/drv_log.c
driver/kernel/ts_drv_common/tsdrv_dev/tsdrv_id_config_dfx.c
driver/kernel/ts_drv_common/tsdrv_dev/tsdrv_ctx_dfx.c
driver/kernel/ts_drv_common/tsdrv_dev/tsdrv_event_id_dfx.c
driver/kernel/queue/common/queue_proc_fs.c
driver/kernel/svmdrv/pmaster/comm/svm_master_proc_fs.c
driver/kernel/svmdrv/pmaster/common/svm_proc_fs.c
driver/kernel/svmdrv/pmaster/svm_shmem_procfs.c
driver/kernel/svmdrv/common/svm_proc_fs.c

注意:使用#ifndef PDE_DATA而非#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,17,0),因为部分文件未包含<linux/version.h>,使用版本号检查会导致编译错误。


5.follow_pfn()follow_pfnmap_start/end()

原因:Kernel 6.12 移除了follow_pfn()导出符号,替换为follow_pfnmap_start()/follow_pfnmap_end()API。

修改文件(已在华为官方代码中修复):

文件修改内容
driver/kernel/dev_inc_open/inc/devdrv_interface.h提供兼容的内联follow_pfn()实现,内部调用follow_pfnmap_start/end
driver/kernel/dev_inc/inc/devdrv_interface.h同上

6..ko.xz解压 &__versions段剥离

原因

修改文件driver/script/run_driver_install.sh

修改内容:在driver_dkms_insmod()函数(约 line 612)中添加:

# Decompress .ko.xz files and strip __versions (needed for Intewell kernel 6.12)for__koxzin${sys_path}/*.ko.xz;do[-f"$__koxz"]||continuelog"[INFO]Decompressing${__koxz##*/}"unxz"$__koxz"2>/dev/null__ko="${__koxz%.xz}"[-f"$__ko"]&&objcopy --remove-section=__versions"$__ko"2>/dev/nulldonefor__koin${sys_path}/*.ko;do[-f"$__ko"]&&objcopy --remove-section=__versions"$__ko"2>/dev/nulldonedepmod-a>/dev/null2>&1

7. grep 警告修复

原因makeself-header.shgrep -o -E "\-\-[^ ]+"导致 grep 报错 "多余的 " 和 “unrecognized option”。

修改文件driver/script/makeself-header.sh(line 354)

修改

# 修改前:grep-o-E"\-\-[^ ]+"# 修改后:grep-o-E-e'--[^ ]*'

使用-e标志显式传递模式,避免 grep 将--[^ ]*解析为选项。


8. GCC 内置头文件路径

原因:内核编译使用-nostdinc,导致 GCC 内置头文件(stdarg.h,stdbool.h等)找不到。

修改文件driver/kernel/Makefile_mini

ccflags-y += -isystem /usr/lib/gcc/aarch64-linux-gnu/12/include ccflags-y += -isystem /usr/lib/gcc/aarch64-openEuler-linux/12/include

9. 警告抑制

原因:Kernel 6.12 头文件变化导致原有代码触发大量-Werror警告。

修改文件driver/kernel/Makefile_mini

export CUSTOM_OS_CCFLAGS := -Wno-error=missing-prototypes -Wno-undef -Wall -Werror \ -Wno-error=vla -funsigned-char -Wno-error=implicit-function-declaration \ -Wno-error=unused-variable -Wno-error=return-type

CANN 层面修复(非驱动)

10.Ascend310.ini平台配置缺失

原因:CANN 8.3.RC1 将Ascend310.ini重命名为Ascend031.ini,atc 使用--soc_version=Ascend310时找不到配置文件。

修复:创建符号链接:

cd/usr/local/Ascend/ascend-toolkit/latest/aarch64-linux/data/platform_config/ln-sfAscend031.ini Ascend310.ini# 如有其他 platform_config 目录也需处理:cd/usr/local/Ascend/ascend-toolkit/8.3.RC1/compiler/data/platform_config/ln-sfAscend031.ini Ascend310.ini

11. Python_ctypes模块缺失

原因:自定义编译的 Python 3.12 编译时未正确链接libffi-devel,导致_ctypes模块未构建。

修复:重新全量编译 Python 3.12,确保安装了libffi-develxz-devel等开发库,并设置正确的编译环境变量。


完整修改文件清单

#文件路径修复内容
1driver/kernel/Makefile_miniGCC include 路径、profile_event 宏、PDE_DATA 宏、警告抑制
2driver/kernel/drv_davinci_intf_host/davinci_intf_init.cdo_exit → kthread_complete_and_exit
3driver/kernel/drv_devmng/drv_devmng_host/ascend910/devdrv_manager.cdo_exit、profile_event 替换
4driver/kernel/dms/status/dms_osc_freq.cdo_exit → kthread_complete_and_exit
5driver/kernel/dbl/uda/uda_access.cprofile_event 替换
6driver/kernel/ts_drv_common/tsdrv_nvme/logic/logic_cq.cprofile_event 替换
7driver/kernel/soft_fault/soft_fault.cprofile_event 替换
8driver/kernel/dms/core/dms_init.cprofile_event 替换
9driver/kernel/svmdrv/common/devmm_dev.cpte_offset_map 重定义
10driver/kernel/svmdrv/pmaster/devmm_dev.cpte_offset_map 重定义
11driver/kernel/svmdrv/pmaster/common/devmm_dev.cpte_offset_map 重定义
12driver/kernel/event_sched/comm/soft_sched/irq_sched/esched_table_proc_fs.cPDE_DATA → pde_data
13driver/kernel/drv_devmng/drv_devmng_host/ascend310/drv_log.cPDE_DATA → pde_data
14driver/kernel/drv_devmng/drv_devmng_host/ascend910/drv_log.cPDE_DATA → pde_data
15driver/kernel/ts_drv_common/tsdrv_dev/tsdrv_id_config_dfx.cPDE_DATA → pde_data
16driver/kernel/ts_drv_common/tsdrv_dev/tsdrv_ctx_dfx.cPDE_DATA → pde_data
17driver/kernel/ts_drv_common/tsdrv_dev/tsdrv_event_id_dfx.cPDE_DATA → pde_data
18driver/kernel/queue/common/queue_proc_fs.cPDE_DATA → pde_data
19driver/kernel/svmdrv/pmaster/comm/svm_master_proc_fs.cPDE_DATA → pde_data
20driver/kernel/svmdrv/pmaster/common/svm_proc_fs.cPDE_DATA → pde_data
21driver/kernel/svmdrv/pmaster/svm_shmem_procfs.cPDE_DATA → pde_data
22driver/script/makeself-header.shgrep 警告修复
23driver/script/run_driver_install.sh.ko.xz 解压 & __versions 剥离

打包 .run 文件

前提条件

打包命令

cd/home/xt/Ascend_Drv_asc310p_Rebuild/Ascend_hdk_310_npu_driver_24.1.1.3 ./driver/script/makeself.sh\--header./driver/script/makeself-header.sh\--help-header ./driver/script/help.info\--pigz\--complevel4\--nomd5\--sha256\/home/xt/Ascend_Drv_asc310p_Rebuild/Ascend_hdk_310_npu_driver_24.1.1.3\/home/xt/Ascend_Drv_asc310p_Rebuild/output_rebuild/Ascend-hdk-310-npu-driver_24.1.1.3_linux-aarch64_k6.12.43.run\"ASCEND DRIVER RUN PACKAGE"\./driver/script/install.sh

输出

打包完成后,.run文件位于:

output_rebuild/Ascend-hdk-310-npu-driver_24.1.1.3_linux-aarch64_k6.12.43.run

安装与验证

# 卸载旧驱动./Ascend-hdk-310-npu-driver_24.1.1.3_linux-aarch64_k6.12.43.run--uninstall# 安装新驱动./Ascend-hdk-310-npu-driver_24.1.1.3_linux-aarch64_k6.12.43.run--full--install-for-all# 验证模块加载lsmod|grepascend# 应看到 ascend_queue、drv_devmm_host 等所有模块# 验证 ACLpython3-c"import acl; acl.init(); ret = acl.rt.set_device(0); print('set_device ret =', ret); acl.finalize()"# 预期输出: set_device ret = 0

Kernel 6.12 API 变更参考

旧 API新 API / 替代方案影响模块
do_exit()kthread_complete_and_exit()davinci_intf, devmng, dms
complete_and_exit()kthread_complete_and_exit()(未导出,同上)
profile_event_register()无替代,设为 no-opdevmng, uda, tsdrv, soft_fault, dms
profile_event_unregister()无替代,设为 no-op同上
__pte_offset_map()内联实现pmd_page_vaddr() + pte_index()svmdrv (devmm_dev)
PDE_DATA(inode)pde_data(inode)queue, svmdrv, event_sched, devmng, tsdrv
follow_pfn()follow_pfnmap_start/end()svmdrv (devmm_dev) — 已在 devdrv_interface.h 中处理

注意事项

  1. Makefile_minivs 顶层Makefile:DKMS 编译使用的是顶层Makefile(从dkms.confMAKE[0]指定),不是Makefile_mini。确保两个文件的 ccflags 保持同步。

  2. #ifndefvs#if LINUX_VERSION_CODE:在未包含<linux/version.h>的源文件中,使用#ifndef PDE_DATA#if LINUX_VERSION_CODE >= KERNEL_VERSION(...)更安全,避免LINUX_VERSION_CODE未定义导致的编译错误。

  3. objcopy --remove-section=__versions:Intewell 内核编译时未启用CONFIG_MODVERSIONS,但驱动模块中的__versions段包含 CRC 校验值,加载时校验不通过。必须剥离该段。

驱动适配结果

联系方式

资源获取

http://www.jsqmd.com/news/775113/

相关文章:

  • Transformer与NLP迁移学习:从BERT到LLM的实践指南与资源导航
  • DLNA技术解析:智能家居媒体共享的核心框架
  • ubuntu20.04修复.activate包
  • 量子计算中的自适应插值量子变换(AIQT)技术解析
  • 做海外盲盒APP选什么开发语言 稳定还适配欧美用户 太实用了
  • 如何用d3dxSkinManage轻松管理3DMigoto皮肤Mod:从混乱到有序的5个关键技巧
  • 维铂叁科普知识丨什么是去中心化自治组织(DAO)?
  • BBDown终极指南:高效下载B站视频的专业级命令行工具
  • SONOFF Zigbee Bridge Ultra网关评测与智能家居部署指南
  • 免费零投入,每年省299会员费,2026视频提取文案,这方法不看真的亏大了
  • Dodecylamine-CdSe QDs,十二胺稳定化CdSe量子点的应用方向
  • 2026年本地生活服务接单平台推荐:保洁、维修、家政、美发师傅接单App榜单
  • illustrator中的Blend混合工具
  • 机器学习在量化投资中的应用:从因子挖掘到组合优化的实战解析
  • Kafka 0.6 进阶指南:尚硅谷经典教程解读与实战避坑
  • 从零构建企业级设计系统:原子设计、React与Stitches实战
  • Guru:轻量级本地全文搜索引擎的架构解析与实战应用
  • WSL2 Ubuntu 18.04 下 NFS 挂载 rootfs 失败:现象、原因与完整修复
  • 股市新手必看:八大核心财务指标详解(附实战案例)
  • 教育科技公司利用 Taotoken 构建自适应学习推荐系统
  • Cursor AI集成OpenAPI:自动化客户端生成与云代理实践
  • 构建智能手机号归属地查询系统:从零到一的实战指南
  • 产品经理原型高效交付实战指南
  • Reor:本地AI笔记应用,构建私有知识库与RAG实践指南
  • 基于.NET MAUI与ChatGPT API的跨平台AI对话应用开发实战
  • 算法独裁反抗阵线
  • Ubuntu24.04软件更新器更新后外接HDMI显示器无信号
  • Meta分析在生态环境领域里的应用
  • 为AI助手构建本地记忆大脑:openclaw-memory-local实战指南
  • 零配置代码质量工具链实战:Biome、ESLint与Oxlint选型指南