From ef935a758466669bb5197ce266824b30532ea7b9 Mon Sep 17 00:00:00 2001 From: Hendra Manudinata Date: Sat, 16 May 2026 15:58:48 +0700 Subject: [PATCH] linux-samsung-j4lte: Update patches for recent boot fixes Recent test shows that j4lte requires these patches to be able to boot into postmarketOS, as well as some additional features to make it a little bit more usable: 1. Disabling direct I/O patch This is required to fix kernel panic during e2fsck performed by initramfs. The root cause is still unknown and thus needs further investigation. But for now, while we're in downstream kernel, temporarily add this hacky patch. 2. Initialize framebuffer later This fixes kernel panics when `CONFIG_FRAMEBUFFER_CONSOLE` is enabled, caused by unitialized pointers & mutex. This could be applied on other older Samsung devices that use similar DECON. Signed-off-by: Hendra Manudinata Part-of: --- ...HACK-decon_7570-Swap-red-blue-offset.patch | 35 ------------ ...ng-scsc-Fix-FW_LOCATION_AUTO-symbol.patch} | 0 ...samsung-scsc-Skip-mount-point-check.patch} | 0 ...570-Initialize-framebuffer-more-late.patch | 54 +++++++++++++++++++ ...-Force-disable-Direct-I-O-operations.patch | 42 +++++++++++++++ .../downstream/linux-samsung-j4lte/APKBUILD | 16 +++--- 6 files changed, 105 insertions(+), 42 deletions(-) delete mode 100644 device/downstream/linux-samsung-j4lte/0005-HACK-decon_7570-Swap-red-blue-offset.patch rename device/downstream/linux-samsung-j4lte/{0006-drivers-samsung-scsc-Fix-FW_LOCATION_AUTO-symbol.patch => 0005-drivers-samsung-scsc-Fix-FW_LOCATION_AUTO-symbol.patch} (100%) rename device/downstream/linux-samsung-j4lte/{0007-drivers-samsung-scsc-Skip-mount-point-check.patch => 0006-drivers-samsung-scsc-Skip-mount-point-check.patch} (100%) create mode 100644 device/downstream/linux-samsung-j4lte/0007-fbdev-decon_7570-Initialize-framebuffer-more-late.patch create mode 100644 device/downstream/linux-samsung-j4lte/0008-HACK-loop-Force-disable-Direct-I-O-operations.patch diff --git a/device/downstream/linux-samsung-j4lte/0005-HACK-decon_7570-Swap-red-blue-offset.patch b/device/downstream/linux-samsung-j4lte/0005-HACK-decon_7570-Swap-red-blue-offset.patch deleted file mode 100644 index 26af84c85..000000000 --- a/device/downstream/linux-samsung-j4lte/0005-HACK-decon_7570-Swap-red-blue-offset.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 8c520ab87b8213a340c0c86a88b24e4d90e3a457 Mon Sep 17 00:00:00 2001 -From: Hendra Manudinata -Date: Tue, 24 Jun 2025 22:44:50 +0700 -Subject: [PATCH 5/7] HACK: decon_7570: Swap red & blue offset - -Based on [1], to make red & blue properly rendered. - -[1] https://gitlab.postmarketos.org/postmarketOS/pmaports/-/blob/master/device/testing/linux-samsung-xcover4lte/02-swap-red-blue.patch?ref_type=heads - -Signed-off-by: Hendra Manudinata ---- - drivers/video/fbdev/exynos/decon_7570/decon-int_drv.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/drivers/video/fbdev/exynos/decon_7570/decon-int_drv.c b/drivers/video/fbdev/exynos/decon_7570/decon-int_drv.c -index 7695b674..b3010c98 100644 ---- a/drivers/video/fbdev/exynos/decon_7570/decon-int_drv.c -+++ b/drivers/video/fbdev/exynos/decon_7570/decon-int_drv.c -@@ -440,11 +440,11 @@ int decon_check_var(struct fb_var_screeninfo *var, struct fb_info *info) - case 24: - /* our 24bpp is unpacked, so 32bpp */ - var->bits_per_pixel = 32; -- var->red.offset = 16; -+ var->red.offset = 0; - var->red.length = 8; - var->green.offset = 8; - var->green.length = 8; -- var->blue.offset = 0; -+ var->blue.offset = 16; - var->blue.length = 8; - break; - --- -2.43.0 - diff --git a/device/downstream/linux-samsung-j4lte/0006-drivers-samsung-scsc-Fix-FW_LOCATION_AUTO-symbol.patch b/device/downstream/linux-samsung-j4lte/0005-drivers-samsung-scsc-Fix-FW_LOCATION_AUTO-symbol.patch similarity index 100% rename from device/downstream/linux-samsung-j4lte/0006-drivers-samsung-scsc-Fix-FW_LOCATION_AUTO-symbol.patch rename to device/downstream/linux-samsung-j4lte/0005-drivers-samsung-scsc-Fix-FW_LOCATION_AUTO-symbol.patch diff --git a/device/downstream/linux-samsung-j4lte/0007-drivers-samsung-scsc-Skip-mount-point-check.patch b/device/downstream/linux-samsung-j4lte/0006-drivers-samsung-scsc-Skip-mount-point-check.patch similarity index 100% rename from device/downstream/linux-samsung-j4lte/0007-drivers-samsung-scsc-Skip-mount-point-check.patch rename to device/downstream/linux-samsung-j4lte/0006-drivers-samsung-scsc-Skip-mount-point-check.patch diff --git a/device/downstream/linux-samsung-j4lte/0007-fbdev-decon_7570-Initialize-framebuffer-more-late.patch b/device/downstream/linux-samsung-j4lte/0007-fbdev-decon_7570-Initialize-framebuffer-more-late.patch new file mode 100644 index 000000000..0601fdaad --- /dev/null +++ b/device/downstream/linux-samsung-j4lte/0007-fbdev-decon_7570-Initialize-framebuffer-more-late.patch @@ -0,0 +1,54 @@ +From 9ff4d93a4b27eb57278e6721e8b485726b87f25d Mon Sep 17 00:00:00 2001 +From: Hendra Manudinata +Date: Tue, 10 Mar 2026 21:45:59 +0700 +Subject: [PATCH] fbdev: decon_7570: Initialize framebuffer more late + +register_framebuffer() broadcasts the display as ready to be used by +other subsystem such as fbcon. However, since the frame is registered +way early, some things haven't done preparing yet, including mutex +locks. Thus, by enabling e.g. framebuffer console, the kernel panics +about non-existent memory pointer. + +Move register_framebuffer() to the bottom of the decon_probe() to ensure +that DECON has been initialized before handing over the control of the +display. + +Signed-off-by: Hendra Manudinata +--- + .../video/fbdev/exynos/decon_7570/decon_core.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +diff --git a/drivers/video/fbdev/exynos/decon_7570/decon_core.c b/drivers/video/fbdev/exynos/decon_7570/decon_core.c +index 16f4ebcb3..e7903dcde 100644 +--- a/drivers/video/fbdev/exynos/decon_7570/decon_core.c ++++ b/drivers/video/fbdev/exynos/decon_7570/decon_core.c +@@ -3520,14 +3520,6 @@ static int decon_probe(struct platform_device *pdev) + goto fail_iovmm; + + +- /* register framebuffer */ +- fbinfo = decon->windows[decon->pdata->default_win]->fbinfo; +- ret = register_framebuffer(fbinfo); +- if (ret < 0) { +- decon_err("failed to register framebuffer\n"); +- goto fail_iovmm; +- } +- + /* mutex mechanism */ + mutex_init(&decon->output_lock); + mutex_init(&decon->mutex); +@@ -3679,6 +3671,14 @@ static int decon_probe(struct platform_device *pdev) + #endif + decon->state = DECON_STATE_INIT; + ++ /* register framebuffer */ ++ fbinfo = decon->windows[decon->pdata->default_win]->fbinfo; ++ ret = register_framebuffer(fbinfo); ++ if (ret < 0) { ++ decon_err("failed to register framebuffer\n"); ++ goto fail_iovmm; ++ } ++ + /* [W/A] prevent sleep enter during LCD on */ + ret = device_init_wakeup(decon->dev, true); + if (ret) { diff --git a/device/downstream/linux-samsung-j4lte/0008-HACK-loop-Force-disable-Direct-I-O-operations.patch b/device/downstream/linux-samsung-j4lte/0008-HACK-loop-Force-disable-Direct-I-O-operations.patch new file mode 100644 index 000000000..5454b657c --- /dev/null +++ b/device/downstream/linux-samsung-j4lte/0008-HACK-loop-Force-disable-Direct-I-O-operations.patch @@ -0,0 +1,42 @@ +From a285560a29a910bb51bd8d392ccb4be2f6bf2d7e Mon Sep 17 00:00:00 2001 +From: Hendra Manudinata +Date: Wed, 11 Mar 2026 11:31:11 +0700 +Subject: [PATCH] [HACK] loop: Force disable Direct I/O operations + +This somehow fixes kernel crash during boot, while initramfs performs +e2fsck. Still unknown what's the reason of the crash, but for now, +bypassing direct I/O operation seems to work. + +Signed-off-by: Hendra Manudinata +--- + drivers/block/loop.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/drivers/block/loop.c b/drivers/block/loop.c +index 15157a3ea..2d2b752ac 100644 +--- a/drivers/block/loop.c ++++ b/drivers/block/loop.c +@@ -687,6 +687,11 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, + if (!file) + goto out; + ++ /* POSTMARKETOS: ++ * Disable Direct I/O to prevent kernel panics during e2fsck ++ */ ++ file->f_flags &= ~O_DIRECT; ++ + error = loop_validate_file(file, bdev); + if (error) + goto out_putf; +@@ -864,6 +869,11 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode, + if (!file) + goto out; + ++ /* POSTMARKETOS: ++ * Disable Direct I/O to prevent kernel panics during e2fsck ++ */ ++ file->f_flags &= ~O_DIRECT; ++ + error = -EBUSY; + if (lo->lo_state != Lo_unbound) + goto out_putf; diff --git a/device/downstream/linux-samsung-j4lte/APKBUILD b/device/downstream/linux-samsung-j4lte/APKBUILD index 0edb704c1..08a6d231f 100644 --- a/device/downstream/linux-samsung-j4lte/APKBUILD +++ b/device/downstream/linux-samsung-j4lte/APKBUILD @@ -3,7 +3,7 @@ maintainer="Hendra Manudinata " pkgname=linux-samsung-j4lte pkgver=3.18.140 -pkgrel=1 +pkgrel=2 pkgdesc="Samsung Galaxy J4 kernel fork" arch="aarch64" _carch="arm64" @@ -34,9 +34,10 @@ source=" 0002-zram-Set-zstd-as-the-default-compressor.patch 0003-drivers-usb-u_ether-Force-setting-random-MAC-address.patch 0004-staging-samsung-sec_batt-Force-disable-low-power-cha.patch - 0005-HACK-decon_7570-Swap-red-blue-offset.patch - 0006-drivers-samsung-scsc-Fix-FW_LOCATION_AUTO-symbol.patch - 0007-drivers-samsung-scsc-Skip-mount-point-check.patch + 0005-drivers-samsung-scsc-Fix-FW_LOCATION_AUTO-symbol.patch + 0006-drivers-samsung-scsc-Skip-mount-point-check.patch + 0007-fbdev-decon_7570-Initialize-framebuffer-more-late.patch + 0008-HACK-loop-Force-disable-Direct-I-O-operations.patch linux3.7to4.5-ARM64-remove-Sun-Solaris-style-flag-on-section.patch " builddir="$srcdir/$_repository-$_commit" @@ -75,8 +76,9 @@ fafed0c79633b50f9c62febeb1198bc863ddcaf7d3140bf58b87f574a75a16c1b73d563ce849ab84 f81dc234b7c37e5c33472a22f96299c435d4e2728e24164dc375abbc80912ce5a9045178deb2338f1f484a52296ad558541c01c101f244a62bf6149e75e0406b 0002-zram-Set-zstd-as-the-default-compressor.patch f69b9363ffd543f98f7799256bb3cfccc84623b69d8c7ee3ea291b52cecac7d961d4b491db6b5477bdd527ad3e9cbd738d67647fc074adcd2927b5eb6d2478dd 0003-drivers-usb-u_ether-Force-setting-random-MAC-address.patch 8f17a56957476832df48f90c229302958ec848300ea7dff76c2e9fc9433c301b28239bbc7404cf9c1bac5410dd9984dce39d132bbb29650324b9136777185583 0004-staging-samsung-sec_batt-Force-disable-low-power-cha.patch -a5d4afc22f514525f362884a618a770cf5301d4b0ae89d7f819d60c27aff9cb04f1ee823ebefe49872ac01e84a429d9619e0df7ec1c7b83793bc0dfb1da62e39 0005-HACK-decon_7570-Swap-red-blue-offset.patch -e0f5e505e794d4db1ed87a86dadf8321199c8c749a2b1a9b31fc572320b95d9cc004664eea2f3e20163d2993bfe0f50bdcecf027b70ce551d02abb2874985f9a 0006-drivers-samsung-scsc-Fix-FW_LOCATION_AUTO-symbol.patch -f0da70e3b5cc498e19430936422cf89476d68a5bbe45d593ab3c8bf353a81401a9133df983d3f1f84d0127670ad32b8adcb91e1beb821eb2efddd831f22f79dc 0007-drivers-samsung-scsc-Skip-mount-point-check.patch +e0f5e505e794d4db1ed87a86dadf8321199c8c749a2b1a9b31fc572320b95d9cc004664eea2f3e20163d2993bfe0f50bdcecf027b70ce551d02abb2874985f9a 0005-drivers-samsung-scsc-Fix-FW_LOCATION_AUTO-symbol.patch +f0da70e3b5cc498e19430936422cf89476d68a5bbe45d593ab3c8bf353a81401a9133df983d3f1f84d0127670ad32b8adcb91e1beb821eb2efddd831f22f79dc 0006-drivers-samsung-scsc-Skip-mount-point-check.patch +76700ecaea56f15d4204ff3064e640552eca35d3713fddaaaee204d7bf983ef419c08c7d759ca58430a27bd10d4bda7d1b6a7ec34ba27f503256f4ee6e42649d 0007-fbdev-decon_7570-Initialize-framebuffer-more-late.patch +ee281f9a6d5bab871d83e02cea6e222c6883e452c7b22ac65b512eca37d007218cad50e297189a4ad46be8d3d5a70f26f62867c75de30387cb4777a0c3a3e5e0 0008-HACK-loop-Force-disable-Direct-I-O-operations.patch 75545ccd0082a119b9ad95fcef3523c939a5c946f8f3a5c3dde15cee1502f6c1011050a0ad5359426f018bb7ceea1c97a28c7665941bc89f365c8d11065ce0f6 linux3.7to4.5-ARM64-remove-Sun-Solaris-style-flag-on-section.patch "