笔者在将cix p1 芯片相关驱动植到OpenHarmony社区内核6.6.89之后,进行了内核小版本的升级,6.6.89升级到社区目前最新的6.6.101(本文发布时最新是6.6.101)。本文分享移植步骤、遇到的问题和解决思路。
开源地址:https://gitee.com/cix_oh/cix_p1_oh/tree/6.0/

往期文档回顾:
此芯p1开发板使用OpenHarmony时llama.cpp不同优化速度对比(GPU vs CPU)
以此芯p1芯片为例研究OpenHarmony上GPU (Vulkan) 加速在深度学习推理中的价值
开源!移植此芯p1芯片驱动到OpenHarmony社区内核上
移植步骤
1.首先获取OpenHarmony社区6.6.101内核。笔者选择6.0r发布时候的6.6.101内核
javascript
rm -rf kernel/linux/linux-6.6
git clone -b OpenHarmony-v6.0-Release --depth=1 https://gitcode.com/openharmony/kernel_linux_6.6.git kernel/linux/linux-6.6
2.将6.6.89内核的cix芯片驱动补丁cix.patch打入获取的6.6.101内核。打入后一共会出现两种情况
- 第一种是有些修改已经在6.6.101有了,在cix.patch中删除(注意使用notepad++修改)
- 第二种是有些补丁打不上,需要手动合入做成补丁,包含以下文件(有冲突的代码要特别注意相关文件的代码变更)
- drivers/cpufreq/scmi-cpufreq.c
- drivers/firmware/arm_sdei.c
- drivers/gpu/drm/scheduler/sched_entity.c
- drivers/mailbox/mailbox.c
- drivers/pci/controller/cadence/pcie-cadence-host.c
- drivers/usb/cdns3/cdnsp-ep0.c
- drivers/usb/cdns3/core.h
3.修复冲突文件,保证6.6.101内核能编译通过

遇到的问题和解决办法
芯片初始化成功(没有painc),进入到oh init进程,硬盘设备初始化,导致读不到分区表,最后oh分区没有挂载。相关内核日志

对比6.6.89正常启动日志发现正常m.2硬盘会进行BAR分配。
javascript
[ 7.981492] [pid:11,cpu1,kworker/u24:0]pci 0000:00:00.0: BAR 14: assigned [mem 0x30300000-0x303fffff]
[ 7.981494] [pid:11,cpu1,kworker/u24:0]pci 0000:00:00.0: BAR 13: assigned [io 0x300000-0x300fff]
[ 7.981496] [pid:11,cpu1,kworker/u24:0]pci 0000:01:00.0: BAR 2: assigned [mem 0x30300000-0x3030ffff 64bit]
[ 7.981508] [pid:11,cpu1,kworker/u24:0]pci 0000:01:00.0: BAR 4: assigned [mem 0x30310000-0x30313fff 64bit]
[ 7.981518] [pid:11,cpu1,kworker/u24:0]pci 0000:01:00.0: BAR 0: assigned [io 0x300000-0x3000ff]
[ 7.981522] [pid:11,cpu1,kworker/u24:0]pci 0000:00:00.0: PCI bridge to [bus 01-2f]
[ 7.981525] [pid:11,cpu1,kworker/u24:0]pci 0000:00:00.0: bridge window [io 0x300000-0x300fff]
而6.6.101内核没有,笔者联想到drivers/pci/controller/cadence/pcie-cadence-host.c这个冲突文件中有bridge window的处理。对比cix 6.6.89和6.6.101的drivers/pci/controller/cadence/pcie-cadence-host.c发现cdns_pcie_host_setup函数有变化

于是全部复用cix 6.6.89/drivers/pci/controller/cadence/pcie-cadence-host.c中cdns_pcie_host_setup函数对返回值的处理。重新制作相关补丁
6.6.101部分函数名称变化,导致内核编译失败
drivers/soc/cix/cix_dst/dst_sdei_exceptions.c中sdei_init函数找不到实现,由于6.6.101内核中将sdei_init升级成了acpi_sdei_init。sdei_init替换成acpi_sdei_init即可。