Update: Root Cause Identified and Local Workaround Confirmed
After further auditing the source code and testing, I have identified
the structural root cause of the dropped patch and successfully compiled
a working local fix.
1. The Structural Root Cause
The issue stems from upstream changes to struct vmd in
drivers/pci/controller/vmd.c. In the working 6.14-oem kernel, the custom
Dell/Canonical patch utilizes arrays to map multiple buses: struct pci_bus
*bus[VMD_BUS_COUNT]; and u8 busn_start[VMD_BUS_COUNT];.
In the broken 6.17-oem kernel, the struct has been refactored back to
single variables: struct pci_bus *bus; and u8 busn_start;. Because of
this structural change, the Arrow Lake dual-bus logic (mapping 0xE0 and
0xE1 simultaneously via case 3) was entirely dropped during the rebase.
2. Proof of Concept (The Workaround)
To prove that the 6.14 logic is still fundamentally compatible with the new
kernel, I performed an out-of-tree build of the 6.14.0-1014 version of vmd.c
against the 6.17.0-1020 kernel headers. It compiles flawlessly with no API
errors. Injecting this resulting vmd.ko into the 6.17 initramfs fully restores
functionality, allowing both NVMe drives to initialize and the system to boot
perfectly.
3. Instructions (Temporary Fix)
If you are stranded on the 6.17 kernel with this hardware, you can fix your
local boot image using the older source code. Boot into your working 6.14
kernel and run the following:
Step A: Prepare the environment
Bash
# Install the headers for the broken kernel
sudo apt install linux-headers-6.17.0-1020-oem
# Navigate to the home directory and download the working 6.14 source
cd ~
apt-get source linux-image-unsigned-6.14.0-1014-oem
# Create the build environment and copy the source file
mkdir ~/vmd-test
cp ~/linux-oem-6.14-*/drivers/pci/controller/vmd.c ~/vmd-test/
# Move into the build environment
cd ~/vmd-test
Step B: Create the Makefile
Create a file named Makefile in the ~/vmd-test directory.
Makefile
obj-m := vmd.o
all:
make -C /usr/src/linux-headers-6.17.0-1020-oem M=$(PWD) modules
clean:
make -C /usr/src/linux-headers-6.17.0-1020-oem M=$(PWD) clean
Step C: Compile and Inject
Bash
# Compile the module
make
# Backup the broken 6.17 module
sudo mv /lib/modules/6.17.0-1020-oem/kernel/drivers/pci/controller/vmd.ko.zst
/lib/modules/6.17.0-1020-oem/kernel/drivers/pci/controller/vmd.ko.zst.broken
# Copy the custom module and compress it
sudo cp vmd.ko /lib/modules/6.17.0-1020-oem/kernel/drivers/pci/controller/
sudo zstd -T0 -q --rm
/lib/modules/6.17.0-1020-oem/kernel/drivers/pci/controller/vmd.ko
# Register the module and update the boot image
sudo depmod -a 6.17.0-1020-oem
sudo update-initramfs -u -k 6.17.0-1020-oem
Upon rebooting into 6.17, the VMD controller will correctly assign both buses,
and the root filesystem will mount successfully. I hope this helps the team
port the array logic over to the new 6.17 structure!
--
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/2152561
Title:
[Regression] VMD Arrow Lake support (Bus Offset 3) missing in linux-
oem-6.17.0-1020.20
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/linux-oem-6.17/+bug/2152561/+subscriptions
--
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs