Add support for Samsung Galaxy S20 5G, based on exynos 990, to the
current samsung board support. This platform, just like exynos8895,
needs a bit to be set in order to allow the framebuffer to refresh.

Barebox has to be packaged as an android boot image:

mkbootimg --kernel images/barebox-exynos.img \
--ramdisk ramdisk.bin \
--dt stock.dtb
--cmdline "buildvariant=eng" \
--base 0x10000000 \
--kernel_offset 0x00008000 \
--ramdisk_offset 0x01000000 \
--second_offset 0x00f00000 \
--tags_offset 0x00000100 \
--os_version 9.0.0 \
--os_patch_level 2019-10 \
--pagesize 2048 \
--hash sha1 \
--output boot.img

And then flashed to the boot partition:

heimdall flash --BOOT boot.img

Currently, only a minimal set of features work. It's possible to
boot a FIT image packaged as a ramdisk with mkbootimg.

Signed-off-by: Ivaylo Ivanov <ivo.ivanov.ivan...@gmail.com>
Tested-by: Umer Uddin <umer.ud...@mentallysanemainliners.org>

---
The tester is also the one who upstreamed support for x1s in mainline
linux. He volunteered for me to upstream barebox support for it
alongside dreamlte, hence why I have my copyright in the x1s overlay
device tree.
---
 arch/arm/boards/samsung-exynos/board.c              |  4 ++++
 .../samsung-exynos/defaultenv-exynos/boot/ramfit    |  4 ++++
 arch/arm/boards/samsung-exynos/lowlevel.c           |  3 +++
 arch/arm/dts/Makefile                               |  3 ++-
 arch/arm/dts/exynos990-x1s.dts                      | 13 +++++++++++++
 5 files changed, 26 insertions(+), 1 deletion(-)
 create mode 100644 arch/arm/dts/exynos990-x1s.dts

diff --git a/arch/arm/boards/samsung-exynos/board.c 
b/arch/arm/boards/samsung-exynos/board.c
index 2d0c2248..f26da64a 100644
--- a/arch/arm/boards/samsung-exynos/board.c
+++ b/arch/arm/boards/samsung-exynos/board.c
@@ -13,6 +13,7 @@
 #include <of_address.h>
 
 #define EXYNOS8895_DECON0      0x12860000
+#define EXYNOS990_DECON0       0x19050000
 #define HW_SW_TRIG_CONTROL     0x70
 #define TRIG_AUTO_MASK_EN      BIT(12)
 #define SW_TRIG_EN             BIT(8)
@@ -30,6 +31,8 @@ static int exynos_postcore_init(void)
         */
        if (of_machine_is_compatible("samsung,exynos8895"))
                trig_ctrl = IOMEM(EXYNOS8895_DECON0 + HW_SW_TRIG_CONTROL);
+       else if (of_machine_is_compatible("samsung,exynos990"))
+               trig_ctrl = IOMEM(EXYNOS990_DECON0 + HW_SW_TRIG_CONTROL);
        else
                return 0;
 
@@ -52,6 +55,7 @@ static inline int exynos_init(struct device *dev)
 
 static const struct of_device_id exynos_of_match[] = {
        { .compatible = "samsung,dreamlte" },
+       { .compatible = "samsung,x1s" },
        { /* Sentinel */},
 };
 
diff --git a/arch/arm/boards/samsung-exynos/defaultenv-exynos/boot/ramfit 
b/arch/arm/boards/samsung-exynos/defaultenv-exynos/boot/ramfit
index 0912c9fc..c8fc7e55 100644
--- a/arch/arm/boards/samsung-exynos/defaultenv-exynos/boot/ramfit
+++ b/arch/arm/boards/samsung-exynos/defaultenv-exynos/boot/ramfit
@@ -8,5 +8,9 @@ if test "$global.model" = "Samsung Galaxy S8 (SM-G950F)"; then
        global fit_offset=0x9000000
 fi
 
+if test "$global.model" = "Samsung Galaxy S20 5G"; then
+       global fit_offset=0x4000000
+fi
+
 addpart /dev/ram0 0x2000000@$global.fit_offset(fit)
 bootm -f /dev/ram0.fit
diff --git a/arch/arm/boards/samsung-exynos/lowlevel.c 
b/arch/arm/boards/samsung-exynos/lowlevel.c
index bb040611..fe6fd6ed 100644
--- a/arch/arm/boards/samsung-exynos/lowlevel.c
+++ b/arch/arm/boards/samsung-exynos/lowlevel.c
@@ -12,6 +12,7 @@
 #include <asm/mmu.h>
 
 extern char __dtb_exynos8895_dreamlte_start[];
+extern char __dtb_exynos990_x1s_start[];
 
 /* called from assembly */
 void lowlevel_exynos(void *downstream_fdt);
@@ -55,6 +56,8 @@ static noinline void exynos_continue(void *downstream_fdt)
        /* select device tree dynamically */
        if (is_model(downstream_fdt, "Samsung DREAMLTE")) {
                __dtb_start = __dtb_exynos8895_dreamlte_start;
+       } else if (is_model(downstream_fdt, "Samsung X1S")) {
+               __dtb_start = __dtb_exynos990_x1s_start;
        } else {
                /* we didn't match any device */
                return;
diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
index a53834f7..58f05871 100644
--- a/arch/arm/dts/Makefile
+++ b/arch/arm/dts/Makefile
@@ -13,7 +13,8 @@ lwl-$(CONFIG_MACH_BEAGLEPLAY) += k3-am625-beagleplay.dtb.o 
k3-am625-r5-beaglepla
 lwl-$(CONFIG_MACH_CLEP7212) += ep7212-clep7212.dtb.o
 lwl-$(CONFIG_MACH_CM_FX6) += imx6dl-cm-fx6.dtb.o imx6q-cm-fx6.dtb.o 
imx6q-utilite.dtb.o
 lwl-$(CONFIG_MACH_DFI_FS700_M60) += imx6q-dfi-fs700-m60-6q.dtb.o 
imx6dl-dfi-fs700-m60-6s.dtb.o
-lwl-$(CONFIG_MACH_EXYNOS) += exynos8895-dreamlte.dtb.o
+lwl-$(CONFIG_MACH_EXYNOS) += exynos8895-dreamlte.dtb.o \
+                       exynos990-x1s.dtb.o
 lwl-$(CONFIG_MACH_DUCKBILL) += imx28-duckbill.dtb.o
 lwl-$(CONFIG_MACH_KINDLE_MX50) += imx50-kindle-d01100.dtb.o 
imx50-kindle-d01200.dtb.o imx50-kindle-ey21.dtb.o
 lwl-$(CONFIG_MACH_EFIKA_MX_SMARTBOOK) += imx51-genesi-efika-sb.dtb.o
diff --git a/arch/arm/dts/exynos990-x1s.dts b/arch/arm/dts/exynos990-x1s.dts
new file mode 100644
index 00000000..19d59eaa
--- /dev/null
+++ b/arch/arm/dts/exynos990-x1s.dts
@@ -0,0 +1,13 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/*
+ * Samsung Galaxy S20 5G (x1s/SM-G981B) barebox device tree source
+ *
+ * Copyright (c) 2025, Ivaylo Ivanov <ivo.ivanov.ivan...@gmail.com>
+ */
+
+/dts-v1/;
+#include <arm64/exynos/exynos990-x1s.dts>
+
+/ {
+       barebox,deep-probe;
+};
-- 
2.43.0


Reply via email to