DO NOT WIPE THE WINDOWS PARTITION UNTIL YOU’VE PULLED THE FIRMWARE FROM IT.
Progress so far with the Lenovo Yoga C630
Thanks to Bamse we now have both USB-C ports working on the c630.
His branch is https://github.com/andersson/kernel/commits/wip/c630-5.7
What I’ve done so far to get it working:
This version of steps is what I use, you will likely want to skip Linus’ tree, and just use bamse as the base, unless you want to deal with merge conflicts.
git clone https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux.git pushd linux touch .scmversion git remote add bamse https://github.com/andersson/kernel
git clone https://github.com/andersson/kernel -b wip/c630-5.7 linux pushd linux touch .scmversion
git remote add robclark https://github.com/freedreno/kernel-msm git fetch --all --no-tags # I don't care about tags, and rob's tree throws some errors with the for-3.6 and for-3.7 tags git merge bamse/wip/c630-5.7 # Only if you're using Option 1 git cherry-pick f77b935 git cherry-pick a59a400 git cherry-pick eceafb9 git cherry-pick 7e95fcb git cherry-pick e5fdba1 git cherry-pick 89a4c04 git cherry-pick 3395035 git cherry-pick fa13722 git cherry-pick 86888de # On kali systems, I also apply the kali wifi injection patch wget https://gitlab.com/kalilinux/packages/linux/-/raw/kali/master/debian/patches/features/all/kali-wifi-injection.patch patch -p1 < kali-wifi-injection.patch make defconfig make menuconfig
(all kinds of personal changes that I care about - you can find my config at https://dev.gentoo.org/~steev/files/lenovo-yoga-c630-5.7.0-rc5.config)
For my Kali systems - (and because I’m cross compiling):
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc) deb-pkg
For my Gentoo systems -
make -j$(nproc) && make modules_install && make dtbs_install && make install
In the original 5.2 kernels, the dtb file was expected to be laptop.dtb, with 5.7, the new dtb file for the c630 is sdm850-lenovo-yoga-c630.dtb so make sure that if you’re using the laptop.dtb symlink, it points to the correct one!
Bootloader/Kernel Command Line:
We need some arguments passed to boot, it doesn’t matter if you hard code them in, or if you pass them via the bootloader.
pd_ignore_unused - Keep all power domains already enabled by bootloader on, even if no driver has claimed them.
clk_ignore_unused - Keep boot clocks on, even if no driver has claimed them.
efi=novamap - SetVirtualAddressMap() is not called after ExitBootServices()
An example grub setup could look something like this:
GRUB_DEFAULT=0 #GRUB_TIMEOUT_STYLE=hidden GRUB_TIMEOUT=2 GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian` GRUB_CMDLINE_LINUX_DEFAULT="efi=novamap pd_ignore_unused clk_ignore_unused" GRUB_CMDLINE_LINUX=""
Note: if you are using the patches from Rob Clark above, you do not need
clk_ignore_unused - only
efi=novamap is required.
So you could do something like this instead
GRUB_DEFAULT=0 #GRUB_TIMEOUT_STYLE=hidden GRUB_TIMEOUT=2 GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian` GRUB_CMDLINE_LINUX_DEFAULT="efi=novamap" GRUB_CMDLINE_LINUX=""
In terms of firmware, things get a wee bit funky. I’m a bit lazy, so I’ll use a script that Celliwig wrote (https://github.com/celliwig/lenovo-yoga-c630) This is all done on a c630 system, since we have to pull some signed firmware from the Windows partition(s?) - This script does require python2 as of 18 May 2020, so keep that in mind if you’re using something like Ubuntu 20.04 where python3 is the default.
git clone https://github.com/celliwig/lenovo-yoga-c630 pushd lenovo-yoga-c630/yoga_fw_extract ./yoga_fw_extract.sh popd
We’re also going to need a copy of the linux-firmware git repo (though on Gentoo, the linux-firmware package is new enough)
git clone https://kernel.googlesource.com/pub/scm/linux/kernel/git/firmware/linux-firmware.git
Now lets move some files around…
pushd /lib/firmware/qcom sudo mkdir -p LENOVO/81JL # Because I couldn't get things to work properly with symlinks... sudo cp c630/* LENOVO/81JL/ sudo cp ~/linux-firmware/qcom/sdm845/*.jsn LENOVO/81JL/ # We need the zap firmware for the GPU shader, which celliwig's script doesn't seem to pull. sudo mount $(blkid -L Windows) /mnt find /mnt/Windows -iname qcdxkmsuc850.mbn sudo cp $one_of_the_above_results LENOVO/81JL/ # Bluetooth firmware, if you want it. sudo cp ~/linux-firmware/qca/* /lib/firmware/qca/ popd
Now… we need some services, because the firmware are actually Hexagon binaries that run on a VM of the modem processor (If I understand it correctly, that is) As of 5.7, qrtr-ns is implemented in the kernel, however, because the other services depen on libqrtr.so from it, we still need to install it. qrtr-ns also detects whether you’re on > 5.7, and if so, it does nothing.
mkdir services cd services git clone https://github.com/andersson/qrtr cd qrtr make && sudo make install && sudo systemctl enable --now qrtr-ns.service # To make sure things can find libqrtr.so.1, regenerate the /etc/ld.so.cache sudo ldconfig cd .. apt install libudev-dev #on Debian based systems git clone https://github.com/andersson/rmtfs cd rmtfs make && sudo make install && sudo systemctl enable --now rmtfs.service cd .. git clone https://github.com/andersson/pd-mapper cd pd-mapper make && sudo make install && sudo systemctl enable --now pd-mapper.service cd .. git clone https://github.com/andersson/tqftpserv make && sudo make install && sudo systemctl enable --now tqftpserv.service cd ~
Slow wifi load?
Some systems, wifi may be slow to start up. This is because of a long default
timeout from the firmware loader(?) - a way around this is to
echo 1 > /sys/class/firmware/timeout.
Locally, I’ve got a (crappy) systemd service to do this, because I want it to start before the qrtr-ns service starts up.
Something along these lines:
[Unit] Description=Firmware Timeout Hack to Speedup Boot Before=qrtr-ns.service [Service] Type=oneshot ExecStart=/bin/sh -c "echo 1 > /sys/class/firmware/timeout" [Install] WantedBy=multi-user.target
I’m sure there’s a better way to do this, and it seems like
the commit in the kernel that causes the “regression”.
This isn’t the full setup, but it gets most of the steps there. I still haven’t fully looked into Grub as I’ve started off on the bionic image (and on my Kali installs, apt-mark hold grub-common grub-efi-arm64 grub-efi-arm64-bin grub2-common) so I’m not quite fully there on an installation just yet.
To get audio working, you’re going to need the ucm files as well, although there’s a bit of question about the proper place they go. People have had different results, I had to move mine into a specific directory that isn’t in the repo - if that doesn’t work, then you can try the same folder as mine, but typically you can check the dmesg output to see where it’s trying to load the files from - or like me, I just copy to both places…
git clone https://github.com/srinivas-kandagatla/alsa-ucm-conf -b wip/DB845c cd alsa-ucm-conf/ucm2 # First copy the codecs we need sudo cp -a codecs/w* /usr/share/alsa/ucm2/codecs/ # Now the actual profiles sudo cp -a Lenovo-YOGA-C63 /usr/share/alsa/ucm2/ cd /usr/share/alsa/ucm2 sudo cp -a Lenovo-YOGA-C63 Lenovo-YOGA-C630-13Q50 cd Lenovo-YOGA-C630-13Q50 mv LENOVO-81JL-LenovoYOGAC630_13Q50-LNVNB161216.conf LENOVO-81JL-LenovoYOGAC630_13Q50.conf
X doesn’t run properly currently, you will get lots of screen flickering, however Wayland based DEs/WMs work fine. I’ve personally tested Sway and Gnome.
Update: Rob Clark was able to track the issue down in mesa.
Update for mesa 19.3.x - https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5192 Update for mesa 20.0.x - https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5190 Update for Mesa 20.1.x - https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5188
Another thing to note, the reason why I’m cherry picking from robclark instead
of just merging in his wip/c630-5.7 branch, is because of commit
f82139e - you
absolutely can use it, however, you also need to use his dtbloader. I didn’t
want to but if you want to play around, he’s got prebuilt binaries at
https://people.freedesktop.org/~robclark/Shell.efi - and a readme for it can
be found at https://github.com/robclark/edk2/blob/dtbloader-chid/Readme.md