Upgrade kernel aports

This article is a step-by-step guide for upgrading kernel aports in postmarketOS, where we have postmarketOS specific patches on top of the package. linux-postmarketos-allwinner is used as example.
=== Clone the repository ===
Clone the Linux source (if you don't have it already) and add the source of the kernel you are about to update as remote repository.
$ git clone https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git linux
$ cd linux
$ git remote add megi https://github.com/megous/linux.git
=== Fetch new patches ===
$ git fetch megi
=== Find the new upstream version ===
Either find the branch or tag scheme where the new version to package can be found by looking at the APKBUILD. In case of megi's kernel, we have tags and can list them with:
$ git tag | grep orange-pi
orange-pi-2020-10-19
orange-pi-5.10-20201102-0305
orange-pi-5.9-20201019-1553
orange-pi-5.9-20201031-1727
orange-pi-5.9-20201101-2057
The new tag needs to be inserted into the APKBUILD. If the kernel doesn't have tags, find the latest commit of the relevant branch with git log BRANCHNAME.
=== Checkout the new version ===
Checkout a branch called postmarketos-upgrade and reset it to the new upstream tag or branch:
$ git checkout -b postmarketos-upgrade
Switched to a new branch 'postmarketos-upgrade'
$ git reset --hard orange-pi-5.9-20201101-2057
Updating files: 100% (1234/1234), done.
HEAD is now at 8504203b708b usb: musb: Fix runtime PM race in musb_queue_resume_work
=== Apply existing patches ===
Apply the patches from the package to the newer Linux tree
$ git am $(pmbootstrap -q config work)/cache_git/pmaports/device/main/linux-postmarketos-allwinner/*.patch
Applying: dts: add dontbeevil (pinephone devkit)
==== Patch doesn't apply ====
If a patch does not apply, it looks like this:
$ git am /tmp/p/0010*.patch
Applying: usb: musb: avoid the hang in musb_pm_runtime_check_session
error: patch failed: drivers/usb/musb/musb_core.c:2005
error: drivers/usb/musb/musb_core.c: patch does not apply
Patch failed at 0001 usb: musb: avoid the hang in musb_pm_runtime_check_session
hint: Use 'git am --show-current-patch' to see the failed patch
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".
Use git am --show-current-patch to look at the patch and use git log or git log -p to verify if it was already applied to the source tree. In that case, you can skip the patch (git am --skip).
=== Update the patch files ===
In the linux source tree:
$ git checkout orange-pi-5.9-20201101-2057
$ for patch in ~/path-to-the-aport/*.patch; do git am "$patch"; done
$ rm -r /tmp/p
$ git format-patch orange-pi-5.9-20201101-2057 -N -o /tmp/p
/tmp/p/0001-dts-add-dontbeevil-pinephone-devkit.patch
/tmp/p/0002-dts-add-pinetab-dev-old-display-panel.patch
/tmp/p/0003-Disable-8723cs-power-saving.patch
/tmp/p/0004-media-gc2145-Added-BGGR-bayer-mode.patch
/tmp/p/0005-dts-pinephone-Disable-flash-led-in-OV5640-node.patch
/tmp/p/0006-dts-pinetab-add-missing-bma223-ohci1.patch
/tmp/p/0007-dts-pinetab-make-audio-routing-consistent-with-pinep.patch
/tmp/p/0008-arm64-dts-allwinner-Add-bluetooth-node-to-the-PineTa.patch
/tmp/p/0009-dts-pinephone-remove-bt-firmware-suffix.patch
In the pmaport dir:
$ rm *.patch
$ cp /tmp/p/*.patch .
$ ls -1 *.patch
0001-dts-add-dontbeevil-pinephone-devkit.patch
0002-dts-add-pinetab-dev-old-display-panel.patch
0003-Disable-8723cs-power-saving.patch
0004-media-gc2145-Added-BGGR-bayer-mode.patch
0005-dts-pinephone-Disable-flash-led-in-OV5640-node.patch
0006-dts-pinetab-add-missing-bma223-ohci1.patch
0007-dts-pinetab-make-audio-routing-consistent-with-pinep.patch
0008-arm64-dts-allwinner-Add-bluetooth-node-to-the-PineTa.patch
0009-dts-pinephone-remove-bt-firmware-suffix.patch
Update the source= in the APKBUILD and run pmbootstrap checksum.
=== Update the kernel config file ===
Temporarily add the following in the prepare() section of the APKBUILD:
prepare() {
...
 make ARCH="$_carch" CC="${CC:-gcc}" \
 defconfig KBUILD_DEFCONFIG=${device}_defconfig
 exit 1
}
Then generate the default config file using pmbootstrap build linux-$vendor-$device. This will fail allowing you to copy the default config file:
$ cp <chroot_native/home/pmos/build/src/linux*/.config> \
 device/main/linux-$vendor-$device/config-$vendor-$device.$arch
After, remove the added code from the APKBUILD. Finally, much like you'd do when porting to a new device, edit and check the kernel config until it passes:
$ pmbootstrap kconfig edit linux-$vendor-$device
$ pmbootstrap kconfig check linux-$vendor-$device
Category:Technical Reference