testing/device-samsung-a51: New device (MR 5887)

Successfully built and booted postmarketOS on Samsung Galaxy A51. It's based on Exynos 9611 SoC.

Currently, these are tested working:

- Boots from internal storage
- Display (DECON driver needs to be patched. Included in the kernel package)
- Framebuffer (additionally with msm-fb-refresher to refresh the screen)
- Touchscreen
- USB Networking (RNDIS)
- Wi-Fi

Tested UI environments: XFCE 4 & Console.

Wiki: https://wiki.postmarketos.org/wiki/Samsung_Galaxy_A51_(samsung-a51)
This commit is contained in:
Hendra Manudinata 2024-12-07 11:01:09 +07:00
parent e9643f19db
commit 6a01b409c3
No known key found for this signature in database
GPG key ID: B0076E490B71616B
13 changed files with 6801 additions and 0 deletions

View file

@ -38,6 +38,7 @@ device/*/*-qcom-sm6350/ @z3ntu
device/*/*-qcom-sm8250/ @jianhua
device/*/*-samsung-a3/ @Mis012 @TravMurav @Minecrell
device/*/*-samsung-a5/ @Minecrell @minlexx
device/*/*-samsung-a51/ @manoedinata
device/*/*-samsung-e7/ @wonderfulShrineMaidenOfParadise
device/*/*-samsung-espresso10/ @MightyM17
device/*/*-samsung-espresso7/ @MightyM17 @antoni.aloytorrens

View file

@ -0,0 +1,46 @@
# Maintainer: Hendra Manudinata <hendra@manoedinata.com>
# Reference: <https://postmarketos.org/devicepkg>
pkgname=device-samsung-a51
pkgdesc="Samsung Galaxy A51"
pkgver=1
pkgrel=0
url="https://postmarketos.org"
license="MIT"
arch="aarch64"
options="!check !archcheck"
depends="
linux-samsung-a51
mkbootimg
postmarketos-base
postmarketos-base-downstream
make-dynpart-mappings
msm-fb-refresher
"
makedepends="devicepkg-dev"
source="
deviceinfo
NetworkManager-conf.d-swlan0-p2p0-unmanaged.conf
"
subpackages="$pkgname-nonfree-firmware:nonfree_firmware"
build() {
devicepkg_build $startdir $pkgname
}
package() {
devicepkg_package $startdir $pkgname
# Disable swlan0 (additionally x0wlan0) & p2p0 management
install -Dm644 NetworkManager-conf.d-swlan0-p2p0-unmanaged.conf "$pkgdir"/usr/lib/NetworkManager/conf.d/swlan0-p2p0-unmanaged.conf
}
nonfree_firmware() {
pkgdesc="Non-free firmware for Samsung Galaxy A51 (a51)"
depends="firmware-samsung-a51"
mkdir "$subpkgdir"
}
sha512sums="
d593b87411e15546609646daae6d9192368046dde5ee5f1e15833ce2062bd310b6305943e52f1a0804d8276088df9342bf4f026dc418cbf44db630389954f54f deviceinfo
10dc120045062a47b11ab4762dcb4425b2a521b2bcede4e4d3b691f9f2cf2ced77bdff059992ff55cd11af59663802ecb8e750ca02ee70cfa8950b9a090b5dfb NetworkManager-conf.d-swlan0-p2p0-unmanaged.conf
"

View file

@ -0,0 +1,5 @@
[main]
plugins=keyfile
[keyfile]
unmanaged-devices=interface-name:swlan0;interface-name:x0wlan0;interface-name:p2p0

View file

@ -0,0 +1,41 @@
# Reference: <https://postmarketos.org/deviceinfo>
# Please use double quotes only. You can source this file in shell
# scripts.
deviceinfo_format_version="0"
deviceinfo_name="Samsung Galaxy A51"
deviceinfo_manufacturer="Samsung"
deviceinfo_codename="samsung-a51"
deviceinfo_year="2019"
deviceinfo_dtb="exynos9610"
deviceinfo_arch="aarch64"
# Device related
deviceinfo_chassis="handset"
deviceinfo_external_storage="true"
deviceinfo_screen_width="1080"
deviceinfo_screen_height="2400"
# Bootloader related
deviceinfo_flash_method="heimdall-bootimg"
deviceinfo_kernel_cmdline="androidboot.selinux=permissive androidboot.selinux=permissive loop.max_part=7"
deviceinfo_generate_bootimg="true"
deviceinfo_flash_pagesize="2048"
deviceinfo_header_version="2"
deviceinfo_append_dtb="false"
deviceinfo_bootimg_qcdt="false"
deviceinfo_flash_offset_dtb="0x00000000"
deviceinfo_flash_offset_base="0x10000000"
deviceinfo_flash_offset_kernel="0x00008000"
deviceinfo_flash_offset_ramdisk="0x01000000"
deviceinfo_flash_offset_second="0xf0000000"
deviceinfo_flash_offset_tags="0x00000100"
deviceinfo_flash_heimdall_partition_kernel="boot"
deviceinfo_flash_heimdall_partition_rootfs="super"
# Dynamic partition (super)
deviceinfo_super_partitions="/dev/sda25 /dev/sda25"
# USB
deviceinfo_usb_idProduct="0x685d"
deviceinfo_usb_idVendor="0x04e8"

View file

@ -0,0 +1,39 @@
# Maintainer: Hendra Manudinata <hendra@manoedinata.com>
pkgname=firmware-samsung-a51
pkgver=1
pkgrel=0
pkgdesc="Proprietary firmware for Samsung Galaxy A51 (a51)"
url="https://dumps.tadiphone.dev/dumps/samsung/a51"
arch="aarch64"
license="proprietary"
options="!check !archcheck !tracedeps pmb:cross-native"
_commit="4c72faa15ca0875510fde40a4b0686d4c161d0b4"
_repo="$url/-/raw/$_commit"
_files_wifi="
mx
mx140.bin
mx140_wlan.hcf
mx140_wlan_sw.hcf
"
for _file in $_files_wifi; do
source="$source $pkgname-$_commit-$_file::$_repo/vendor/etc/wifi/$_file"
done
package() {
local file
for file in $_files_wifi; do
install -Dm644 "$srcdir/$pkgname-$_commit-$file" \
"$pkgdir/lib/firmware/postmarketos/mx140/$file"
done
}
sha512sums="
cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e firmware-samsung-a51-4c72faa15ca0875510fde40a4b0686d4c161d0b4-mx
2a94883cab2b623eee67a0cf6f38d6a35264d01b03b69efc2292bf18dfa6d1280370e486c2021fb6ba3ddfd5e79dce8fd0febe754e8b1d39d30b412ec4fd4a3f firmware-samsung-a51-4c72faa15ca0875510fde40a4b0686d4c161d0b4-mx140.bin
31d2097a5b3acf88f63cb3d99cb10ac6329ee7d2ef32ca8312777dbcf452d709eb82f22737024a5cd7f3849a3498b73e377d1f0683d0b49e4d01da9c9b59bb0b firmware-samsung-a51-4c72faa15ca0875510fde40a4b0686d4c161d0b4-mx140_wlan.hcf
58a2ea8e2834f4115c704503b18851c18389f11f8b1f657804689b8c09b20b7b8c1f4c4cc677eaa21a4013cdd667715a358df4b4d0bb7ce2b13010845e4deb05 firmware-samsung-a51-4c72faa15ca0875510fde40a4b0686d4c161d0b4-mx140_wlan_sw.hcf
"

View file

@ -0,0 +1,370 @@
From c3d6d0c97001f907bbdefb71b9dca6d9cd903998 Mon Sep 17 00:00:00 2001
From: map220v <map220v300@gmail.com>
Date: Sat, 16 Jan 2021 14:56:07 +0300
Subject: [PATCH] [SQUASH] [HACK] DECON & framebuffer fixes for Linux
This commit contains (a little bit hacky) patches to fix framebuffer
behaving weird in native Linux system.
The said patches are:
* A hacky way to force DECON refresh. Now we don't need msm-fb-refresher
[1] anymore. [2]
* Fix fbcon and mismatched color [3]
* Keep `fb0` enabled [4]
* `decon_pan_display` downgrade to fix Samsung's DECON [5]
[1] https://pkgs.postmarketos.org/package/master/postmarketos/aarch64/msm-fb-refresher
[2] https://github.com/map220v/kernel_samsung_a51-linux/commit/8f88827bf29b4508ed2ea67110de93776a044e74
[3] https://github.com/map220v/kernel_samsung_a51-linux/commit/83656dabd2b5db98c04c5b02a2eca7b78152bc18
[4] https://github.com/map220v/kernel_samsung_a51-linux/commit/974f3e70d07021a9d7b42f08720b0b425003745f
[5] https://github.com/map220v/kernel_samsung_a51-linux/commit/ebfe69da8c0e0c4fcf8fc22970f9e38280d5224f
Signed-off-by: Hendra Manudinata <manoedinata@gmail.com>
---
drivers/video/fbdev/exynos/dpu20/decon_core.c | 57 ++++++++----
drivers/video/fbdev/exynos/dpu20/decon_dsi.c | 88 ++++++++-----------
2 files changed, 81 insertions(+), 64 deletions(-)
diff --git a/drivers/video/fbdev/exynos/dpu20/decon_core.c b/drivers/video/fbdev/exynos/dpu20/decon_core.c
index 20a52c044d..e77c9e7018 100644
--- a/drivers/video/fbdev/exynos/dpu20/decon_core.c
+++ b/drivers/video/fbdev/exynos/dpu20/decon_core.c
@@ -47,6 +47,9 @@
#if defined(CONFIG_SOC_EXYNOS9610)
#include <dt-bindings/clock/exynos9610.h>
#endif
+#ifdef CONFIG_STATE_NOTIFIER
+#include <linux/state_notifier.h>
+#endif
#include "decon.h"
#include "dsim.h"
@@ -58,13 +61,13 @@
#include "displayport.h"
#endif
-int decon_log_level = 6;
+int decon_log_level = 0;
module_param(decon_log_level, int, 0644);
-int dpu_bts_log_level = 6;
+int dpu_bts_log_level = 0;
module_param(dpu_bts_log_level, int, 0644);
-int win_update_log_level = 6;
+int win_update_log_level = 0;
module_param(win_update_log_level, int, 0644);
-int dpu_mres_log_level = 6;
+int dpu_mres_log_level = 0;
module_param(dpu_mres_log_level, int, 0644);
int decon_systrace_enable;
void decon_wait_for_vstatus(struct decon_device *decon, u32 timeout);
@@ -1004,11 +1007,15 @@ err:
return ret;
}
+int decon_set_vsync_int(struct fb_info *info, bool active);
+extern int needs_pan;
+
static int decon_blank(int blank_mode, struct fb_info *info)
{
struct decon_win *win = info->par;
struct decon_device *decon = win->decon;
int ret = 0;
+ struct fb_info *fb_info;
decon_info("%s + blank_mode: %d, decon-%d %s mode: %d type (0: DSI, 1: eDP, 2:DP, 3: WB)\n",
__func__, blank_mode, decon->id,
@@ -1034,6 +1041,9 @@ static int decon_blank(int blank_mode, struct fb_info *info)
goto blank_exit;
}
atomic_set(&decon->ffu_flag, 2);
+ #ifdef CONFIG_STATE_NOTIFIER
+ state_suspend();
+ #endif
break;
case FB_BLANK_UNBLANK:
DPU_EVENT_LOG(DPU_EVT_UNBLANK, &decon->sd, ktime_set(0, 0));
@@ -1043,10 +1053,16 @@ static int decon_blank(int blank_mode, struct fb_info *info)
goto blank_exit;
}
atomic_set(&decon->ffu_flag, 2);
+ #ifdef CONFIG_STATE_NOTIFIER
+ state_suspend();
+ #endif
#if defined(CONFIG_EXYNOS_READ_ESD_SOLUTION)
if (decon->esd.thread)
wake_up_process(decon->esd.thread);
#endif
+ needs_pan = true;
+ fb_info = decon->win[decon->dt.dft_win]->fbinfo;
+ decon_set_vsync_int(fb_info, true);
break;
case FB_BLANK_VSYNC_SUSPEND:
case FB_BLANK_HSYNC_SUSPEND:
@@ -3146,7 +3162,7 @@ static int decon_ioctl(struct fb_info *info, unsigned int cmd,
return ret;
}
-static ssize_t decon_fb_read(struct fb_info *info, char __user *buf,
+/*static ssize_t decon_fb_read(struct fb_info *info, char __user *buf,
size_t count, loff_t *ppos)
{
return 0;
@@ -3156,7 +3172,7 @@ static ssize_t decon_fb_write(struct fb_info *info, const char __user *buf,
size_t count, loff_t *ppos)
{
return 0;
-}
+}*/
int decon_release(struct fb_info *info, int user)
{
@@ -3164,6 +3180,7 @@ int decon_release(struct fb_info *info, int user)
struct decon_device *decon = win->decon;
int fb_count = atomic_read(&info->count);
+ return 0;
decon_info("%s + : %d\n", __func__, decon->id);
if (decon->id && decon->dt.out_type == DECON_OUT_DSI) {
@@ -3216,12 +3233,14 @@ static struct fb_ops decon_fb_ops = {
.fb_blank = decon_blank,
.fb_setcolreg = decon_setcolreg,
.fb_fillrect = cfb_fillrect,
+ .fb_copyarea = cfb_copyarea,
+ .fb_imageblit = cfb_imageblit,
#ifdef CONFIG_COMPAT
.fb_compat_ioctl = decon_compat_ioctl,
#endif
.fb_ioctl = decon_ioctl,
- .fb_read = decon_fb_read,
- .fb_write = decon_fb_write,
+// .fb_read = decon_fb_read,
+// .fb_write = decon_fb_write,
.fb_pan_display = decon_pan_display,
.fb_mmap = decon_mmap,
.fb_release = decon_release,
@@ -3456,15 +3475,15 @@ static int decon_fb_alloc_memory(struct decon_device *decon, struct decon_win *w
}
#endif
- memset(vaddr, 0x00, size);
+ //memset(vaddr, 0x00, size);
fbi->screen_base = vaddr;
#if !defined(CONFIG_SUPPORT_LEGACY_ION)
- dma_buf_vunmap(buf, vaddr);
+ //dma_buf_vunmap(buf, vaddr);
#endif
- fbi->screen_base = NULL;
+ //fbi->screen_base = NULL;
win->dma_buf_data[1].fence = NULL;
win->dma_buf_data[2].fence = NULL;
@@ -3637,6 +3656,7 @@ static int decon_acquire_window(struct decon_device *decon, int idx)
}
fbinfo->fix.type = FB_TYPE_PACKED_PIXELS;
+ fbinfo->fix.visual = FB_VISUAL_TRUECOLOR,
fbinfo->fix.accel = FB_ACCEL_NONE;
fbinfo->var.activate = FB_ACTIVATE_NOW;
fbinfo->var.vmode = FB_VMODE_NONINTERLACED;
@@ -3964,8 +3984,8 @@ static int decon_initial_display(struct decon_device *decon, bool is_colormap)
}
decon_to_init_param(decon, &p);
- if (decon_reg_init(decon->id, decon->dt.out_idx[0], &p) < 0)
- goto decon_init_done;
+ //if (decon_reg_init(decon->id, decon->dt.out_idx[0], &p) < 0)
+ // goto decon_init_done;
memset(&win_regs, 0, sizeof(struct decon_window_regs));
win_regs.wincon = wincon(0x8, 0xFF, 0xFF, 0xFF, DECON_BLENDING_NONE,
@@ -3991,7 +4011,7 @@ static int decon_initial_display(struct decon_device *decon, bool is_colormap)
set_bit(dpp_id, &decon->prev_used_dpp);
memset(&config, 0, sizeof(struct decon_win_config));
config.dpp_parm.addr[0] = fbinfo->fix.smem_start;
- config.format = DECON_PIXEL_FORMAT_BGRA_8888;
+ config.format = DECON_PIXEL_FORMAT_ARGB_8888;
config.src.w = fbinfo->var.xres;
config.src.h = fbinfo->var.yres;
config.src.f_w = fbinfo->var.xres;
@@ -4030,14 +4050,21 @@ static int decon_initial_display(struct decon_device *decon, bool is_colormap)
decon_reg_set_int(decon->id, &psr, 1);
call_panel_ops(dsim, displayon, dsim);
decon_wait_for_vsync(decon, VSYNC_TIMEOUT_MSEC);
+ decon_set_vsync_int(fbinfo, true);
if (decon_reg_wait_update_done_and_mask(decon->id, &psr,
SHADOW_UPDATE_TIMEOUT) < 0)
decon_err("%s: wait_for_update_timeout\n", __func__);
-decon_init_done:
+//decon_init_done:
decon->state = DECON_STATE_INIT;
+ // Try to unblank decon0
+ if(decon->id == 0)
+ {
+ decon_blank(FB_BLANK_UNBLANK, fbinfo);
+ }
+
return 0;
}
diff --git a/drivers/video/fbdev/exynos/dpu20/decon_dsi.c b/drivers/video/fbdev/exynos/dpu20/decon_dsi.c
index 0b0b0a96e1..1189735567 100644
--- a/drivers/video/fbdev/exynos/dpu20/decon_dsi.c
+++ b/drivers/video/fbdev/exynos/dpu20/decon_dsi.c
@@ -322,6 +322,8 @@ static ssize_t decon_show_vsync(struct device *dev,
}
static DEVICE_ATTR(vsync, S_IRUGO, decon_show_vsync, NULL);
+int needs_pan = false;
+
static int decon_vsync_thread(void *data)
{
struct decon_device *decon = data;
@@ -336,6 +338,19 @@ static int decon_vsync_thread(void *data)
int ret = wait_event_interruptible(decon->vsync.wait,
(timestamp != decon->vsync.timestamp) &&
decon->vsync.active);
+
+ struct decon_mode_info psr;
+ if (needs_pan) {
+ // TODO: This is dirty hack.
+ // Implement a better solution
+ struct fb_info *fb_info = decon->win[decon->dt.dft_win]->fbinfo;
+ struct fb_var_screeninfo *var = &fb_info->var;
+ usleep_range(200000, 201000);
+ decon_pan_display(var, fb_info);
+ needs_pan = false;
+ }
+ decon_to_psr_info(decon, &psr);
+ decon_reg_start(decon->id, &psr);
#endif
if (!ret)
sysfs_notify(&decon->dev->kobj, NULL, "vsync");
@@ -835,87 +850,61 @@ int decon_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
struct v4l2_subdev *sd = NULL;
struct decon_win_config config;
int ret = 0;
+ int shift = 0;
struct decon_mode_info psr;
- int dpp_id = DPU_DMA2CH(decon->dt.dft_idma);
-
- if (decon->dt.out_type != DECON_OUT_DSI) {
- decon_warn("%s: decon%d unspported on out_type(%d)\n",
- __func__, decon->id, decon->dt.out_type);
- return 0;
- }
- if ((!IS_DECON_HIBER_STATE(decon) && IS_DECON_OFF_STATE(decon)) ||
- decon->state == DECON_STATE_INIT) {
+ if ((decon->dt.out_type == DECON_OUT_DSI &&
+ decon->state == DECON_STATE_INIT) ||
+ decon->state == DECON_STATE_OFF) {
decon_warn("%s: decon%d state(%d), UNBLANK missed\n",
__func__, decon->id, decon->state);
return 0;
}
- decon_info("%s: [%d %d %d %d %d %d]\n", __func__,
- var->xoffset, var->yoffset,
- var->xres, var->yres,
- var->xres_virtual, var->yres_virtual);
+ decon_set_par(info);
+
+ decon_hiber_block_exit(decon);
+ set_bit(decon->dt.dft_idma, &decon->cur_using_dpp);
+ set_bit(decon->dt.dft_idma, &decon->prev_used_dpp);
memset(&config, 0, sizeof(struct decon_win_config));
switch (var->bits_per_pixel) {
case 16:
config.format = DECON_PIXEL_FORMAT_RGB_565;
+ shift = 2;
break;
case 24:
case 32:
- config.format = DECON_PIXEL_FORMAT_ABGR_8888; /* DECON_PIXEL_FORMAT_BGRA_8888; */
+ config.format = DECON_PIXEL_FORMAT_ARGB_8888;
+ shift = 4;
break;
default:
- decon_err("%s: Not supported bpp %d\n", __func__,
- var->bits_per_pixel);
- return -EINVAL;
+ decon_err("%s: bits_per_pixel %d\n", __func__, var->bits_per_pixel);
}
config.dpp_parm.addr[0] = info->fix.smem_start;
- config.src.x = var->xoffset;
+ config.src.x = var->xoffset >> shift;
config.src.y = var->yoffset;
config.src.w = var->xres;
config.src.h = var->yres;
- config.src.f_w = var->xres_virtual;
- config.src.f_h = var->yres_virtual;
+ config.src.f_w = var->xres;
+ config.src.f_h = var->yres;
config.dst.w = config.src.w;
config.dst.h = config.src.h;
- config.dst.f_w = decon->lcd_info->xres;
- config.dst.f_h = decon->lcd_info->yres;
- if (decon_check_limitation(decon, decon->dt.dft_win, &config) < 0)
- return -EINVAL;
-
- decon_hiber_block_exit(decon);
-
- decon_to_psr_info(decon, &psr);
-
- /*
- * info->var is old parameters and var is new requested parameters.
- * var must be copied to info->var before decon_set_par function
- * is called.
- *
- * If not, old parameters are set to window configuration
- * and new parameters are set to DMA and DPP configuration.
- */
- memcpy(&info->var, var, sizeof(struct fb_var_screeninfo));
+ config.dst.f_w = config.src.f_w;
+ config.dst.f_h = config.src.f_h;
+ sd = decon->dpp_sd[decon->dt.dft_idma];
- set_bit(dpp_id, &decon->cur_using_dpp);
- set_bit(dpp_id, &decon->prev_used_dpp);
- sd = decon->dpp_sd[dpp_id];
if (v4l2_subdev_call(sd, core, ioctl, DPP_WIN_CONFIG, &config)) {
decon_err("%s: Failed to config DPP-%d\n", __func__, win->dpp_id);
- decon_reg_win_enable_and_update(decon->id, decon->dt.dft_win, false);
- clear_bit(dpp_id, &decon->cur_using_dpp);
- set_bit(dpp_id, &decon->dpp_err_stat);
- goto err;
+ clear_bit(win->dpp_id, &decon->cur_using_dpp);
+ set_bit(win->dpp_id, &decon->dpp_err_stat);
}
decon_reg_update_req_window(decon->id, win->idx);
-#if 0
- decon_set_par(info);
-#endif
+
+ decon_to_psr_info(decon, &psr);
decon_reg_start(decon->id, &psr);
-err:
decon_wait_for_vsync(decon, VSYNC_TIMEOUT_MSEC);
if (decon_reg_wait_update_done_and_mask(decon->id, &psr, SHADOW_UPDATE_TIMEOUT)
@@ -923,6 +912,7 @@ err:
decon_err("%s: wait_for_update_timeout\n", __func__);
decon_hiber_unblock(decon);
+
return ret;
}
EXPORT_SYMBOL(decon_pan_display);
--
2.34.1

View file

@ -0,0 +1,89 @@
From ddf630c03f250c23478afe638a62777a564f674c Mon Sep 17 00:00:00 2001
From: John Vincent Corcega <kamusta@tenseventyseven.xyz>
Date: Mon, 2 Dec 2024 17:46:42 +0000
Subject: [PATCH] drivers: soc: cal-if: Prevent optimization of structs on
fvmap_copy_from_sram
Newer versions of Clang tend to apply heavier optimizations than GCC, especially if -mcpu is set. Because we are applying optimizations to the LITTLE core (see b92e1e70898f515646142736df8d72c43e97e251) kernel panics during boot, citing inability to access memory regions on fvmap_init.
<6>[ 0.664609] [0: swapper/0: 1] fvmap_init:fvmap initialize 0000000000000000
<0>[ 0.664625] [0: swapper/0: 1] Unable to handle kernel paging request at virtual address ffffff800b2f2402
<2>[ 0.664640] [0: swapper/0: 1] sec_debug_set_extra_info_fault = KERN / 0xffffff800b2f2402
<6>[ 0.664657] [0: swapper/0: 1] search_item_by_key: (FTYPE) extra_info is not ready
<2>[ 0.664666] [0: swapper/0: 1] set_item_val: fail to find FTYPE
<6>[ 0.664680] [0: swapper/0: 1] search_item_by_key: (FAULT) extra_info is not ready
<2>[ 0.664688] [0: swapper/0: 1] set_item_val: fail to find FAULT
<6>[ 0.664702] [0: swapper/0: 1] search_item_by_key: (PC) extra_info is not ready
<2>[ 0.664710] [0: swapper/0: 1] set_item_val: fail to find PC
<6>[ 0.664724] [0: swapper/0: 1] search_item_by_key: (LR) extra_info is not ready
<2>[ 0.664732] [0: swapper/0: 1] set_item_val: fail to find LR
<1>[ 0.664746] [0: swapper/0: 1] Mem abort info:
<1>[ 0.664760] [0: swapper/0: 1] Exception class = DABT (current EL), IL = 32 bits
<1>[ 0.664774] [0: swapper/0: 1] SET = 0, FnV = 0
<1>[ 0.664787] [0: swapper/0: 1] EA = 0, S1PTW = 0
<1>[ 0.664799] [0: swapper/0: 1] Data abort info:
<1>[ 0.664814] [0: swapper/0: 1] ISV = 0, ISS = 0x00000021
<1>[ 0.664828] [0: swapper/0: 1] CM = 0, WnR = 0
<1>[ 0.664842] [0: swapper/0: 1] swapper pgtable: 4k pages, 39-bit VAs, pgd = ffffff800a739000
<1>[ 0.664856] [0: swapper/0: 1] [ffffff800b2f2402] *pgd=000000097cdfe003, *pud=000000097cdfe003, *pmd=00000009742a9003, *pte=00e800000204b707
<0>[ 0.664884] [0: swapper/0: 1] Internal error: Oops: 96000021 [#1] PREEMPT SMP
<4>[ 0.664899] [0: swapper/0: 1] Modules linked in:
<0>[ 0.664916] [0: swapper/0: 1] Process swapper/0 (pid: 1, stack limit = 0xffffff80081a8000)
<0>[ 0.664936] [0: swapper/0: 1] debug-snapshot: core register saved(CPU:0)
<0>[ 0.664950] [0: swapper/0: 1] L2ECTLR_EL1: 0000000000000007
<0>[ 0.664959] [0: swapper/0: 1] L2ECTLR_EL1 valid_bit(30) is NOT set (0x0)
<0>[ 0.664978] [0: swapper/0: 1] CPUMERRSR: 0000000008000001, L2MERRSR: 0000000010200c00
<0>[ 0.664992] [0: swapper/0: 1] CPUMERRSR valid_bit(31) is NOT set (0x0)
<0>[ 0.665006] [0: swapper/0: 1] L2MERRSR valid_bit(31) is NOT set (0x0)
<0>[ 0.665020] [0: swapper/0: 1] debug-snapshot: context saved(CPU:0)
<6>[ 0.665088] [0: swapper/0: 1] debug-snapshot: item - log_kevents is disabled
<6>[ 0.665112] [0: swapper/0: 1] TIF_FOREIGN_FPSTATE: 0, FP/SIMD depth 0, cpu: 0
<4>[ 0.665130] [0: swapper/0: 1] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.14.113 - Fresh Core-user #1
<4>[ 0.665144] [0: swapper/0: 1] Hardware name: Samsung A50 LTN OPEN rev04 board based on Exynos9610 (DT)
<4>[ 0.665160] [0: swapper/0: 1] task: ffffffc8f4ce8000 task.stack: ffffff80081a8000
<4>[ 0.665180] [0: swapper/0: 1] PC is at fvmap_init+0xac/0x2c8
<4>[ 0.665195] [0: swapper/0: 1] LR is at fvmap_init+0x70/0x2c8
<4>[ 0.665211] [0: swapper/0: 1] pc : [<ffffff80085e12b8>] lr : [<ffffff80085e127c>] pstate: 20400145
<4>[ 0.665225] [0: swapper/0: 1] sp : ffffff80081abb80
<4>[ 0.665238] [0: swapper/0: 1] x29: ffffff80081abbb0 x28: 0000000000000000
<4>[ 0.665256] [0: swapper/0: 1] x27: ffffff8009efc000 x26: 0000000000000000
<4>[ 0.665273] [0: swapper/0: 1] x25: ffffff800b2e5970 x24: ffffff8008fa7222
<4>[ 0.665291] [0: swapper/0: 1] x23: ffffff800b2e5a60 x22: ffffff8009efb000
<4>[ 0.665307] [0: swapper/0: 1] x21: ffffffc8f3480000 x20: ffffff800b2e0000
<4>[ 0.665324] [0: swapper/0: 1] x19: ffffff800b2f2400 x18: 0000000000000000
<4>[ 0.665341] [0: swapper/0: 1] x17: ffffff8009bff23c x16: 0000000000000000
<4>[ 0.665358] [0: swapper/0: 1] x15: 00000000000000c6 x14: 0000000000000054
<4>[ 0.665375] [0: swapper/0: 1] x13: 000000000000d7b8 x12: 0000000000000000
<4>[ 0.665392] [0: swapper/0: 1] x11: 0000000000000000 x10: ffffffc8f3480000
<4>[ 0.665409] [0: swapper/0: 1] x9 : ffffff800b2f2400 x8 : 0000000000000000
<4>[ 0.665426] [0: swapper/0: 1] x7 : 5b20205d39303634 x6 : ffffffc0117d09b7
<4>[ 0.665443] [0: swapper/0: 1] x5 : 0000000000000001 x4 : 000000000000000c
<4>[ 0.665459] [0: swapper/0: 1] x3 : 0000000000000a30 x2 : ffffffffffffffce
<4>[ 0.665476] [0: swapper/0: 1] x1 : 000000000b040000 x0 : 000000000000000a
Since we need these optimizations for performance reasons, the only way to resolve this is to solve the issue. Samsung already did something similar to cal-if before.
We only needed to make fvmap_header/header volatile and has been tested to work.
Signed-off-by: John Vincent <git@tensevntysevn.cf>
Change-Id: Ic419135d4a80cbe15f0fa71dc59cc6efa73d6141
---
drivers/soc/samsung/cal-if/fvmap.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/soc/samsung/cal-if/fvmap.c b/drivers/soc/samsung/cal-if/fvmap.c
index a7bedd15eb..770d500e84 100644
--- a/drivers/soc/samsung/cal-if/fvmap.c
+++ b/drivers/soc/samsung/cal-if/fvmap.c
@@ -268,7 +268,7 @@ static void check_percent_margin(struct rate_volt_header *head, unsigned int num
static void fvmap_copy_from_sram(void __iomem *map_base, void __iomem *sram_base)
{
- struct fvmap_header *fvmap_header, *header;
+ volatile struct fvmap_header *fvmap_header, *header;
struct rate_volt_header *old, *new;
struct clocks *clks;
struct pll_header *plls;
--
2.34.1

View file

@ -0,0 +1,44 @@
From 6aeec5b9d57036a00984e45daa89630628e7e3a3 Mon Sep 17 00:00:00 2001
From: map220v <map220v300@gmail.com>
Date: Sat, 16 Jan 2021 16:21:16 +0300
Subject: [PATCH] fbdev: exynos: dpu20: Remove one of samsung debug log
This seems to fix, or at least reduce, random kernel panic.
[hm: Reword commit message]
Signed-off-by: Hendra Manudinata <manoedinata@gmail.com>
---
drivers/video/fbdev/exynos/dpu20/dpp_drv.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/drivers/video/fbdev/exynos/dpu20/dpp_drv.c b/drivers/video/fbdev/exynos/dpu20/dpp_drv.c
index 1ded5e85cb..40a1cf8464 100644
--- a/drivers/video/fbdev/exynos/dpu20/dpp_drv.c
+++ b/drivers/video/fbdev/exynos/dpu20/dpp_drv.c
@@ -20,7 +20,7 @@
#include "dpp.h"
#include "decon.h"
-int dpp_log_level = 6;
+int dpp_log_level = 0;
struct dpp_device *dpp_drvdata[MAX_DPP_CNT];
@@ -40,10 +40,10 @@ void dpp_op_timer_handler(unsigned long arg)
dpp_dump(dpp);
- if (dpp->dpp_config->config.compression)
- dpp_info("Compression Source is %s of DPP[%d]\n",
- dpp->dpp_config->config.dpp_parm.comp_src == DPP_COMP_SRC_G2D ?
- "G2D" : "GPU", dpp->id);
+ //if (dpp->dpp_config->config.compression)
+ // dpp_info("Compression Source is %s of DPP[%d]\n",
+ // dpp->dpp_config->config.dpp_parm.comp_src == DPP_COMP_SRC_G2D ?
+ // "G2D" : "GPU", dpp->id);
dpp_info("DPP[%d] irq hasn't been occured", dpp->id);
}
--
2.34.1

View file

@ -0,0 +1,66 @@
From 28dbfef394c8e4c0b14a1e208de3126aba6cd2ab Mon Sep 17 00:00:00 2001
From: Hendra Manudinata <manoedinata@gmail.com>
Date: Sat, 7 Dec 2024 09:26:26 +0700
Subject: [PATCH] usb: u_ether: Force setting random MAC address
Signed-off-by: Hendra Manudinata <manoedinata@gmail.com>
---
drivers/usb/gadget/function/u_ether.c | 13 ++++---------
1 file changed, 4 insertions(+), 9 deletions(-)
diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c
index 6f71453bda..49942924e1 100644
--- a/drivers/usb/gadget/function/u_ether.c
+++ b/drivers/usb/gadget/function/u_ether.c
@@ -1084,9 +1084,8 @@ static int eth_stop(struct net_device *net)
}
/*-------------------------------------------------------------------------*/
-#ifndef CONFIG_USB_ANDROID_SAMSUNG_COMPOSITE
static u8 host_ethaddr[ETH_ALEN];
-#endif
+
static int get_ether_addr(const char *str, u8 *dev_addr)
{
if (str) {
@@ -1116,7 +1115,7 @@ static int get_ether_addr_str(u8 dev_addr[ETH_ALEN], char *str, int len)
snprintf(str, len, "%pM", dev_addr);
return 18;
}
-#ifndef CONFIG_USB_ANDROID_SAMSUNG_COMPOSITE
+
static int get_host_ether_addr(u8 *str, u8 *dev_addr)
{
memcpy(dev_addr, str, ETH_ALEN);
@@ -1127,7 +1126,6 @@ static int get_host_ether_addr(u8 *str, u8 *dev_addr)
memcpy(str, dev_addr, ETH_ALEN);
return 1;
}
-#endif
static const struct net_device_ops eth_netdev_ops = {
.ndo_open = eth_open,
@@ -1186,10 +1184,7 @@ struct eth_dev *gether_setup_name(struct usb_gadget *g,
if (get_ether_addr(dev_addr, net->dev_addr))
dev_warn(&g->dev,
"using random %s ethernet address\n", "self");
-#ifdef CONFIG_USB_ANDROID_SAMSUNG_COMPOSITE
- memcpy(dev->host_mac, ethaddr, ETH_ALEN);
- printk(KERN_DEBUG "usb: set unique host mac\n");
-#else
+
if (get_host_ether_addr(host_ethaddr, dev->host_mac))
dev_warn(&g->dev, "using random %s ethernet address\n", "host");
else
@@ -1197,7 +1192,7 @@ struct eth_dev *gether_setup_name(struct usb_gadget *g,
if (ethaddr)
memcpy(ethaddr, dev->host_mac, ETH_ALEN);
-#endif
+
net->netdev_ops = &eth_netdev_ops;
net->ethtool_ops = &ops;
--
2.34.1

View file

@ -0,0 +1,107 @@
# Maintainer: Hendra Manudinata <hendra@manoedinata.com>
# Reference: <https://postmarketos.org/vendorkernel>
# Kernel config based on: arch/arm64/configs/exynos9610-a51xx_defconfig
pkgname=linux-samsung-a51
pkgver=4.14.113
pkgrel=0
pkgdesc="Samsung Galaxy A51 kernel fork"
arch="aarch64"
_carch="arm64"
_flavor="samsung-a51"
url="https://kernel.org"
license="GPL-2.0-only"
options="!strip !check !tracedeps pmb:cross-native"
makedepends="
android-tools
bash
bc
bison
clang
devicepkg-dev
findutils
flex
linux-headers
openssl-dev
perl
"
# Compiler: clang
export CC="clang"
export HOSTCC="clang"
# Source
_repository="android_kernel_samsung_a51"
_commit="c8dd4c096e0ba7b7cbdb6eb2ea6c7affd006198b"
_config="config-$_flavor.$arch"
source="
$pkgname-$_commit.tar.gz::https://github.com/manoedinata/$_repository/archive/$_commit.tar.gz
$_config
0001-SQUASH-HACK-DECON-framebuffer-fixes-for-Linux.patch
0001-fbdev-exynos-dpu20-Remove-one-of-samsung-debug-log.patch
0001-drivers-soc-cal-if-Prevent-optimization-of-structs-o.patch
0001-usb-u_ether-Force-setting-random-MAC-address.patch
exynos9611.cfg
a51.cfg
"
builddir="$srcdir/$_repository-$_commit"
_outdir="out"
prepare() {
default_prepare
REPLACE_GCCH=0 . downstreamkernel_prepare
# Remove -Werror from all makefiles
local i
local makefiles="$(find . -type f -name Makefile)
$(find . -type f -name Kbuild)"
for i in $makefiles; do
sed -i 's/-Werror-/-W/g' "$i"
sed -i 's/-Werror//g' "$i"
done
}
build() {
unset LDFLAGS
make O="$_outdir" ARCH="$_carch" CC="${CC:-gcc}" \
KBUILD_BUILD_VERSION="$((pkgrel + 1 ))-postmarketOS"
}
package() {
downstreamkernel_package "$builddir" "$pkgdir" "$_carch" \
"$_flavor" "$_outdir"
make dtbs_install O="$_outdir" ARCH="$_carch" \
INSTALL_DTBS_PATH="$pkgdir"/boot/dtbs
# Generate DTB & DTBO
## DTB (apply configuration)
dtbdir="$_outdir"/arch/$_carch/boot/dts/exynos
mkdtboimg cfg_create \
"$pkgdir"/boot/dtbs/exynos9610.dtb \
"$srcdir"/exynos9611.cfg \
-d "$dtbdir"
## DTBO (create an image and apply configuration)
dtbodir="$_outdir"/arch/$_carch/boot/dts/samsung
mkdtboimg create "$pkgdir"/boot/dtbo.img --page_size=4096 \
"$dtbodir"/exynos9611-a51_eur_open_00.dtbo \
"$dtbodir"/exynos9611-a51_eur_open_01.dtbo \
"$dtbodir"/exynos9611-a51_eur_open_03.dtbo \
"$dtbodir"/exynos9611-a51_eur_open_07.dtbo
mkdtboimg cfg_create \
"$pkgdir"/boot/dtbo.img \
"$srcdir"/a51.cfg \
-d "$dtbodir"
}
sha512sums="
0a3d794884411d0aca00672c6e7f8c1ba6e028d4e49cfea80cff552679651c5e3bf7e667f59c572fa406e6c704ad683762a7f656366084b0ea7cbc92cc422cdc linux-samsung-a51-c8dd4c096e0ba7b7cbdb6eb2ea6c7affd006198b.tar.gz
47d5e65a9a79f4b3d74975a42f1191247914c2aa8876e30fbc3725cd40a58c09fa2466eb2ba0fd3896c42032e090d952a6b7bdeb63d8e9cd57170182a5e40e55 config-samsung-a51.aarch64
ba1bf397e6ae63ff53aad715940d664fcbd0273ddbd9554c01171133f07627eadab2f174c408ebe4f25b92fcf66f1a3292b9928643e8599e7b1c28decbbed323 0001-SQUASH-HACK-DECON-framebuffer-fixes-for-Linux.patch
93d43ca0d218729e60bd3256585a13ed6057881654147c2b84cab0423a5f8969c9566367b89226ddd153e7efa8f29878d0b7fc7c438ff02893bac15de1d41418 0001-fbdev-exynos-dpu20-Remove-one-of-samsung-debug-log.patch
95b1d4d44eac376df3bc4bdb324035dae0c982c5938caaa4c3915aa78429898efd2b53b3e781cccb37b47dd2240bd0ce0b4ccf3c81a92e7c684790c68336d3a2 0001-drivers-soc-cal-if-Prevent-optimization-of-structs-o.patch
8bb1aeeb094e6d0c7d1393ebf95f0f88642a164cb37fa75bc8098133000f5cd978844c28f5ba519ae31dcb89680426d18938e12e3f2137f5d55a9c6428f2ddba 0001-usb-u_ether-Force-setting-random-MAC-address.patch
b9919a1010caf6cce9dbee0d3afa8e0b3c0794299d29d778d1ed822b6719a11c2b3ed08808ec5a641fe4a44a635370c0d85451fafdc62396a562fcaf02e5a9b6 exynos9611.cfg
d1894ffd3c53d0e84678c4d566a833360525d916241cb69f35f9e8e195c0ff163ad2441562f092088726209e1533cb19f23e642e64fd89f31372a742c7d7d5b3 a51.cfg
"

View file

@ -0,0 +1,15 @@
exynos9611-a51_eur_open_00.dtbo
custom0=0x00000000
custom1=0x00000000
exynos9611-a51_eur_open_01.dtbo
custom0=0x00000001
custom1=0x00000002
exynos9611-a51_eur_open_03.dtbo
custom0=0x00000003
custom1=0x00000006
exynos9611-a51_eur_open_07.dtbo
custom0=0x00000007
custom1=0x000000ff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,3 @@
exynos9610.dtb
custom0=0x00000000
custom1=0x000000ff