RK3588NPU驱动版本升级至0.9.6教程
- 1、下载RK3588NPU驱动
- 2、修改NPU驱动源码
- 2.0 修改MONITOR_TPYE_DEV写错问题
- 2.1 解决缺少函数rockchip_uninit_opp_table问题
- 2.2 解决缺少函数vm_flags_set、vm_flag_clear的问题
- 2.3 内核编译成功
- 2.4 重新构建系统
- 3、注意事项
- 4、其他问题处理
1、下载RK3588NPU驱动
下载地址:https://github.com/airockchip/rknn-llm/tree/main 如下图:
npu驱动替换后,编译内核会报错,信息如下:
2、修改NPU驱动源码
2.0 修改MONITOR_TPYE_DEV写错问题
1、(如果正确就不用改了,我这里的版本原本就时正确的)修改drivers/rknpu/rknpu_devfreq.c将MONITOR_TYPE_DEV写成了MONITOR_TPYE_DEV
把
MONITOR_TPYE_DEV
改为
MONITOR_TYPE_DEV
2.1 解决缺少函数rockchip_uninit_opp_table问题
2.1.1、rockchip_uninit_opp_table函数没有,要从github对应的kernel下载进行merge,涉及文件:
- SDK/kernel/include/soc/rockchip/rockchip_opp_select.h
- SDK/kernel/drviers/soc/rockchip/rockchip_opp_select.c
2.2.1.1 SDK/kernel/include/sock/rockchip/rockchip_opp_select.h 修改如下
// 在代码
int rockchip_init_opp_table(struct device *dev,
struct rockchip_opp_info *info,
char *lkg_name, char *reg_name);
// 之后增加以下代码
void rockchip_uninit_opp_table(struct device *dev,
struct rockchip_opp_info *info);
如下图:
// 在末尾位置增加以下代码
static inline void rockchip_uninit_opp_table(struct device *dev,
struct rockchip_opp_info *info)
{
}
如下图:
2.1.1.2 SDK/kernel/drviers/soc/rockchip/rockchip_opp_select.c 修改如下:
// 在文件末尾,MODULE_DESCRIPTION("ROCKCHIP OPP Select");之前增加以下代码
void rockchip_uninit_opp_table(struct device *dev, struct rockchip_opp_info *info)
{
struct opp_table *opp_table;
if (info) {
kfree(info->opp_table);
info->opp_table = NULL;
devm_kfree(dev, info->clks);
info->clks = NULL;
devm_kfree(dev, info->volt_rm_tbl);
info->volt_rm_tbl = NULL;
}
opp_table = dev_pm_opp_get_opp_table(dev);
if (IS_ERR(opp_table))
return;
dev_pm_opp_of_remove_table(dev);
if (opp_table->prop_name)
dev_pm_opp_put_prop_name(opp_table);
if (opp_table->supported_hw)
dev_pm_opp_put_supported_hw(opp_table);
dev_pm_opp_put_opp_table(opp_table);
}
EXPORT_SYMBOL(rockchip_uninit_opp_table);
如下图:
2.2 解决缺少函数vm_flags_set、vm_flag_clear的问题
vm_flags_set,vm_flag_clear这两个函数没有,参考0.9.3的方式直接对vma->vm_flags复制,涉及文件:
- SDK/kernel/drivers/rknpu/rknpu_gem.c
2.2.1 vm_flags_set具体修改如下
参考如下方式修改:
//vm_flags_set(vma, VM_MIXEDMAP); //注释这行
vma->vm_flags |= VM_MIXEDMAP; //增加这行
有以下几个地方
- static int rknpu_gem_mmap_pages
- 938行左右
- 989行左右
2.2.2 vm_flag_clear具体修改如下
参考如下方式修改:
//vm_flags_clear(vma, VM_PFNMAP); //注释这行
vma->vm_flags &= ~VM_PFNMAP; //增加这行
- vm_flag_clear只出现了1次,在991行左右
2.3 内核编译成功
sudo ./build.sh kernel
此时再次编译内核就成功了!
2.4 重新构建系统
重新构建系统
sudo ./build.sh
重新烧写系统后,查看rknpu驱动版本
cat /sys/kernel/debug/rknpu/version
如下图:
3、注意事项
转换rkllm内存至少需要16G,从https://huggingface.co/Qwen/Qwen-1_8B-Chat下载所有文件
4、其他问题处理
1、执行文件出错时,加大文件打开数量限制
ulimit -HSn 102400
运行
./llm_demo qwen.rkllm