aboutsummaryrefslogtreecommitdiffci
diff refs
from: back
to: back
| flip
diff options
context:
space:
mode:
-rw-r--r--Jenkinsfile52
-rw-r--r--README.md5
-rw-r--r--config/base-aarch64.config23
-rw-r--r--config/foreign-socs.config68
-rw-r--r--kernel-surface.spec34
-rwxr-xr-xmake-sources.sh4
-rw-r--r--patches/camera/0027-media-i2c-ov13858-fix-bayer-order-when-mirrored.patch71
7 files changed, 66 insertions, 191 deletions
diff --git a/Jenkinsfile b/Jenkinsfile
index 1ab3e47..63e7c34 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -118,31 +118,22 @@ spec:
rpmdev-setuptree
- # The published file names are whatever the spec
+ # The published file name is whatever the spec
# resolves to under the tag's versions, so the two
- # cannot drift. Note the plural: kernel-surface-dtb
- # is a separate package because the main one is
- # installonly and cannot own a path that carries no
- # kernel version. Publishing only the first would
- # leave the kernel unresolvable.
- prefix="s3://${RPM_BUCKET}/fedora/${fedora_version}/aarch64"
- rpm_files=$(rpmspec -q \\
+ # cannot drift. A kernel build is expensive; if this
+ # exact NEVRA is already in the bucket, skip
+ # straight to the metadata.
+ rpm_file=$(rpmspec -q \\
--define "upstream_ver ${UPSTREAM_VER}" \\
--define "patchset_ver ${PATCHSET_VER}" \\
--queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}.rpm\\n' \\
- kernel-surface.spec)
+ kernel-surface.spec | head -n1)
+ dest="s3://${RPM_BUCKET}/fedora/${fedora_version}/aarch64/${rpm_file}"
- # A kernel build is expensive; skip it only when
- # every one of those is already in the bucket.
- skip_build=true
- for rpm_name in ${rpm_files}; do
- if ! aws s3 ls --endpoint-url "${B2_ENDPOINT}" \\
- "${prefix}/${rpm_name}"; then
- skip_build=false
- fi
- done
- if [ "${skip_build}" = true ]; then
- echo "${TAG_NAME} is already published in full, skipping build"
+ skip_build=false
+ if aws s3 ls --endpoint-url "${B2_ENDPOINT}" "${dest}"; then
+ echo "${rpm_file} already published, skipping build"
+ skip_build=true
fi
if [ "${skip_build}" = false ]; then
@@ -155,34 +146,29 @@ spec:
--define '_smp_mflags -j4' \\
kernel-surface.spec
- # kernel-surface-dtb is noarch, so it lands
- # in RPMS/noarch rather than RPMS/aarch64; ask
- # where each one actually is.
- for rpm_name in ${rpm_files}; do
- built=$(find "${HOME}/rpmbuild/RPMS" -type f \\
- -name "${rpm_name}" -print -quit)
- test -n "${built}"
+ built="${HOME}/rpmbuild/RPMS/aarch64/${rpm_file}"
+ test -f "${built}"
- aws s3 cp --endpoint-url "${B2_ENDPOINT}" \\
- "${built}" "${prefix}/${rpm_name}"
- done
+ aws s3 cp --endpoint-url "${B2_ENDPOINT}" \\
+ "${built}" "${dest}"
fi
+ repo_url="s3://${RPM_BUCKET}/fedora/${fedora_version}/aarch64"
repo="${WORKSPACE}/repo"
mkdir -p "${repo}"
aws s3 sync --endpoint-url "${B2_ENDPOINT}" \\
--exclude '*' --include '*.rpm' \\
- "${prefix}/" "${repo}/"
+ "${repo_url}/" "${repo}/"
createrepo_c --update "${repo}"
aws s3 sync --endpoint-url "${B2_ENDPOINT}" \\
--exclude 'repomd.xml*' \\
- "${repo}/repodata/" "${prefix}/repodata/"
+ "${repo}/repodata/" "${repo_url}/repodata/"
aws s3 cp --endpoint-url "${B2_ENDPOINT}" \\
"${repo}/repodata/repomd.xml" \\
- "${prefix}/repodata/repomd.xml"
+ "${repo_url}/repodata/repomd.xml"
# Served next to the repository so that consumers
# can `dnf config-manager --add-repo` the URL.
diff --git a/README.md b/README.md
index bb8fcbd..9867efa 100644
--- a/README.md
+++ b/README.md
@@ -51,7 +51,7 @@ rpm2archive -n - < kernel-core-*.aarch64.rpm |
If the extraction comes up empty, `rpm -qlp kernel-core-*.aarch64.rpm | grep
config` says whether the package still carries the file at all.
-Four fragments are merged on top with `scripts/kconfig/merge_config.sh`:
+Three fragments are merged on top with `scripts/kconfig/merge_config.sh`:
* `config/surface.config` – the drivers the patch set enables (SAM stack and
its new RTC, CAMSS and the CSI-2 D-PHY, fastrpc, ath12k, AudioReach).
@@ -59,9 +59,6 @@ Four fragments are merged on top with `scripts/kconfig/merge_config.sh`:
and dm-snapshot/overlayfs built in for `dracut`'s `dmsquash-live`, the EFI
stub because GRUB's aarch64 `linux` command loads the kernel as an EFI
application, and xz module compression.
-* `config/foreign-socs.config` – the ARM64 platforms this machine is not.
- Fedora's config enables every platform it supports because a distribution
- kernel has to boot on all of them; this one boots on `qcom,x1p42100` alone.
* `config/no-debug-info.config` – DWARF and BTF off. The package produces no
`-debuginfo` subpackage (`%global debug_package %{nil}`) and strips modules
at install time, so the DWARF was compiled only to be discarded, and it is
diff --git a/config/base-aarch64.config b/config/base-aarch64.config
index ed863d0..8ccb3a9 100644
--- a/config/base-aarch64.config
+++ b/config/base-aarch64.config
@@ -1,11 +1,10 @@
# Fedora's own aarch64 kernel configuration, used as the starting point for
# this package. Taken verbatim from the config shipped inside
-# kernel-core-7.2.4-300.fc45.aarch64.rpm:
+# kernel-core-7.2.0-61.fc45.aarch64.rpm:
#
# dnf download kernel-core --arch aarch64
-# rpm2archive -n - < kernel-core-*.aarch64.rpm |
-# tar -xO --wildcards '*/modules/*/config' |
-# wl-copy
+# rpm2cpio kernel-core-*.aarch64.rpm |
+# cpio -idm './usr/lib/modules/*/config'
#
# It is vendored rather than downloaded so the build has no dependency on a
# third-party host, and so the base config is reviewable in a diff when it is
@@ -13,11 +12,11 @@
# top of it in %prep; do not edit this file by hand.
#
# Automatically generated file; DO NOT EDIT.
-# Linux/arm64 7.2.4-300.fc45.aarch64 Kernel Configuration
+# Linux/arm64 7.2.0-61.fc45.aarch64 Kernel Configuration
#
-CONFIG_CC_VERSION_TEXT="gcc (GCC) 16.2.1 20260819 (Red Hat 16.2.1-2)"
+CONFIG_CC_VERSION_TEXT="gcc (GCC) 16.1.1 20260703 (Red Hat 16.1.1-4)"
CONFIG_CC_IS_GCC=y
-CONFIG_GCC_VERSION=160201
+CONFIG_GCC_VERSION=160101
CONFIG_CLANG_VERSION=0
CONFIG_AS_IS_GNU=y
CONFIG_AS_VERSION=20285426
@@ -57,7 +56,7 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
CONFIG_UAPI_HEADER_TEST=y
CONFIG_LOCALVERSION=""
# CONFIG_LOCALVERSION_AUTO is not set
-CONFIG_BUILD_SALT="7.2.4-300.fc45.aarch64"
+CONFIG_BUILD_SALT="7.2.0-61.fc45.aarch64"
CONFIG_HAVE_KERNEL_GZIP=y
CONFIG_HAVE_KERNEL_ZSTD=y
# CONFIG_KERNEL_GZIP is not set
@@ -13230,9 +13229,11 @@ CONFIG_CRYPTO_DEV_SUN4I_SS=m
CONFIG_CRYPTO_DEV_SUN8I_CE=m
# CONFIG_CRYPTO_DEV_SUN8I_CE_DEBUG is not set
CONFIG_CRYPTO_DEV_SUN8I_CE_HASH=y
+CONFIG_CRYPTO_DEV_SUN8I_CE_PRNG=y
CONFIG_CRYPTO_DEV_SUN8I_CE_TRNG=y
CONFIG_CRYPTO_DEV_SUN8I_SS=m
# CONFIG_CRYPTO_DEV_SUN8I_SS_DEBUG is not set
+CONFIG_CRYPTO_DEV_SUN8I_SS_PRNG=y
CONFIG_CRYPTO_DEV_SUN8I_SS_HASH=y
CONFIG_CRYPTO_DEV_FSL_CAAM_COMMON=m
CONFIG_CRYPTO_DEV_FSL_CAAM_CRYPTO_API_DESC=m
@@ -14082,3 +14083,9 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
CONFIG_IO_URING_ZCRX=y
CONFIG_IO_URING_BPF=y
CONFIG_IO_URING_BPF_OPS=y
+
+#
+# Red Hat options
+#
+# CONFIG_RHEL_DIFFERENCES is not set
+# end of Red Hat options
diff --git a/config/foreign-socs.config b/config/foreign-socs.config
deleted file mode 100644
index 5926d06..0000000
--- a/config/foreign-socs.config
+++ /dev/null
@@ -1,68 +0,0 @@
-# Config fragment turning off the ARM64 platforms this machine is not.
-#
-# Two platforms are deliberately kept:
-#
-# ARCH_QCOM what this machine is.
-# ARCH_VEXPRESS cheap, and it is the ARM reference/model platform that pulls
-# in the AMBA PrimeCell parts a QEMU `virt` guest expects,
-# which is how an image built from this kernel can be smoke
-# tested without the hardware in hand.
-
-# Allwinner
-# CONFIG_ARCH_SUNXI is not set
-
-# Apple M-series
-# CONFIG_ARCH_APPLE is not set
-
-# Broadcom, including Raspberry Pi
-# CONFIG_ARCH_BCM is not set
-# CONFIG_ARCH_BCM2835 is not set
-
-# Black Sesame
-# CONFIG_ARCH_BST is not set
-
-# CIX
-# CONFIG_ARCH_CIX is not set
-
-# Texas Instruments K3
-# CONFIG_ARCH_K3 is not set
-
-# HiSilicon
-# CONFIG_ARCH_HISI is not set
-
-# Amlogic
-# CONFIG_ARCH_MESON is not set
-
-# Marvell EBU
-# CONFIG_ARCH_MVEBU is not set
-
-# NXP: i.MX, Layerscape and S32
-# CONFIG_ARCH_NXP is not set
-# CONFIG_ARCH_LAYERSCAPE is not set
-# CONFIG_ARCH_MXC is not set
-# CONFIG_ARCH_S32 is not set
-
-# Renesas
-# CONFIG_ARCH_RENESAS is not set
-
-# Rockchip
-# CONFIG_ARCH_ROCKCHIP is not set
-
-# AMD Seattle
-# CONFIG_ARCH_SEATTLE is not set
-
-# Socionext SynQuacer
-# CONFIG_ARCH_SYNQUACER is not set
-
-# NVIDIA Tegra
-# CONFIG_ARCH_TEGRA is not set
-
-# Cavium ThunderX and ThunderX2 servers
-# CONFIG_ARCH_THUNDER is not set
-# CONFIG_ARCH_THUNDER2 is not set
-
-# AppliedMicro X-Gene
-# CONFIG_ARCH_XGENE is not set
-
-# Xilinx ZynqMP
-# CONFIG_ARCH_ZYNQMP is not set
diff --git a/kernel-surface.spec b/kernel-surface.spec
index ee6e132..e238be7 100644
--- a/kernel-surface.spec
+++ b/kernel-surface.spec
@@ -12,12 +12,12 @@
# passes them in with --define, which takes precedence -- so keep the plain
# `%%global <name> <value>` shape, which make-sources.sh reads with awk.
%if %{undefined upstream_ver}
-%global upstream_ver 7.2.4
+%global upstream_ver 7.2.3
%endif
# Bumped whenever the patch tarball changes without the upstream version moving.
%if %{undefined patchset_ver}
-%global patchset_ver 1
+%global patchset_ver 2
%endif
# rpm gives - to the version-release separator, so it cannot appear in Version
@@ -56,7 +56,6 @@ Source2: base-aarch64.config
Source3: surface.config
Source4: live-image.config
Source5: no-debug-info.config
-Source6: foreign-socs.config
BuildRequires: bc
BuildRequires: binutils
@@ -171,7 +170,7 @@ CONFIG_BUILD_SALT="%{kverrel}"
EOF
ARCH=arm64 scripts/kconfig/merge_config.sh -m -O . \
- .config .release.config %{SOURCE3} %{SOURCE4} %{SOURCE5} %{SOURCE6}
+ .config .release.config %{SOURCE3} %{SOURCE4} %{SOURCE5}
make ARCH=arm64 olddefconfig
# merge_config.sh is only advisory about symbols it could not set, so check the
@@ -193,7 +192,6 @@ test "${kernelrelease}" = "%{kverrel}" || {
}
%build
-export KCFLAGS="-mcpu=oryon-1+nopauth"
%make_build ARCH=arm64 Image modules dtbs
%install
@@ -219,7 +217,7 @@ install -Dm644 System.map \
install -Dm644 .config \
%{buildroot}/usr/lib/modules/%{kverrel}/config
install -Dm644 arch/arm64/boot/dts/qcom/x1p42100-microsoft-sp12in.dtb \
- %{buildroot}/usr/lib/surface-dtb/%{kverrel}/x1p42100-microsoft-sp12in.dtb
+ %{buildroot}/usr/lib/surface-dtb/x1p42100-microsoft-sp12in.dtb
%post
/usr/sbin/depmod -a %{kverrel} || :
@@ -241,34 +239,16 @@ fi
%files
%license COPYING
/usr/lib/modules/%{kverrel}/
-/usr/lib/surface-dtb/%{kverrel}/
+/usr/lib/surface-dtb/x1p42100-microsoft-sp12in.dtb
%ghost %attr(0644,root,root) /boot/config-%{kverrel}
%ghost %attr(0644,root,root) /boot/initramfs-%{kverrel}.img
%ghost %attr(0600,root,root) /boot/System.map-%{kverrel}
%ghost %attr(0644,root,root) /boot/vmlinuz-%{kverrel}
%changelog
-* Wed Sep 09 2026 Saya Andy 7.2.4-2
-- Compile kernel specifically for Oryon v1 instruction set (Snapdragon X1 cpu)
-
-* Tue Sep 08 2026 Saya Andy 7.2.4-1
-- Update Linux kernel from 7.2.3 to 7.2.4
-
-* Mon Sep 07 2026 Saya Andy 7.2.3-4
-- Turn off all the ARM64 platform kernel modules besides qcom and vexpress
- (used in qemu)
-- Fix Bayer order in rear camera resulting in color space shift
-
-* Mon Sep 07 2026 Saya Andy 7.2.3-3
-- Key the /usr/lib/surface-dtb copy of the device tree by kernel version. This
- package is installonly, so an unqualified path there conflicts between two
- installed releases as soon as the device tree they build differs.
-
* Sun Sep 06 2026 Saya Andy 7.2.3-2
-- Local camera patch: report the right bayer order when mirrored (fixes the
- black-green monochrome output issue)
-- Local surface patch: point iris at the OEM video firmware (fixes error -22
- for video encoding/decoding)
+- Local camera patch: report the right bayer order when mirrored (fixes the black-green monochrome output issue)
+- Local surface patch: point iris at the OEM video firmware (fixes error -22 for video encoding/decoding)
* Sun Sep 06 2026 Saya Andy 7.2.3-1
- Initial package: vanilla 7.2.3 with the overlay's Surface Pro 12" patch set
diff --git a/make-sources.sh b/make-sources.sh
index 5c11ee2..7271bf8 100755
--- a/make-sources.sh
+++ b/make-sources.sh
@@ -139,10 +139,10 @@ echo "${tarball} (${index} directories, ${total} patches)"
#--------------------------------------
# Base config and fragments
#--------------------------------------
-for cfg in base-aarch64 surface live-image no-debug-info foreign-socs; do
+for cfg in base-aarch64 surface live-image no-debug-info; do
cp "${script_dir}/config/${cfg}.config" "${output_dir}/${cfg}.config"
done
-echo "${output_dir}/{base-aarch64,surface,live-image,no-debug-info,foreign-socs}.config"
+echo "${output_dir}/{base-aarch64,surface,live-image,no-debug-info}.config"
if [[ ${skip_download} == true ]]; then
exit 0
diff --git a/patches/camera/0027-media-i2c-ov13858-fix-bayer-order-when-mirrored.patch b/patches/camera/0027-media-i2c-ov13858-fix-bayer-order-when-mirrored.patch
index d465f8d..06b8495 100644
--- a/patches/camera/0027-media-i2c-ov13858-fix-bayer-order-when-mirrored.patch
+++ b/patches/camera/0027-media-i2c-ov13858-fix-bayer-order-when-mirrored.patch
@@ -1,53 +1,26 @@
-media: i2c: ov13858: report the right bayer order
+media: i2c: ov13858: report the right bayer order when mirrored
-The driver advertises MEDIA_BUS_FMT_SGRBG10_1X10 unconditionally, but that is
-not what the sensor delivers in any flip state on the Surface Pro 12in. The
-horizontal mirror moves the Bayer phase by one column, and the native order is
-GBRG rather than GRBG, so the two correct codes are GBRG unmirrored and BGGR
-mirrored.
+The driver always advertises MEDIA_BUS_FMT_SGRBG10_1X10, but the horizontal
+mirror moves the Bayer phase by one column, so the sensor actually delivers
+RGGB while HFLIP is set. The Surface Pro 12in has the rear ov13858 mounted
+upside down (rotation = <180> in DT), so both flips end up enabled and every
+frame is debayered with the wrong pattern: the two greens land in the red and
+blue output channels and the picture comes out desaturated, close to
+monochrome.
-The rear ov13858 is mounted upside down (rotation = <180> in DT), so userspace
-enables both flips to compensate and every frame is then debayered as RGGB
-while the sensor emits BGGR. Red and blue are exchanged: an orange object comes
-out cyan, warm wood comes out blue, while neutrals are unaffected, which is
-what makes it easy to mistake for a white balance problem.
+Measured on a Surface Pro 12in by capturing raw frames off the CAMSS RDI node
+and comparing the mean absolute difference of the two diagonal pairs of each
+2x2 quad (the two green samples correlate far better than red against blue):
-Two measurements on a Surface Pro 12in, from raw frames captured off the CAMSS
-RDI video node. The first locates the green pair by comparing the mean absolute
-difference of the diagonal against the antidiagonal samples of each 2x2 quad,
-the two greens correlating far better than red against blue:
-
- hflip=0 vflip=0 diagonal 8.65 antidiagonal 56.82 -> greens diagonal
- hflip=1 vflip=0 diagonal 56.25 antidiagonal 8.34 -> greens antidiagonal
- hflip=0 vflip=1 diagonal 13.21 antidiagonal 55.94 -> greens diagonal
- hflip=1 vflip=1 diagonal 56.04 antidiagonal 13.16 -> greens antidiagonal
+ hflip=0 vflip=0 diagonal 4.29 antidiagonal 6.84 -> greens diagonal
+ hflip=1 vflip=0 diagonal 7.03 antidiagonal 4.31 -> greens antidiagonal
+ hflip=0 vflip=1 diagonal 4.35 antidiagonal 6.84 -> greens diagonal
+ hflip=1 vflip=1 diagonal 6.93 antidiagonal 4.34 -> greens antidiagonal
So only the horizontal mirror moves the phase; the ISP Y window offset written
-for VFLIP compensates the vertical one.
-
-That test cannot tell red from blue, because GBRG and GRBG share a green
-diagonal just as BGGR and RGGB share a green antidiagonal. Resolving the
-remaining ambiguity needs colour: a scene of objects with known colour was
-captured in all four states, and the red channel identified as the one whose
-ratio to blue matches the scene. The rejected assignment is the reciprocal, so
-the margin is large:
-
- hflip=0 vflip=0 R/B 1.651 (reciprocal 0.606) -> GBRG
- hflip=0 vflip=1 R/B 1.622 (reciprocal 0.616) -> GBRG
- hflip=1 vflip=0 R/B 1.651 (reciprocal 0.606) -> BGGR
- hflip=1 vflip=1 R/B 1.625 (reciprocal 0.615) -> BGGR
-
-Derive the media bus code from HFLIP and tag the control with
-V4L2_CTRL_FLAG_MODIFY_LAYOUT so userspace knows to renegotiate the format after
-toggling it.
-
-The native order disagreeing with upstream is suspicious in itself. The removal
-of the per-mode {0x3811, 0x04} and {0x3813, 0x05} ISP window offsets in
-"media: i2c: ov13858: add rotate control support", which now writes 1 or 2 into
-those registers from the flip handlers, changes the X parity, and that patch
-also sets BIT(3) of ROTATE_CONTROL when HFLIP is clear while VFLIP sets BIT(4)
-when set. Whether the phase should instead be corrected there is left alone
-here: this patch only reports what the sensor is measured to emit.
+for VFLIP compensates the vertical one. Derive the media bus code from HFLIP
+and tag the control with V4L2_CTRL_FLAG_MODIFY_LAYOUT so userspace knows to
+renegotiate the format after toggling it.
--- a/drivers/media/i2c/ov13858.c
+++ b/drivers/media/i2c/ov13858.c
@@ -78,14 +51,14 @@ here: this patch only reports what the sensor is measured to emit.
-static void ov13858_update_pad_format(const struct ov13858_mode *mode,
+/*
-+ * Mirroring shifts the Bayer phase by one column, so the native GBRG order
-+ * becomes BGGR. The vertical flip is compensated by the ISP Y window offset
++ * Mirroring shifts the Bayer phase by one column, so the native GRBG order
++ * becomes RGGB. The vertical flip is compensated by the ISP Y window offset
+ * and leaves the order alone.
+ */
+static u32 ov13858_get_format_code(struct ov13858 *ov13858)
+{
-+ return ov13858->hflip->val ? MEDIA_BUS_FMT_SBGGR10_1X10
-+ : MEDIA_BUS_FMT_SGBRG10_1X10;
++ return ov13858->hflip->val ? MEDIA_BUS_FMT_SRGGB10_1X10
++ : MEDIA_BUS_FMT_SGRBG10_1X10;
+}
+
+static void ov13858_update_pad_format(struct ov13858 *ov13858,