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

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.

Option 1:

git clone
pushd linux
touch .scmversion
git remote add bamse


git clone -b wip/c630-5.7 linux
pushd linux
touch .scmversion


git remote add robclark
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
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

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

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_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="efi=novamap pd_ignore_unused clk_ignore_unused"

Note: if you are using the patches from Rob Clark above, you do not need pd_ignore_unused or clk_ignore_unused - only efi=novamap is required.

So you could do something like this instead

GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`


In terms of firmware, things get a wee bit funky. I’m a bit lazy, so I’ll use a script that Celliwig wrote ( 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
pushd lenovo-yoga-c630/yoga_fw_extract

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

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/


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 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
cd qrtr
make && sudo make install && sudo systemctl enable --now qrtr-ns.service
# To make sure things can find, regenerate the /etc/
sudo ldconfig
cd ..
sudo apt install libudev-dev #on Debian based systems
git clone
cd rmtfs
make && sudo make install && sudo systemctl enable --now rmtfs.service
cd ..
git clone
cd pd-mapper
make && sudo make install && sudo systemctl enable --now pd-mapper.service
cd ..
git clone
make && sudo make install && sudo systemctl enable --now tqftpserv.service
cd ~

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 -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
sudo mv LENOVO-81JL-LenovoYOGAC630_13Q50-LNVNB161216.conf LENOVO-81JL-LenovoYOGAC630_13Q50.conf
sudo ln -s LENOVO-81JL-LenovoYOGAC630_13Q50.conf /usr/share/alsa/ucm2/Lenovo-YOGA-C630-13Q50/Lenovo-YOGA-C630-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 - Update for mesa 20.0.x - Update for Mesa 20.1.x -

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 and - and a readme for it can be found at