cix p1芯片OpenHarmony社区内核版本从6.6.89升级到6.6.101

笔者在将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即可。