From 6e604e9875c6dfdc44345254cc4c86bfe3694902 Mon Sep 17 00:00:00 2001
From: coolsnowwolf <coolsnowwolf@gmail.com>
Date: Mon, 6 May 2024 05:53:58 +0800
Subject: [PATCH] amlogic: add mesongx Phicomm N1 support

---
 package/boot/uboot-amlogic/Makefile           |  57 ++
 package/kernel/mac80211/broadcom.mk           |   1 +
 target/linux/{meson => amlogic}/Makefile      |  10 +-
 target/linux/amlogic/config-5.15              |  46 ++
 .../arch/arm/boot/dts/meson8b-onecloud.dts    |   0
 target/linux/amlogic/image/Makefile           |  91 +++
 target/linux/amlogic/image/aml_autoscript.cmd |  10 +
 target/linux/amlogic/image/amlogic.bootscript |  34 +
 .../linux/{meson => amlogic}/image/boot.txt   |   0
 .../linux/amlogic/image/emmc_autoscript.cmd   |   8 +
 .../image/gen_aml_emmc_img.sh                 |   0
 .../linux/amlogic/image/gen_amlogic_image.sh  |  60 ++
 target/linux/amlogic/image/meson8b.mk         |  18 +
 target/linux/amlogic/image/mesongx.mk         |  19 +
 .../linux/amlogic/image/s905_autoscript.cmd   |  16 +
 .../meson8b}/base-files/etc/inittab           |   0
 .../meson8b}/base-files/etc/rc.local          |   0
 .../base-files/lib/preinit/79_move_config     |   0
 .../base-files/lib/upgrade/platform.sh        |   0
 .../meson8b}/base-files/root/resize.sh        |   0
 .../{meson => amlogic}/meson8b/config-6.1     |   0
 .../{meson => amlogic}/meson8b/target.mk      |   0
 .../mesongx/base-files/etc/board.d/02_network |  59 ++
 .../uci-defaults/12_enable-netifd-smp-tune    |   7 +
 .../base-files/lib/preinit/79_move_config     |  16 +
 .../base-files/lib/upgrade/platform.sh        |  84 +++
 .../base-files/usr/sbin/install-to-emmc.sh    | 144 ++++
 target/linux/amlogic/mesongx/config-5.15      | 710 ++++++++++++++++++
 target/linux/amlogic/mesongx/target.mk        |  12 +
 target/linux/amlogic/modules.mk               |  15 +
 .../001-dts-s905d-fix-high-load.patch         |  21 +
 .../002-dts-improve-phicomm-n1-support.patch  |  49 ++
 .../902-use-system-LED-for-OpenWrt.patch      |   0
 .../903-add-dts-and-identify-emmc.patch       |   0
 ...n-modify-and-simplify-calculation-in.patch |   0
 target/linux/meson/image/Makefile             |  57 --
 36 files changed, 1482 insertions(+), 62 deletions(-)
 create mode 100644 package/boot/uboot-amlogic/Makefile
 rename target/linux/{meson => amlogic}/Makefile (71%)
 create mode 100644 target/linux/amlogic/config-5.15
 rename target/linux/{meson => amlogic}/files/arch/arm/boot/dts/meson8b-onecloud.dts (100%)
 create mode 100644 target/linux/amlogic/image/Makefile
 create mode 100644 target/linux/amlogic/image/aml_autoscript.cmd
 create mode 100644 target/linux/amlogic/image/amlogic.bootscript
 rename target/linux/{meson => amlogic}/image/boot.txt (100%)
 create mode 100755 target/linux/amlogic/image/emmc_autoscript.cmd
 rename target/linux/{meson => amlogic}/image/gen_aml_emmc_img.sh (100%)
 create mode 100755 target/linux/amlogic/image/gen_amlogic_image.sh
 create mode 100644 target/linux/amlogic/image/meson8b.mk
 create mode 100644 target/linux/amlogic/image/mesongx.mk
 create mode 100755 target/linux/amlogic/image/s905_autoscript.cmd
 rename target/linux/{meson => amlogic/meson8b}/base-files/etc/inittab (100%)
 rename target/linux/{meson => amlogic/meson8b}/base-files/etc/rc.local (100%)
 rename target/linux/{meson => amlogic/meson8b}/base-files/lib/preinit/79_move_config (100%)
 rename target/linux/{meson => amlogic/meson8b}/base-files/lib/upgrade/platform.sh (100%)
 rename target/linux/{meson => amlogic/meson8b}/base-files/root/resize.sh (100%)
 rename target/linux/{meson => amlogic}/meson8b/config-6.1 (100%)
 rename target/linux/{meson => amlogic}/meson8b/target.mk (100%)
 create mode 100755 target/linux/amlogic/mesongx/base-files/etc/board.d/02_network
 create mode 100755 target/linux/amlogic/mesongx/base-files/etc/uci-defaults/12_enable-netifd-smp-tune
 create mode 100644 target/linux/amlogic/mesongx/base-files/lib/preinit/79_move_config
 create mode 100644 target/linux/amlogic/mesongx/base-files/lib/upgrade/platform.sh
 create mode 100755 target/linux/amlogic/mesongx/base-files/usr/sbin/install-to-emmc.sh
 create mode 100644 target/linux/amlogic/mesongx/config-5.15
 create mode 100644 target/linux/amlogic/mesongx/target.mk
 create mode 100644 target/linux/amlogic/modules.mk
 create mode 100644 target/linux/amlogic/patches-5.15/001-dts-s905d-fix-high-load.patch
 create mode 100644 target/linux/amlogic/patches-5.15/002-dts-improve-phicomm-n1-support.patch
 rename target/linux/{meson => amlogic}/patches-6.1/902-use-system-LED-for-OpenWrt.patch (100%)
 rename target/linux/{meson => amlogic}/patches-6.1/903-add-dts-and-identify-emmc.patch (100%)
 rename target/linux/{meson => amlogic}/patches-6.1/905-pwm-meson-modify-and-simplify-calculation-in.patch (100%)
 delete mode 100644 target/linux/meson/image/Makefile

diff --git a/package/boot/uboot-amlogic/Makefile b/package/boot/uboot-amlogic/Makefile
new file mode 100644
index 000000000..93e8f3bdb
--- /dev/null
+++ b/package/boot/uboot-amlogic/Makefile
@@ -0,0 +1,57 @@
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+include $(TOPDIR)/rules.mk
+
+PKG_VERSION:=20240315
+PKG_RELEASE:=$(AUTORELEASE)
+
+PKG_SOURCE_PROTO:=default
+PKG_SOURCE:=ophub-uboot-prebuilt-git-$(PKG_VERSION).tar.gz
+PKG_SOURCE_VERSION:=abe491ab386607f9ab0d66728e5766bc5d7e8a20
+PKG_SOURCE_URL_FILE:=$(PKG_SOURCE_VERSION).tar.gz
+PKG_SOURCE_URL:=https://github.com/ophub/u-boot/archive/
+PKG_HASH:=3f98f5728f48d13f33cf4fd21fb6032a625ad3c61aa2e8073dda821f71f067ec
+
+PKG_MAINTAINER:=ophub
+
+include $(INCLUDE_DIR)/u-boot.mk
+include $(INCLUDE_DIR)/package.mk
+
+TAR_OPTIONS:=--strip-components 1 $(TAR_OPTIONS)
+TAR_CMD=$(HOST_TAR) -C $(1) $(TAR_OPTIONS)
+
+define U-Boot/Default
+  BUILD_TARGET:=amlogic
+  UENV:=default
+  HIDDEN:=1
+  DEFAULT:=y
+endef
+
+define U-Boot/phicomm-n1
+  NAME:=Phicomm N1
+  OVERLAY:=u-boot-n1.bin
+  BUILD_SUBTARGET:=mesongx
+  BUILD_DEVICES:=phicomm_n1
+endef
+
+UBOOT_TARGETS := phicomm-n1
+
+define Build/Configure
+	true
+endef
+
+define Build/Compile
+	true
+endef
+
+define Build/InstallDev
+	$(INSTALL_DIR) $(STAGING_DIR_IMAGE)
+	$(CP) $(PKG_BUILD_DIR)/u-boot/amlogic/overload/$(OVERLAY) $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-u-boot-overlay.bin
+endef
+
+define Package/u-boot/install/default
+endef
+
+$(eval $(call BuildPackage/U-Boot))
diff --git a/package/kernel/mac80211/broadcom.mk b/package/kernel/mac80211/broadcom.mk
index 67d04192c..a36f92477 100644
--- a/package/kernel/mac80211/broadcom.mk
+++ b/package/kernel/mac80211/broadcom.mk
@@ -432,6 +432,7 @@ define KernelPackage/brcmfmac/config
 		default y if TARGET_bcm27xx
 		default y if TARGET_sunxi
 		default y if TARGET_rockchip
+		default y if TARGET_amlogic
 		default n
 		help
 		  Enable support for cards attached to an SDIO bus.
diff --git a/target/linux/meson/Makefile b/target/linux/amlogic/Makefile
similarity index 71%
rename from target/linux/meson/Makefile
rename to target/linux/amlogic/Makefile
index 19e97332a..31dfb3ab1 100644
--- a/target/linux/meson/Makefile
+++ b/target/linux/amlogic/Makefile
@@ -4,11 +4,11 @@
 
 include $(TOPDIR)/rules.mk
 
-ARCH:=arm
-BOARD:=meson
+BOARD:=amlogic
+BOARDNAME:=Amlogic
 BOARDNAME:=Amlogic Meson family
-FEATURES:=boot-part ext4 fpu legacy-sdcard squashfs usbgadget
-SUBTARGETS:=meson8b
+FEATURES:=boot-part ext4 audio usb fpu legacy-sdcard squashfs usbgadget display gpio fpu pci pcie
+SUBTARGETS:=meson8b mesongx
 
 KERNEL_PATCHVER:=6.1
 
@@ -25,7 +25,7 @@ DEFAULT_PACKAGES += \
 	automount \
 	resize2fs \
 	partx-utils \
-	losetup
+	losetup htop autocore-arm
 
 KERNELNAME:=Image dtbs
 
diff --git a/target/linux/amlogic/config-5.15 b/target/linux/amlogic/config-5.15
new file mode 100644
index 000000000..6922acd2f
--- /dev/null
+++ b/target/linux/amlogic/config-5.15
@@ -0,0 +1,46 @@
+CONFIG_AMLOGIC_THERMAL=y
+CONFIG_CONSOLE_TRANSLATIONS=y
+CONFIG_DEVFREQ_THERMAL=y
+# CONFIG_DRM_MESON is not set
+# CONFIG_DRM_MESON_DW_HDMI is not set
+CONFIG_HW_CONSOLE=y
+CONFIG_HW_RANDOM_MESON=y
+CONFIG_HW_RANDOM_OPTEE=y
+CONFIG_INPUT=y
+CONFIG_KVM_ARM_PMU=y
+# CONFIG_MAX77620_WATCHDOG is not set
+# CONFIG_MAX77620_THERMAL is not set
+CONFIG_MESON_EFUSE=y
+# CONFIG_MESON_MX_EFUSE is not set
+# CONFIG_MFD_KHADAS_MCU is not set
+# CONFIG_MMC_DEBUG is not set
+# CONFIG_MMC_UNSAFE_RESUME is not set
+# CONFIG_MMC_TIFM_SD is not set
+# CONFIG_MMC_WBSD is not set
+# CONFIG_NVMEM_SPMI_SDAM is not set
+# CONFIG_PHY_MESON8B_USB2 is not set
+# CONFIG_PINCTRL_MESON8_PMX is not set
+# CONFIG_REGULATOR_S2MPA01 is not set
+# CONFIG_REGULATOR_S2MPS11 is not set
+# CONFIG_REGULATOR_S5M8767 is not set
+# CONFIG_REGULATOR_VEXPRESS is not set
+# CONFIG_SDIO_UART is not set
+CONFIG_SENSORS_ARM_SCMI=y
+CONFIG_SENSORS_ARM_SCPI=y
+# CONFIG_SND_MESON_AIU is not set
+# CONFIG_SND_MESON_AXG_FRDDR is not set
+# CONFIG_SND_MESON_AXG_TODDR is not set
+# CONFIG_SND_MESON_AXG_TDMIN is not set
+# CONFIG_SND_MESON_AXG_TDMOUT is not set
+# CONFIG_SND_MESON_AXG_SOUND_CARD is not set
+# CONFIG_SND_MESON_AXG_SPDIFOUT is not set
+# CONFIG_SND_MESON_AXG_SPDIFIN is not set
+# CONFIG_SND_MESON_AXG_PDM is not set
+# CONFIG_SND_MESON_GX_SOUND_CARD is not set
+# CONFIG_SND_MESON_G12A_TOACODEC is not set
+# CONFIG_SND_MESON_G12A_TOHDMITX is not set
+# CONFIG_SND_SOC_MESON_T9015 is not set
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_VT_CONSOLE_SLEEP=y
+CONFIG_VT_HW_CONSOLE_BINDING=y
diff --git a/target/linux/meson/files/arch/arm/boot/dts/meson8b-onecloud.dts b/target/linux/amlogic/files/arch/arm/boot/dts/meson8b-onecloud.dts
similarity index 100%
rename from target/linux/meson/files/arch/arm/boot/dts/meson8b-onecloud.dts
rename to target/linux/amlogic/files/arch/arm/boot/dts/meson8b-onecloud.dts
diff --git a/target/linux/amlogic/image/Makefile b/target/linux/amlogic/image/Makefile
new file mode 100644
index 000000000..3190b93d7
--- /dev/null
+++ b/target/linux/amlogic/image/Makefile
@@ -0,0 +1,91 @@
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+include $(TOPDIR)/rules.mk
+include $(INCLUDE_DIR)/image.mk
+
+DEVICE_VARS += UBOOT_DEVICE_NAME
+
+FAT32_BLOCK_SIZE=1024
+FAT32_BLOCKS=$(shell echo $$(($(CONFIG_TARGET_KERNEL_PARTSIZE)*1024*1024/$(FAT32_BLOCK_SIZE))))
+
+define Build/boot-script
+	# Make an U-boot image and copy it to the boot partition
+	mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "boot.scr" -d boot.txt  $(KDIR)/boot.scr
+endef
+
+define Build/emmc-common
+	$(RM) -f $@.boot
+	mkfs.fat -C $@.boot $(FAT32_BLOCKS)
+
+	mkdir -p $(KDIR)/boot.fat
+
+	$(CP) $(KDIR)/boot.scr $(KDIR)/boot.fat/boot.scr
+	mcopy -i $@.boot $(KDIR)/boot.scr ::
+	$(CP) $(IMAGE_KERNEL) $(KDIR)/boot.fat/uImage
+	mcopy -i $@.boot $(KDIR)/boot.fat/uImage ::
+
+	$(foreach dts,$(shell echo $(DEVICE_DTS)),$(CP) $(DTS_DIR)/$(dts).dtb $(KDIR)/boot.fat/dtb;)
+	mcopy -i $@.boot $(KDIR)/boot.fat/dtb ::
+
+	$(RM) -rf $(KDIR)/boot.fat
+
+	./gen_aml_emmc_img.sh $@ $@.boot $(IMAGE_ROOTFS) \
+		$(CONFIG_TARGET_KERNEL_PARTSIZE) $(CONFIG_TARGET_ROOTFS_PARTSIZE)
+endef
+
+### Image scripts ###
+
+define Build/boot-common
+	# This creates a new folder copies the dtb (as amlogic.dtb) 
+	# and the kernel image (as kernel.img)
+	rm -fR $@.boot
+	mkdir -p $@.boot
+
+	$(CP) $(KDIR)/image-$(firstword $(DEVICE_DTS)).dtb $@.boot/amlogic.dtb
+	$(CP) $(IMAGE_KERNEL) $@.boot/kernel.img
+	$(CP) "$(STAGING_DIR_IMAGE)"/$(UBOOT_DEVICE_NAME)-u-boot-overlay.bin $@.boot/u-boot.emmc
+endef
+
+define Build/boot-combined
+	# This creates a new folder copies the dtbs (as amlogic*.dtb) 
+	# and the kernel image (as kernel.img)
+	rm -fR $@.boot
+	mkdir -p $@.boot
+
+	i=0; \
+	for dts in $(DEVICE_DTS); do \
+		$(CP) $(KDIR)/image-$${dts}.dtb $@.boot/amlogic$$(perl -e 'printf "%b\n",'$$i).dtb; \
+		let i+=1; \
+	done
+	$(CP) $(IMAGE_KERNEL) $@.boot/kernel.img
+	$(CP) "$(STAGING_DIR_IMAGE)"/$(UBOOT_DEVICE_NAME)-u-boot-overlay.bin $@.boot/u-boot.emmc
+endef
+
+define Build/boot-combined-script
+	# Make an U-boot image and copy it to the boot partition
+	mkimage -A arm -O linux -T script -C none -a 0 -e 0 -d aml_autoscript.cmd $@.boot/aml_autoscript
+	mkimage -A arm -O linux -T script -C none -a 0 -e 0 -d emmc_autoscript.cmd $@.boot/emmc_autoscript
+	mkimage -A arm -O linux -T script -C none -a 0 -e 0 -d s905_autoscript.cmd $@.boot/s905_autoscript
+	mkimage -A arm -O linux -T script -C none -a 0 -e 0 -d $(if $(1),$(1),amlogic).bootscript $@.boot/boot.scr
+endef
+
+define Build/aml-img
+	# Creates the final SD/USB images, 
+	# combining boot partition, root partition
+
+	SIGNATURE="$(IMG_PART_SIGNATURE)" \
+		./gen_amlogic_image.sh \
+		$@ \
+		64 $@.boot \
+		256 $(IMAGE_ROOTFS) \
+		2048
+
+endef
+
+### Devices ###
+
+include $(SUBTARGET).mk
+
+$(eval $(call BuildImage))
diff --git a/target/linux/amlogic/image/aml_autoscript.cmd b/target/linux/amlogic/image/aml_autoscript.cmd
new file mode 100644
index 000000000..637f7e4cd
--- /dev/null
+++ b/target/linux/amlogic/image/aml_autoscript.cmd
@@ -0,0 +1,10 @@
+if printenv bootfromsd; then exit; else setenv ab 0; fi;
+setenv bootcmd 'run start_autoscript; run storeboot'
+setenv start_autoscript 'if mmcinfo; then run start_mmc_autoscript; fi; if usb start; then run start_usb_autoscript; fi; run start_emmc_autoscript'
+setenv start_emmc_autoscript 'if fatload mmc 1 1020000 emmc_autoscript; then autoscr 1020000; fi;'
+setenv start_mmc_autoscript 'if fatload mmc 0 1020000 s905_autoscript; then env delete usbdev; autoscr 1020000; fi;'
+setenv start_usb_autoscript 'for usbdev in 0 1 2 3; do if fatload usb ${usbdev} 1020000 s905_autoscript; then autoscr 1020000; fi; done'
+setenv upgrade_step 2
+saveenv
+sleep 1
+reboot
\ No newline at end of file
diff --git a/target/linux/amlogic/image/amlogic.bootscript b/target/linux/amlogic/image/amlogic.bootscript
new file mode 100644
index 000000000..3369e5c4f
--- /dev/null
+++ b/target/linux/amlogic/image/amlogic.bootscript
@@ -0,0 +1,34 @@
+echo "Start AMLOGIC mainline U-boot"
+setenv l_mmc "0"
+for l_devtype in "sd usb mmc" ; do
+	if test "${l_devtype}" = "usb"; then
+		setenv l_mmc "0 1 2 3"
+	fi
+	if test "${l_devtype}" = "mmc"; then
+		setenv l_mmc "1"
+	fi
+	if test "${l_devtype}" = "sd"; then
+		setenv devtype "mmc"
+	else
+		setenv devtype "${l_devtype}"
+	fi
+	for devnum in ${l_mmc} ; do
+		if test -e ${devtype} ${devnum}:1 /boot.scr; then
+			part uuid ${devtype} ${devnum}:2 uuid
+			setenv bootargs "console=tty0 no_console_suspend consoleblank=0 console=ttyAML0,115200n8 root=PARTUUID=${uuid} rw rootwait"
+			if printenv mac; then
+				setenv bootargs ${bootargs} mac=${mac}
+			elif printenv eth_mac; then
+				setenv bootargs ${bootargs} mac=${eth_mac}
+			elif printenv ethaddr; then
+				setenv bootargs ${bootargs} mac=${ethaddr}
+			fi
+			load ${devtype} ${devnum}:1 ${fdt_addr_r} /amlogic.dtb
+			load ${devtype} ${devnum}:1 ${kernel_addr_r} /kernel.img
+			fdt addr ${fdt_addr_r}
+			booti ${kernel_addr_r} - ${fdt_addr_r}
+		fi
+	done
+done
+# Recompile with:
+# mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr
\ No newline at end of file
diff --git a/target/linux/meson/image/boot.txt b/target/linux/amlogic/image/boot.txt
similarity index 100%
rename from target/linux/meson/image/boot.txt
rename to target/linux/amlogic/image/boot.txt
diff --git a/target/linux/amlogic/image/emmc_autoscript.cmd b/target/linux/amlogic/image/emmc_autoscript.cmd
new file mode 100755
index 000000000..eec1c7fd2
--- /dev/null
+++ b/target/linux/amlogic/image/emmc_autoscript.cmd
@@ -0,0 +1,8 @@
+if fatload mmc 1 0x1000000 u-boot.emmc; then go 0x1000000; fi;
+setenv dtb_addr 0x1000000
+setenv env_addr 0x1040000
+setenv kernel_addr 0x11000000
+setenv initrd_addr 0x13000000
+setenv boot_start booti ${kernel_addr} ${initrd_addr} ${dtb_addr}
+setenv addmac 'if printenv mac; then setenv bootargs ${bootargs} mac=${mac}; elif printenv eth_mac; then setenv bootargs ${bootargs} mac=${eth_mac}; elif printenv ethaddr; then setenv bootargs ${bootargs} mac=${ethaddr}; fi'
+if fatload mmc 1 ${env_addr} uEnv.txt && env import -t ${env_addr} ${filesize}; setenv bootargs ${APPEND}; then if fatload mmc 1 ${kernel_addr} ${LINUX}; then if fatload mmc 1 ${initrd_addr} ${INITRD}; then if fatload mmc 1 ${dtb_addr} ${FDT}; then run addmac; run boot_start; fi; fi; fi; fi;
diff --git a/target/linux/meson/image/gen_aml_emmc_img.sh b/target/linux/amlogic/image/gen_aml_emmc_img.sh
similarity index 100%
rename from target/linux/meson/image/gen_aml_emmc_img.sh
rename to target/linux/amlogic/image/gen_aml_emmc_img.sh
diff --git a/target/linux/amlogic/image/gen_amlogic_image.sh b/target/linux/amlogic/image/gen_amlogic_image.sh
new file mode 100755
index 000000000..650df1304
--- /dev/null
+++ b/target/linux/amlogic/image/gen_amlogic_image.sh
@@ -0,0 +1,60 @@
+#!/bin/sh
+# Copyright (C) 2006-2012 OpenWrt.org
+set -e -x
+if [ $# -ne 5 ] && [ $# -ne 6 ]; then
+    echo "SYNTAX: $0 <file> <kernel size> <kernel directory> <rootfs size> <rootfs image> [<align>]"
+    exit 1
+fi
+
+OUTPUT="$1"
+KERNELSIZE="$2"
+KERNELDIR="$3"
+ROOTFSSIZE="$4"
+ROOTFSIMAGE="$5"
+ALIGN="$6"
+USERDATASIZE="2048"
+
+rm -f "$OUTPUT"
+
+head=16
+sect=63
+
+# create partition table
+set $(ptgen -o "$OUTPUT" -h $head -s $sect -p "${KERNELSIZE}m" -p "${ROOTFSSIZE}m" -p "${USERDATASIZE}m" ${ALIGN:+-l $ALIGN} ${SIGNATURE:+-S 0x$SIGNATURE})
+
+KERNELOFFSET="$(($1 / 512))"
+KERNELSIZE="$2"
+ROOTFSOFFSET="$(($3 / 512))"
+ROOTFSSIZE="$(($4 / 512))"
+USERDATAOFFSET="$(($5 / 512))"
+USERDATASIZE="$(($6 / 512))"
+
+# Using mcopy -s ... is using READDIR(3) to iterate through the directory
+# entries, hence they end up in the FAT filesystem in traversal order which
+# breaks reproducibility.
+# Implement recursive copy with reproducible order.
+dos_dircopy() {
+  local entry
+  local baseentry
+  for entry in "$1"/* ; do
+    if [ -f "$entry" ]; then
+      mcopy -i "$OUTPUT.kernel" "$entry" ::"$2"
+    elif [ -d "$entry" ]; then
+      baseentry="$(basename "$entry")"
+      mmd -i "$OUTPUT.kernel" ::"$2""$baseentry"
+      dos_dircopy "$entry" "$2""$baseentry"/
+    fi
+  done
+}
+
+dd if=/dev/zero of="$OUTPUT" bs=512 seek="$ROOTFSOFFSET" conv=notrunc count="$ROOTFSSIZE"
+dd if="$ROOTFSIMAGE" of="$OUTPUT" bs=512 seek="$ROOTFSOFFSET" conv=notrunc
+
+[ -n "$PADDING" ] && dd if=/dev/zero of="$OUTPUT" bs=512 seek="$USERDATAOFFSET" conv=notrunc count="$USERDATASIZE"
+echo "RESET000" | dd of="$OUTPUT" bs=512 seek="$USERDATAOFFSET" conv=notrunc,sync count=1
+
+mkfs.fat --invariant -n kernel -C "$OUTPUT.kernel" -S 512 "$((KERNELSIZE / 1024))"
+LC_ALL=C dos_dircopy "$KERNELDIR" /
+
+dd if="$OUTPUT.kernel" of="$OUTPUT" bs=512 seek="$KERNELOFFSET" conv=notrunc
+rm -f "$OUTPUT.kernel"
diff --git a/target/linux/amlogic/image/meson8b.mk b/target/linux/amlogic/image/meson8b.mk
new file mode 100644
index 000000000..bab17477e
--- /dev/null
+++ b/target/linux/amlogic/image/meson8b.mk
@@ -0,0 +1,18 @@
+
+define Device/Default
+  FILESYSTEMS := ext4
+  IMAGES := emmc.img
+  KERNEL_DEPENDS = $$(wildcard $(DTS_DIR)/$$(DEVICE_DTS).dts)
+  KERNEL_LOADADDR := 0x01080000
+  KERNEL_NAME := Image
+  KERNEL := kernel-bin | uImage none
+  PROFILES = Default $$(DEVICE_NAME)
+endef
+
+define Device/thunder-onecloud
+  DEVICE_DTS := meson8b-onecloud
+  DEVICE_TITLE := Thunder OneCloud
+  KERNEL_LOADADDR := 0x00208000
+  IMAGE/emmc.img := boot-script onecloud | emmc-common $$(DEVICE_NAME)
+endef
+TARGET_DEVICES += thunder-onecloud
diff --git a/target/linux/amlogic/image/mesongx.mk b/target/linux/amlogic/image/mesongx.mk
new file mode 100644
index 000000000..c285014d8
--- /dev/null
+++ b/target/linux/amlogic/image/mesongx.mk
@@ -0,0 +1,19 @@
+# SPDX-License-Identifier: GPL-2.0-only
+
+define Device/Default
+  PROFILES := Default
+  KERNEL := kernel-bin
+  IMAGES := sysupgrade.img.gz
+  DEVICE_DTS_DIR := $(DTS_DIR)/amlogic
+  DEVICE_DTS = $$(SOC)-$(subst _,-,$(1))
+endef
+
+define Device/phicomm_n1
+  DEVICE_VENDOR := Phicomm
+  DEVICE_MODEL := N1
+  SOC := meson-gxl-s905d
+  UBOOT_DEVICE_NAME := phicomm-n1
+  IMAGE/sysupgrade.img.gz := boot-common | boot-combined-script | aml-img | gzip | append-metadata
+  DEVICE_PACKAGES := ethtool kmod-brcmfmac brcmfmac-firmware-43455-sdio-phicomm-n1 wpad-openssl
+endef
+TARGET_DEVICES += phicomm_n1
\ No newline at end of file
diff --git a/target/linux/amlogic/image/s905_autoscript.cmd b/target/linux/amlogic/image/s905_autoscript.cmd
new file mode 100755
index 000000000..16ad8df4b
--- /dev/null
+++ b/target/linux/amlogic/image/s905_autoscript.cmd
@@ -0,0 +1,16 @@
+if test "${usbdev}" = ""; then
+	setenv devtype "mmc"
+	setenv devnum 0
+else
+	setenv devtype "usb"
+	setenv devnum ${usbdev}
+fi
+
+if fatload ${devtype} ${devnum} 0x1000000 u-boot.emmc; then go 0x1000000; fi;
+setenv dtb_addr 0x1000000
+setenv env_addr 0x1040000
+setenv kernel_addr 0x11000000
+setenv initrd_addr 0x13000000
+setenv boot_start booti ${kernel_addr} ${initrd_addr} ${dtb_addr}
+setenv addmac 'if printenv mac; then setenv bootargs ${bootargs} mac=${mac}; elif printenv eth_mac; then setenv bootargs ${bootargs} mac=${eth_mac}; elif printenv ethaddr; then setenv bootargs ${bootargs} mac=${ethaddr}; fi'
+if fatload ${devtype} ${devnum} ${env_addr} uEnv.txt && env import -t ${env_addr} ${filesize}; setenv bootargs ${APPEND}; then if fatload ${devtype} ${devnum} ${kernel_addr} ${LINUX}; then if fatload ${devtype} ${devnum} ${initrd_addr} ${INITRD}; then if fatload ${devtype} ${devnum} ${dtb_addr} ${FDT}; then run addmac; run boot_start; fi; fi; fi; fi;
diff --git a/target/linux/meson/base-files/etc/inittab b/target/linux/amlogic/meson8b/base-files/etc/inittab
similarity index 100%
rename from target/linux/meson/base-files/etc/inittab
rename to target/linux/amlogic/meson8b/base-files/etc/inittab
diff --git a/target/linux/meson/base-files/etc/rc.local b/target/linux/amlogic/meson8b/base-files/etc/rc.local
similarity index 100%
rename from target/linux/meson/base-files/etc/rc.local
rename to target/linux/amlogic/meson8b/base-files/etc/rc.local
diff --git a/target/linux/meson/base-files/lib/preinit/79_move_config b/target/linux/amlogic/meson8b/base-files/lib/preinit/79_move_config
similarity index 100%
rename from target/linux/meson/base-files/lib/preinit/79_move_config
rename to target/linux/amlogic/meson8b/base-files/lib/preinit/79_move_config
diff --git a/target/linux/meson/base-files/lib/upgrade/platform.sh b/target/linux/amlogic/meson8b/base-files/lib/upgrade/platform.sh
similarity index 100%
rename from target/linux/meson/base-files/lib/upgrade/platform.sh
rename to target/linux/amlogic/meson8b/base-files/lib/upgrade/platform.sh
diff --git a/target/linux/meson/base-files/root/resize.sh b/target/linux/amlogic/meson8b/base-files/root/resize.sh
similarity index 100%
rename from target/linux/meson/base-files/root/resize.sh
rename to target/linux/amlogic/meson8b/base-files/root/resize.sh
diff --git a/target/linux/meson/meson8b/config-6.1 b/target/linux/amlogic/meson8b/config-6.1
similarity index 100%
rename from target/linux/meson/meson8b/config-6.1
rename to target/linux/amlogic/meson8b/config-6.1
diff --git a/target/linux/meson/meson8b/target.mk b/target/linux/amlogic/meson8b/target.mk
similarity index 100%
rename from target/linux/meson/meson8b/target.mk
rename to target/linux/amlogic/meson8b/target.mk
diff --git a/target/linux/amlogic/mesongx/base-files/etc/board.d/02_network b/target/linux/amlogic/mesongx/base-files/etc/board.d/02_network
new file mode 100755
index 000000000..187c66c7a
--- /dev/null
+++ b/target/linux/amlogic/mesongx/base-files/etc/board.d/02_network
@@ -0,0 +1,59 @@
+#!/bin/sh
+#
+# Copyright (C) 2013-2015 OpenWrt.org
+#
+
+. /lib/functions/uci-defaults.sh
+. /lib/functions/system.sh
+
+amlogic_setup_interfaces()
+{
+	local board="$1"
+
+	case "$board" in
+	*)
+		ucidef_set_interface_lan 'eth0'
+		;;
+	esac
+}
+
+generate_mac_from_mmc()
+{
+	local sd_hash
+	local bootdisk=$(
+		. /lib/upgrade/common.sh
+		export_bootdevice && export_partdevice bootdisk 0 && echo $bootdisk
+	)
+	if echo "$bootdisk" | grep -q '^mmcblk' && [ -f "/sys/class/block/$bootdisk/device/cid" ]; then
+		sd_hash=$(sha256sum /sys/class/block/$bootdisk/device/cid | head -n 1)
+	else
+		sd_hash=$(sha256sum /sys/class/block/mmcblk*/device/cid | head -n 1)
+	fi
+	local mac_base=$(macaddr_canonicalize "$(echo "${sd_hash}" | dd bs=1 count=12 2>/dev/null)")
+	echo "$(macaddr_unsetbit_mc "$(macaddr_setbit_la "${mac_base}")")"
+}
+
+amlogic_setup_macs()
+{
+	local board="$1"
+	local lan_mac=""
+	local wan_mac=""
+
+	case "$board" in
+	*)
+		lan_mac=$(generate_mac_from_mmc)
+		;;
+	esac
+
+	[ -n "$wan_mac" ] && ucidef_set_interface_macaddr "wan" $wan_mac
+	[ -n "$lan_mac" ] && ucidef_set_interface_macaddr "lan" $lan_mac
+}
+
+
+board_config_update
+board=$(board_name)
+amlogic_setup_interfaces $board
+amlogic_setup_macs $board
+board_config_flush
+
+exit 0
diff --git a/target/linux/amlogic/mesongx/base-files/etc/uci-defaults/12_enable-netifd-smp-tune b/target/linux/amlogic/mesongx/base-files/etc/uci-defaults/12_enable-netifd-smp-tune
new file mode 100755
index 000000000..e6a9e6a9a
--- /dev/null
+++ b/target/linux/amlogic/mesongx/base-files/etc/uci-defaults/12_enable-netifd-smp-tune
@@ -0,0 +1,7 @@
+#!/bin/sh
+uci -q batch <<-EOF >/dev/null
+	set network.globals.packet_steering=1
+	commit network
+EOF
+
+exit 0
diff --git a/target/linux/amlogic/mesongx/base-files/lib/preinit/79_move_config b/target/linux/amlogic/mesongx/base-files/lib/preinit/79_move_config
new file mode 100644
index 000000000..10d9181d5
--- /dev/null
+++ b/target/linux/amlogic/mesongx/base-files/lib/preinit/79_move_config
@@ -0,0 +1,16 @@
+move_config() {
+	local partdev parttype=ext4
+
+	. /lib/upgrade/common.sh
+
+	if export_bootdevice && export_partdevice partdev 1; then
+		mkdir -p /boot
+		part_magic_fat "/dev/$partdev" && parttype=vfat
+		mount -t $parttype -o rw,noatime "/dev/$partdev" /boot
+		if [ -f "/boot/$BACKUP_FILE" ]; then
+			mv -f "/boot/$BACKUP_FILE" /
+		fi
+	fi
+}
+
+boot_hook_add preinit_mount_root move_config
diff --git a/target/linux/amlogic/mesongx/base-files/lib/upgrade/platform.sh b/target/linux/amlogic/mesongx/base-files/lib/upgrade/platform.sh
new file mode 100644
index 000000000..8de2e1a9a
--- /dev/null
+++ b/target/linux/amlogic/mesongx/base-files/lib/upgrade/platform.sh
@@ -0,0 +1,84 @@
+
+platform_check_image() {
+	local diskdev partdev diff
+
+	export_bootdevice && export_partdevice diskdev 0 || {
+		v "Unable to determine upgrade device"
+		return 1
+	}
+	[ "$SAVE_CONFIG" -eq 1 ] && return 0
+
+	get_partitions "/dev/$diskdev" bootdisk
+
+	#extract the boot sector from the image
+	get_image "$@" | dd of=/tmp/image.bs count=1 bs=512b 2>/dev/null
+
+	get_partitions /tmp/image.bs image
+
+	#compare tables
+	diff="$(grep -F -x -v -f /tmp/partmap.bootdisk /tmp/partmap.image)"
+
+	rm -f /tmp/image.bs /tmp/partmap.bootdisk /tmp/partmap.image
+
+	if [ -n "$diff" ]; then
+		v "Partition layout has changed. Full image will be written."
+		ask_bool 0 "Abort" && exit 1
+		return 0
+	fi
+}
+
+platform_do_upgrade() {
+	local diskdev partdev part start size cursize
+
+	export_bootdevice && export_partdevice diskdev 0 || {
+		v "Unable to determine upgrade device"
+		return 1
+	}
+
+	sync
+
+	get_partitions "/dev/$diskdev" bootdisk
+
+	#extract the boot sector from the image
+	get_image "$@" | dd of=/tmp/image.bs count=1 bs=512b
+
+	get_partitions /tmp/image.bs image
+
+	#iterate over each partition from the image and check boot disk partition size
+	while read part start size; do
+		if [ -n "$UPGRADE_BACKUP" -a "$part" -ge 3 ]; then
+			continue
+		fi
+		cursize=$(echo $(grep -m1 '^ *'"$part"' *' /tmp/partmap.bootdisk) | cut -d' ' -f 3)
+		if [ -z "$cursize" ]; then
+			v "Unable to find partition $part on boot disk"
+			return 1
+		fi
+		if [ "$size" -gt "$cursize" ]; then
+			v "Partition $part on image is bigger than boot disk ($size > $cursize)"
+			return 1
+		fi
+	done < /tmp/partmap.image
+
+	#iterate over each partition from the image and write it to the boot disk
+	while read part start size; do
+		if [ -n "$UPGRADE_BACKUP" -a "$part" -ge 3 ]; then
+			v "Skip partition $part >= 3 when upgrading"
+			continue
+		fi
+		if export_partdevice partdev $part; then
+			v "Writing image to /dev/$partdev..."
+			if [ "$part" -eq 3 ]; then
+				echo "RESET000" | dd of="/dev/$partdev" bs=512 count=1 conv=sync,fsync 2>/dev/null
+			else
+				get_image "$@" | dd of="/dev/$partdev" ibs="512" obs=1M skip="$start" count="$size" conv=fsync
+			fi
+		else
+			v "Unable to find partition $part device, skipped."
+		fi
+	done < /tmp/partmap.image
+
+	#copy partition uuid
+	v "Writing new UUID to /dev/$diskdev..."
+	get_image "$@" | dd of="/dev/$diskdev" bs=1 skip=440 count=4 seek=440 conv=fsync
+}
diff --git a/target/linux/amlogic/mesongx/base-files/usr/sbin/install-to-emmc.sh b/target/linux/amlogic/mesongx/base-files/usr/sbin/install-to-emmc.sh
new file mode 100755
index 000000000..299684c18
--- /dev/null
+++ b/target/linux/amlogic/mesongx/base-files/usr/sbin/install-to-emmc.sh
@@ -0,0 +1,144 @@
+#!/bin/sh
+# Copy running OpenWrt to eMMC for amlogic
+
+. /lib/functions.sh
+. /lib/functions/system.sh
+
+include /lib/upgrade
+NEWLINE="
+"
+
+function umount_disk() {
+	local mounted
+	local to="${1#/dev/}"
+	umount "/dev/$to"* 2>/dev/null
+	mounted="`mount | cut -d' ' -f1 | grep -Fm1 "/dev/$to"`"
+	if [ -n "$mounted" ] ; then
+		echo "can not umount $mounted" >&2
+		return 1
+	fi
+	return 0
+}
+
+function part_disk() {
+	local to="${1#/dev/}"
+	dd if=/dev/zero of="/dev/$to" bs=512 count=1 conv=notrunc 2>/dev/null
+	parted --script "/dev/$to" \
+		mktable msdos \
+		mkpart primary 68MiB 132MiB \
+		mkpart primary 132MiB 388MiB \
+		mkpart primary 764MiB 2812MiB
+}
+
+function get_bootdisk() {
+	local var=$1
+	local diskdev
+	export_bootdevice && export_partdevice diskdev 0 || {
+		echo "Unable to determine upgrade device" >&2
+		return 1
+	}
+	export "$var=$diskdev"
+	return 0
+}
+
+function get_emmcs() {
+	local disk index disks
+	local bootdisk=$1
+
+	index=1
+    for disk in `cd /sys/block && ls | grep '^mmcblk' | grep -Ev 'mmcblk\d+boot\d+'`; do
+        [[ "$bootdisk" = "$disk" ]] && continue
+        [ -b /dev/$disk ] && [ "`cat /sys/block/$disk/size`" -gt 0 ] || continue
+        local diskinfo="`parted -ms "/dev/$disk" unit GiB print 2>/dev/null | grep -m1 "^/dev/$disk:"`"
+        [ -z "$diskinfo" ] && continue
+        local size="`echo "$diskinfo" | cut -d: -f2`"
+		# check disk greater than 2.8GB
+        [ $(( `echo "${size%%GiB}" | sed 's/\.\(.\).*/ * 10 + \1/'` )) -ge 28 ] || continue
+        local model="`echo "$diskinfo" | cut -d: -f7 | sed 's/"/_/g'`"
+        disks="${disks}$index. $disk $size \"$model\"$NEWLINE"
+		index=$(($index + 1))
+    done
+	echo "$disks"
+	return 0
+}
+
+function get_emmc() {
+	local index
+	local var=$2
+	local emmcs="$(get_emmcs $1)"
+	[ -z "$emmcs" ] && {
+		echo "Get eMMC list failed! (Maybe already running on eMMC? Current boot disk is $1)" >&2
+		return 1
+	}
+	local count=$(echo "$emmcs" | wc -l)
+	if [ "$count" -gt 1 ]; then
+		while true; do
+			echo "Found these eMMC devices:"
+			echo "Index.  device  size  model"
+			echo "$emmcs"
+			echo -n "Select a disk to install (input index then press Enter): "
+			read index || {
+				echo "No input!" >&2
+				exit 1
+			}
+			if [ -z "$index" ]; then
+				echo "Empty input!"
+			else
+				echo "$emmcs" | grep -q "^${index}. " && break
+				echo "Wrong index!"
+			fi
+		done
+	else
+		echo "Found eMMC device:"
+		echo "Index.  device  size  model"
+		echo "$emmcs"
+		index=1
+	fi
+	local value=$(echo "$emmcs" | grep "^${index}. " | cut -d' ' -f 2)
+	export "$var=$value"
+}
+
+function main() {
+	local bootdisk yn partdev part partdevto to
+	get_bootdisk bootdisk
+	[ -z "$bootdisk" ] && return 1
+	get_emmc $bootdisk to
+	[ -n "$to" ] || return 1
+	echo -ne "Will install to $to, confirm? y/N [n]\b\b"
+	read yn
+	if [ "$yn" = Y -o "$yn" = y ]; then
+		echo ""
+		echo "umount /dev/$to*"
+		umount_disk "$to" || return 1
+		echo "part /dev/$to"
+		part_disk "$to" || return 1
+		partprobe "/dev/$to"
+		if export_partdevice partdev 1; then
+			# umount /boot
+			echo "try umount /boot"
+			/bin/mount -o noatime,remount,ro /dev/$partdev
+			/usr/bin/umount -R -d -l /dev/$partdev 2>/dev/null || /bin/umount -l /dev/$partdev
+		fi
+		sleep 1
+		echo "copy rom data from /dev/$bootdisk to /dev/$to"
+		for part in 1 2; do
+			# copy boot and rootfs partitions
+			export_partdevice partdev $part
+			partdevto=${to}p$part
+			echo "copy /dev/$partdev to /dev/$partdevto"
+			dd if=/dev/$partdev of=/dev/$partdevto bs=1M conv=notrunc
+		done
+		# mark RESET overlay partition
+		partdevto=${to}p3
+		echo "mark /dev/$partdevto as RESET"
+		echo "RESET000" | dd of="/dev/$partdevto" bs=512 count=1 conv=sync,fsync
+		echo "All Done!"
+	else
+		echo "Bye!"
+	fi
+}
+
+echo "Copy running OpenWrt to eMMC for amlogic"
+echo ""
+
+main
diff --git a/target/linux/amlogic/mesongx/config-5.15 b/target/linux/amlogic/mesongx/config-5.15
new file mode 100644
index 000000000..d3dc2df62
--- /dev/null
+++ b/target/linux/amlogic/mesongx/config-5.15
@@ -0,0 +1,710 @@
+CONFIG_64BIT=y
+CONFIG_ARCH_DMA_ADDR_T_64BIT=y
+CONFIG_ARCH_HIBERNATION_HEADER=y
+CONFIG_ARCH_HIBERNATION_POSSIBLE=y
+CONFIG_ARCH_KEEP_MEMBLOCK=y
+CONFIG_ARCH_MESON=y
+CONFIG_ARCH_MMAP_RND_BITS=18
+CONFIG_ARCH_MMAP_RND_BITS_MAX=33
+CONFIG_ARCH_MMAP_RND_BITS_MIN=18
+CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11
+CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11
+CONFIG_ARCH_PROC_KCORE_TEXT=y
+CONFIG_ARCH_SELECT_MEMORY_MODEL=y
+CONFIG_ARCH_SPARSEMEM_DEFAULT=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_STACKWALK=y
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+CONFIG_ARM64=y
+CONFIG_ARM64_4K_PAGES=y
+CONFIG_ARM64_CRYPTO=y
+CONFIG_ARM64_MODULE_PLTS=y
+CONFIG_ARM64_PAGE_SHIFT=12
+CONFIG_ARM64_PA_BITS=48
+CONFIG_ARM64_PA_BITS_48=y
+CONFIG_ARM64_PTR_AUTH=y
+CONFIG_ARM64_TAGGED_ADDR_ABI=y
+CONFIG_ARM64_VA_BITS=48
+# CONFIG_ARM64_VA_BITS_39 is not set
+CONFIG_ARM64_VA_BITS_48=y
+# CONFIG_ARMV8_DEPRECATED is not set
+CONFIG_ARM_AMBA=y
+CONFIG_ARM_ARCH_TIMER=y
+CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y
+CONFIG_ARM_GIC=y
+CONFIG_ARM_GIC_V2M=y
+CONFIG_ARM_GIC_V3=y
+CONFIG_ARM_GIC_V3_ITS=y
+CONFIG_ARM_GIC_V3_ITS_PCI=y
+CONFIG_ARM_MHU=y
+# CONFIG_ARM_PL172_MPMC is not set
+CONFIG_ARM_PSCI_CPUIDLE=y
+CONFIG_ARM_PSCI_CPUIDLE_DOMAIN=y
+CONFIG_ARM_PSCI_FW=y
+CONFIG_ARM_SBSA_WATCHDOG=y
+CONFIG_ARM_SCMI_CPUFREQ=y
+CONFIG_ARM_SCMI_POWER_DOMAIN=y
+CONFIG_ARM_SCMI_PROTOCOL=y
+CONFIG_ARM_SCPI_CPUFREQ=y
+CONFIG_ARM_SCPI_POWER_DOMAIN=y
+CONFIG_ARM_SCPI_PROTOCOL=y
+CONFIG_ARM_SMC_WATCHDOG=y
+CONFIG_ARM_SP805_WATCHDOG=y
+CONFIG_ASSOCIATIVE_ARRAY=y
+CONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH=y
+CONFIG_ATA=y
+CONFIG_ATA_LINK_SUPPORTS_LEDS=y
+CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y
+CONFIG_BALLOON_COMPACTION=y
+CONFIG_BINFMT_MISC=y
+CONFIG_BLK_CGROUP=y
+CONFIG_BLK_DEV_BSG=y
+CONFIG_BLK_DEV_BSGLIB=y
+# CONFIG_BLK_DEV_DM is not set
+CONFIG_BLK_DEV_INTEGRITY=y
+CONFIG_BLK_DEV_INTEGRITY_T10=y
+CONFIG_BLK_DEV_LOOP=y
+# CONFIG_BLK_DEV_MD is not set
+CONFIG_BLK_DEV_SD=y
+CONFIG_BLK_MQ_PCI=y
+CONFIG_BLK_MQ_VIRTIO=y
+CONFIG_BLK_PM=y
+CONFIG_BLK_SCSI_REQUEST=y
+CONFIG_BLOCK_COMPAT=y
+CONFIG_BRCMSTB_GISB_ARB=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y
+# CONFIG_CFS_BANDWIDTH is not set
+CONFIG_CGROUPS=y
+CONFIG_CGROUP_BPF=y
+CONFIG_CGROUP_CPUACCT=y
+# CONFIG_CGROUP_DEBUG is not set
+CONFIG_CGROUP_DEVICE=y
+CONFIG_CGROUP_FREEZER=y
+CONFIG_CGROUP_HUGETLB=y
+# CONFIG_CGROUP_NET_CLASSID is not set
+# CONFIG_CGROUP_NET_PRIO is not set
+CONFIG_CGROUP_PIDS=y
+# CONFIG_CGROUP_RDMA is not set
+CONFIG_CGROUP_SCHED=y
+CONFIG_CGROUP_WRITEBACK=y
+CONFIG_CLKDEV_LOOKUP=y
+CONFIG_CLONE_BACKWARDS=y
+CONFIG_COMMON_CLK=y
+CONFIG_COMMON_CLK_AXG=y
+# CONFIG_COMMON_CLK_AXG_AUDIO is not set
+CONFIG_COMMON_CLK_CS2000_CP=y
+CONFIG_COMMON_CLK_G12A=y
+CONFIG_COMMON_CLK_GXBB=y
+CONFIG_COMMON_CLK_MESON_AO_CLKC=y
+CONFIG_COMMON_CLK_MESON_CPU_DYNDIV=y
+CONFIG_COMMON_CLK_MESON_DUALDIV=y
+CONFIG_COMMON_CLK_MESON_EE_CLKC=y
+CONFIG_COMMON_CLK_MESON_MPLL=y
+CONFIG_COMMON_CLK_MESON_PLL=y
+CONFIG_COMMON_CLK_MESON_REGMAP=y
+CONFIG_COMMON_CLK_MESON_VID_PLL_DIV=y
+CONFIG_COMMON_CLK_PWM=y
+CONFIG_COMMON_CLK_S2MPS11=y
+CONFIG_COMMON_CLK_SCMI=y
+CONFIG_COMMON_CLK_SCPI=y
+CONFIG_COMMON_CLK_VC5=y
+CONFIG_COMMON_CLK_XGENE=y
+CONFIG_COMPAT=y
+CONFIG_COMPAT_32BIT_TIME=y
+CONFIG_COMPAT_BINFMT_ELF=y
+CONFIG_COMPAT_NETLINK_MESSAGES=y
+CONFIG_COMPAT_OLD_SIGACTION=y
+CONFIG_CONFIGFS_FS=y
+CONFIG_CONTIG_ALLOC=y
+CONFIG_CPUFREQ_DT=y
+CONFIG_CPUFREQ_DT_PLATDEV=y
+CONFIG_CPUSETS=y
+CONFIG_CPU_FREQ=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
+CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y
+CONFIG_CPU_FREQ_GOV_ATTR_SET=y
+CONFIG_CPU_FREQ_GOV_COMMON=y
+# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
+CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_IDLE=y
+CONFIG_CPU_IDLE_GOV_MENU=y
+CONFIG_CPU_IDLE_MULTIPLE_DRIVERS=y
+CONFIG_CPU_PM=y
+CONFIG_CPU_RMAP=y
+CONFIG_CRASH_CORE=y
+CONFIG_CRASH_DUMP=y
+CONFIG_CRC16=y
+CONFIG_CRC7=y
+CONFIG_CRC_ITU_T=y
+CONFIG_CRC_T10DIF=y
+CONFIG_CRYPTO_AES_ARM64=y
+CONFIG_CRYPTO_AES_ARM64_CE=y
+CONFIG_CRYPTO_AES_ARM64_CE_BLK=y
+CONFIG_CRYPTO_AES_ARM64_CE_CCM=y
+CONFIG_CRYPTO_ANSI_CPRNG=y
+CONFIG_CRYPTO_CRC32=y
+CONFIG_CRYPTO_CRC32C=y
+CONFIG_CRYPTO_CRCT10DIF=y
+CONFIG_CRYPTO_CRYPTD=y
+CONFIG_CRYPTO_DRBG=y
+CONFIG_CRYPTO_DRBG_HMAC=y
+CONFIG_CRYPTO_DRBG_MENU=y
+CONFIG_CRYPTO_ECHAINIV=y
+CONFIG_CRYPTO_GHASH_ARM64_CE=y
+CONFIG_CRYPTO_HASH_INFO=y
+CONFIG_CRYPTO_HMAC=y
+CONFIG_CRYPTO_JITTERENTROPY=y
+CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y
+CONFIG_CRYPTO_LIB_SHA256=y
+CONFIG_CRYPTO_RNG=y
+CONFIG_CRYPTO_RNG2=y
+CONFIG_CRYPTO_RNG_DEFAULT=y
+CONFIG_CRYPTO_SHA1=y
+CONFIG_CRYPTO_SHA1_ARM64_CE=y
+CONFIG_CRYPTO_SHA256=y
+CONFIG_CRYPTO_SHA256_ARM64=y
+CONFIG_CRYPTO_SHA2_ARM64_CE=y
+CONFIG_CRYPTO_SIMD=y
+CONFIG_DCACHE_WORD_ACCESS=y
+# CONFIG_DEVFREQ_GOV_PASSIVE is not set
+# CONFIG_DEVFREQ_GOV_PERFORMANCE is not set
+# CONFIG_DEVFREQ_GOV_POWERSAVE is not set
+CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y
+# CONFIG_DEVFREQ_GOV_USERSPACE is not set
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+CONFIG_DEV_COREDUMP=y
+CONFIG_DMADEVICES=y
+CONFIG_DMA_DIRECT_REMAP=y
+CONFIG_DMA_ENGINE=y
+CONFIG_DMA_ENGINE_RAID=y
+CONFIG_DMA_OF=y
+CONFIG_DMA_REMAP=y
+CONFIG_DMA_SHARED_BUFFER=y
+CONFIG_DMA_VIRTUAL_CHANNELS=y
+CONFIG_DNS_RESOLVER=y
+CONFIG_DTC=y
+CONFIG_DT_IDLE_STATES=y
+CONFIG_DWMAC_GENERIC=y
+CONFIG_DWMAC_MESON=y
+CONFIG_DW_WATCHDOG=y
+CONFIG_EDAC=y
+# CONFIG_EDAC_DEBUG is not set
+# CONFIG_EDAC_DMC520 is not set
+CONFIG_EDAC_LEGACY_SYSFS=y
+CONFIG_EDAC_SUPPORT=y
+# CONFIG_EDAC_THUNDERX is not set
+# CONFIG_EDAC_XGENE is not set
+CONFIG_ENERGY_MODEL=y
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_POSIX_ACL is not set
+# CONFIG_EXT2_FS_SECURITY is not set
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_FS_POSIX_ACL is not set
+# CONFIG_EXT3_FS_SECURITY is not set
+CONFIG_EXT4_FS=y
+CONFIG_EXT4_FS_POSIX_ACL=y
+CONFIG_EXTCON=y
+CONFIG_EXTCON_USB_GPIO=y
+CONFIG_F2FS_FS=y
+CONFIG_FAILOVER=y
+CONFIG_FAIR_GROUP_SCHED=y
+CONFIG_FANOTIFY=y
+CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y
+CONFIG_FAT_FS=y
+CONFIG_FB=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+CONFIG_FB_SIMPLE=y
+CONFIG_FIXED_PHY=y
+CONFIG_FIX_EARLYCON_MEM=y
+# CONFIG_FLATMEM_MANUAL is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FREEZER=y
+CONFIG_FS_IOMAP=y
+CONFIG_FS_MBCACHE=y
+CONFIG_FS_POSIX_ACL=y
+CONFIG_FW_CACHE=y
+CONFIG_FW_LOADER_PAGED_BUF=y
+CONFIG_GARP=y
+CONFIG_GENERIC_ALLOCATOR=y
+CONFIG_GENERIC_ARCH_TOPOLOGY=y
+CONFIG_GENERIC_BUG=y
+CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
+CONFIG_GENERIC_CPU_AUTOPROBE=y
+CONFIG_GENERIC_CPU_VULNERABILITIES=y
+CONFIG_GENERIC_CSUM=y
+CONFIG_GENERIC_EARLY_IOREMAP=y
+CONFIG_GENERIC_GETTIMEOFDAY=y
+CONFIG_GENERIC_IDLE_POLL_SETUP=y
+CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y
+CONFIG_GENERIC_IRQ_MIGRATION=y
+CONFIG_GENERIC_IRQ_MULTI_HANDLER=y
+CONFIG_GENERIC_IRQ_SHOW=y
+CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
+CONFIG_GENERIC_MSI_IRQ=y
+CONFIG_GENERIC_MSI_IRQ_DOMAIN=y
+CONFIG_GENERIC_PCI_IOMAP=y
+CONFIG_GENERIC_PHY=y
+CONFIG_GENERIC_PINCONF=y
+CONFIG_GENERIC_PINCTRL_GROUPS=y
+CONFIG_GENERIC_PINMUX_FUNCTIONS=y
+CONFIG_GENERIC_SCHED_CLOCK=y
+CONFIG_GENERIC_SMP_IDLE_THREAD=y
+CONFIG_GENERIC_STRNCPY_FROM_USER=y
+CONFIG_GENERIC_STRNLEN_USER=y
+CONFIG_GENERIC_TIME_VSYSCALL=y
+CONFIG_GLOB=y
+CONFIG_GPIOLIB=y
+CONFIG_GPIO_GENERIC=y
+CONFIG_GPIO_GENERIC_PLATFORM=y
+CONFIG_HANDLE_DOMAIN_IRQ=y
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_HAS_DMA=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT_MAP=y
+CONFIG_HIBERNATE_CALLBACKS=y
+CONFIG_HIBERNATION=y
+CONFIG_HIBERNATION_SNAPSHOT_DEV=y
+CONFIG_HOLES_IN_ZONE=y
+CONFIG_HOTPLUG_CPU=y
+CONFIG_HUGETLBFS=y
+CONFIG_HUGETLB_PAGE=y
+CONFIG_HVC_DRIVER=y
+CONFIG_HWMON=y
+# CONFIG_HWPOISON_INJECT is not set
+CONFIG_HWSPINLOCK=y
+CONFIG_I2C=y
+CONFIG_I2C_ALGOBIT=y
+CONFIG_I2C_BOARDINFO=y
+CONFIG_I2C_CHARDEV=y
+CONFIG_I2C_DESIGNWARE_CORE=y
+CONFIG_I2C_DESIGNWARE_PLATFORM=y
+CONFIG_I2C_MESON=y
+CONFIG_I2C_MUX=y
+CONFIG_I2C_MUX_PCA954x=y
+CONFIG_I2C_SLAVE=y
+# CONFIG_I2C_SLAVE_TESTUNIT is not set
+CONFIG_IIO=y
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
+CONFIG_INDIRECT_PIO=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_INTERCONNECT=y
+CONFIG_INTERVAL_TREE=y
+CONFIG_IOMMU_API=y
+CONFIG_IPC_NS=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_BOOTP=y
+CONFIG_IP_PNP_DHCP=y
+# CONFIG_IP_PNP_RARP is not set
+CONFIG_IRQCHIP=y
+CONFIG_IRQ_BYPASS_MANAGER=y
+CONFIG_IRQ_DOMAIN=y
+CONFIG_IRQ_DOMAIN_HIERARCHY=y
+CONFIG_IRQ_FORCED_THREADING=y
+CONFIG_IRQ_POLL=y
+CONFIG_IRQ_TIME_ACCOUNTING=y
+CONFIG_IRQ_WORK=y
+CONFIG_JBD2=y
+CONFIG_JUMP_LABEL=y
+CONFIG_KALLSYMS=y
+CONFIG_KEXEC=y
+CONFIG_KEXEC_CORE=y
+CONFIG_KEXEC_FILE=y
+CONFIG_KEYS=y
+CONFIG_KSM=y
+CONFIG_KVM=y
+CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y
+CONFIG_KVM_MMIO=y
+CONFIG_KVM_VFIO=y
+CONFIG_LEDS_GPIO=y
+CONFIG_LEDS_PWM=y
+CONFIG_LEDS_SYSCON=y
+CONFIG_LEDS_TRIGGER_CPU=y
+CONFIG_LEDS_TRIGGER_DISK=y
+CONFIG_LEDS_TRIGGER_PANIC=y
+CONFIG_LIBFDT=y
+CONFIG_LOCK_DEBUGGING_SUPPORT=y
+CONFIG_LOCK_SPIN_ON_OWNER=y
+CONFIG_LZO_COMPRESS=y
+CONFIG_LZO_DECOMPRESS=y
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_MAILBOX=y
+# CONFIG_MAILBOX_TEST is not set
+CONFIG_MD=y
+CONFIG_MDIO_BITBANG=y
+CONFIG_MDIO_BUS=y
+CONFIG_MDIO_BUS_MUX=y
+CONFIG_MDIO_BUS_MUX_MESON_G12A=y
+CONFIG_MDIO_BUS_MUX_MMIOREG=y
+CONFIG_MDIO_BUS_MUX_MULTIPLEXER=y
+CONFIG_MDIO_DEVICE=y
+CONFIG_MDIO_DEVRES=y
+# CONFIG_MDIO_GPIO is not set
+CONFIG_MEMCG=y
+CONFIG_MEMCG_KMEM=y
+CONFIG_MEMCG_SWAP=y
+CONFIG_MEMFD_CREATE=y
+CONFIG_MEMORY=y
+CONFIG_MEMORY_BALLOON=y
+CONFIG_MEMORY_FAILURE=y
+CONFIG_MEMORY_HOTPLUG=y
+# CONFIG_MEMORY_HOTPLUG_DEFAULT_ONLINE is not set
+CONFIG_MEMORY_HOTPLUG_SPARSE=y
+CONFIG_MEMORY_HOTREMOVE=y
+CONFIG_MEMORY_ISOLATION=y
+CONFIG_MEMTEST=y
+# CONFIG_MESON_CANVAS is not set
+CONFIG_MESON_CLK_MEASURE=y
+CONFIG_MESON_EE_PM_DOMAINS=y
+CONFIG_MESON_GXBB_WATCHDOG=y
+CONFIG_MESON_GXL_PHY=y
+CONFIG_MESON_GX_PM_DOMAINS=y
+CONFIG_MESON_GX_SOCINFO=y
+CONFIG_MESON_IRQ_GPIO=y
+CONFIG_MESON_MX_SOCINFO=y
+CONFIG_MESON_SARADC=y
+CONFIG_MESON_SECURE_PM_DOMAINS=y
+CONFIG_MESON_SM=y
+# CONFIG_MESON_WATCHDOG is not set
+CONFIG_MFD_CORE=y
+CONFIG_MFD_SEC_CORE=y
+CONFIG_MFD_SYSCON=y
+CONFIG_MFD_VEXPRESS_SYSREG=y
+CONFIG_MIGRATION=y
+CONFIG_MMC=y
+CONFIG_MMC_ARMMMCI=y
+CONFIG_MMC_BLOCK=y
+CONFIG_MMC_CQHCI=y
+CONFIG_MMC_DW=y
+# CONFIG_MMC_DW_BLUEFIELD is not set
+# CONFIG_MMC_DW_EXYNOS is not set
+# CONFIG_MMC_DW_HI3798CV200 is not set
+# CONFIG_MMC_DW_K3 is not set
+# CONFIG_MMC_DW_PCI is not set
+CONFIG_MMC_DW_PLTFM=y
+CONFIG_MMC_MESON_GX=y
+# CONFIG_MMC_MESON_MX_SDIO is not set
+CONFIG_MMC_MTK=y
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_IO_ACCESSORS=y
+CONFIG_MMC_SDHCI_OF_DWCMSHC=y
+# CONFIG_MMC_SDHCI_PCI is not set
+CONFIG_MMC_SDHCI_PLTFM=y
+CONFIG_MMC_SPI=y
+CONFIG_MMU_NOTIFIER=y
+CONFIG_MODULES_USE_ELF_RELA=y
+CONFIG_MRP=y
+CONFIG_MULTIPLEXER=y
+# CONFIG_MUSB_PIO_ONLY is not set
+CONFIG_MUTEX_SPIN_ON_OWNER=y
+CONFIG_MUX_MMIO=y
+CONFIG_MV_XOR_V2=y
+CONFIG_NAMESPACES=y
+CONFIG_NEED_DMA_MAP_STATE=y
+CONFIG_NEED_SG_DMA_LENGTH=y
+CONFIG_NETFILTER=y
+CONFIG_NET_CLS_ACT=y
+# CONFIG_NET_CLS_CGROUP is not set
+CONFIG_NET_FAILOVER=y
+CONFIG_NET_FLOW_LIMIT=y
+CONFIG_NET_NS=y
+CONFIG_NLS=y
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NOP_USB_XCEIV=y
+CONFIG_NO_HZ_COMMON=y
+CONFIG_NO_HZ_IDLE=y
+CONFIG_NR_CPUS=256
+CONFIG_NVMEM=y
+CONFIG_NVMEM_SYSFS=y
+CONFIG_OF=y
+CONFIG_OF_ADDRESS=y
+CONFIG_OF_EARLY_FLATTREE=y
+CONFIG_OF_FLATTREE=y
+CONFIG_OF_GPIO=y
+CONFIG_OF_IRQ=y
+CONFIG_OF_KOBJ=y
+CONFIG_OF_MDIO=y
+CONFIG_OF_NET=y
+CONFIG_OID_REGISTRY=y
+CONFIG_OLD_SIGSUSPEND3=y
+CONFIG_OPTEE=y
+CONFIG_OPTEE_SHM_NUM_PRIV_PAGES=1
+CONFIG_PADATA=y
+CONFIG_PAGE_COUNTER=y
+CONFIG_PAGE_REPORTING=y
+CONFIG_PARAVIRT=y
+CONFIG_PARTITION_PERCPU=y
+CONFIG_PCI=y
+CONFIG_PCIEAER=y
+CONFIG_PCIEPORTBUS=y
+CONFIG_PCIE_DW=y
+CONFIG_PCIE_DW_HOST=y
+CONFIG_PCIE_PME=y
+CONFIG_PCI_HOST_COMMON=y
+CONFIG_PCI_HOST_GENERIC=y
+CONFIG_PCI_IOV=y
+CONFIG_PCI_PASID=y
+CONFIG_PCS_XPCS=y
+CONFIG_PGTABLE_LEVELS=4
+CONFIG_PHYLIB=y
+CONFIG_PHYLINK=y
+CONFIG_PHYS_ADDR_T_64BIT=y
+CONFIG_PHY_MESON8B_USB2=y
+CONFIG_PHY_MESON_AXG_MIPI_PCIE_ANALOG=y
+CONFIG_PHY_MESON_AXG_PCIE=y
+CONFIG_PHY_MESON_G12A_USB2=y
+CONFIG_PHY_MESON_G12A_USB3_PCIE=y
+CONFIG_PHY_MESON_GXL_USB2=y
+CONFIG_PHY_SAMSUNG_USB2=y
+CONFIG_PHY_XGENE=y
+CONFIG_PID_NS=y
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_MESON=y
+CONFIG_PINCTRL_MESON8_PMX=y
+CONFIG_PINCTRL_MESON_A1=y
+CONFIG_PINCTRL_MESON_AXG=y
+CONFIG_PINCTRL_MESON_AXG_PMX=y
+CONFIG_PINCTRL_MESON_G12A=y
+CONFIG_PINCTRL_MESON_GXBB=y
+CONFIG_PINCTRL_MESON_GXL=y
+CONFIG_PL330_DMA=y
+CONFIG_PLATFORM_MHU=y
+CONFIG_PM=y
+CONFIG_PM_CLK=y
+CONFIG_PM_DEVFREQ=y
+# CONFIG_PM_DEVFREQ_EVENT is not set
+CONFIG_PM_GENERIC_DOMAINS=y
+CONFIG_PM_GENERIC_DOMAINS_OF=y
+CONFIG_PM_GENERIC_DOMAINS_SLEEP=y
+CONFIG_PM_OPP=y
+CONFIG_PM_SLEEP=y
+CONFIG_PM_SLEEP_SMP=y
+CONFIG_PM_STD_PARTITION=""
+CONFIG_POSIX_MQUEUE=y
+CONFIG_POSIX_MQUEUE_SYSCTL=y
+CONFIG_POWER_RESET=y
+CONFIG_POWER_RESET_SYSCON=y
+# CONFIG_POWER_RESET_VEXPRESS is not set
+CONFIG_POWER_SUPPLY=y
+CONFIG_PREEMPT_NOTIFIERS=y
+CONFIG_PRINTK_TIME=y
+CONFIG_PRINT_QUOTA_WARNING=y
+CONFIG_PROC_PID_CPUSET=y
+CONFIG_PROC_VMCORE=y
+CONFIG_PROFILING=y
+CONFIG_PSTORE=y
+CONFIG_PWM=y
+CONFIG_PWM_MESON=y
+CONFIG_PWM_SYSFS=y
+# CONFIG_QFMT_V1 is not set
+# CONFIG_QFMT_V2 is not set
+CONFIG_QUEUED_RWLOCKS=y
+CONFIG_QUEUED_SPINLOCKS=y
+CONFIG_QUOTA=y
+CONFIG_QUOTACTL=y
+# CONFIG_QUOTA_NETLINK_INTERFACE is not set
+CONFIG_RANDOMIZE_BASE=y
+CONFIG_RANDOMIZE_MODULE_REGION_FULL=y
+CONFIG_RAS=y
+CONFIG_RATIONAL=y
+# CONFIG_RAVE_SP_CORE is not set
+CONFIG_REALTEK_PHY=y
+CONFIG_REBOOT_MODE=y
+CONFIG_REGMAP=y
+CONFIG_REGMAP_I2C=y
+CONFIG_REGMAP_IRQ=y
+CONFIG_REGMAP_MMIO=y
+CONFIG_REGULATOR=y
+CONFIG_REGULATOR_FAN53555=y
+CONFIG_REGULATOR_FIXED_VOLTAGE=y
+CONFIG_REGULATOR_GPIO=y
+CONFIG_REGULATOR_PWM=y
+CONFIG_RELOCATABLE=y
+CONFIG_REMOTEPROC=y
+# CONFIG_REMOTEPROC_CDEV is not set
+CONFIG_RESET_CONTROLLER=y
+CONFIG_RESET_MESON=y
+# CONFIG_RESET_MESON_AUDIO_ARB is not set
+CONFIG_RESET_SCMI=y
+CONFIG_RFS_ACCEL=y
+CONFIG_RODATA_FULL_DEFAULT_ENABLED=y
+CONFIG_RPMSG=y
+# CONFIG_RPMSG_CHAR is not set
+CONFIG_RPS=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_DRV_MESON_VRTC=y
+# CONFIG_RTC_DRV_S5M is not set
+CONFIG_RTC_I2C_AND_SPI=y
+# CONFIG_RT_GROUP_SCHED is not set
+CONFIG_RWSEM_SPIN_ON_OWNER=y
+CONFIG_SATA_AHCI=y
+CONFIG_SATA_AHCI_PLATFORM=y
+CONFIG_SATA_HOST=y
+CONFIG_SCHED_AUTOGROUP=y
+CONFIG_SCHED_INFO=y
+CONFIG_SCHED_MC=y
+CONFIG_SCHED_SMT=y
+CONFIG_SCSI=y
+CONFIG_SCSI_HISI_SAS=y
+# CONFIG_SCSI_PROC_FS is not set
+CONFIG_SCSI_SAS_ATA=y
+CONFIG_SCSI_SAS_ATTRS=y
+CONFIG_SCSI_SAS_HOST_SMP=y
+CONFIG_SCSI_SAS_LIBSAS=y
+CONFIG_SCSI_UFSHCD=y
+# CONFIG_SCSI_UFSHCD_PCI is not set
+CONFIG_SCSI_UFSHCD_PLATFORM=y
+# CONFIG_SCSI_UFS_BSG is not set
+# CONFIG_SCSI_UFS_CDNS_PLATFORM is not set
+# CONFIG_SCSI_UFS_DWC_TC_PLATFORM is not set
+CONFIG_SECURITY=y
+# CONFIG_SECURITY_NETWORK is not set
+CONFIG_SERIAL_DEV_BUS=y
+CONFIG_SERIAL_DEV_CTRL_TTYPORT=y
+CONFIG_SERIAL_MCTRL_GPIO=y
+CONFIG_SERIAL_MESON=y
+CONFIG_SERIAL_MESON_CONSOLE=y
+CONFIG_SERIAL_OF_PLATFORM=y
+CONFIG_SG_POOL=y
+CONFIG_SMP=y
+CONFIG_SOCK_CGROUP_DATA=y
+CONFIG_SOC_BRCMSTB=y
+CONFIG_SOC_BUS=y
+CONFIG_SPARSEMEM=y
+CONFIG_SPARSEMEM_EXTREME=y
+CONFIG_SPARSEMEM_MANUAL=y
+CONFIG_SPARSEMEM_VMEMMAP=y
+CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
+CONFIG_SPARSE_IRQ=y
+CONFIG_SPI=y
+CONFIG_SPI_CADENCE_QUADSPI=y
+CONFIG_SPI_MASTER=y
+CONFIG_SPI_MEM=y
+# CONFIG_SPI_MESON_SPICC is not set
+# CONFIG_SPI_MESON_SPIFC is not set
+CONFIG_SRAM=y
+CONFIG_SRCU=y
+CONFIG_STMMAC_ETH=y
+CONFIG_STMMAC_PLATFORM=y
+# CONFIG_STMMAC_SELFTESTS is not set
+CONFIG_SWIOTLB=y
+CONFIG_SWPHY=y
+CONFIG_SYSCON_REBOOT_MODE=y
+CONFIG_SYSCTL_EXCEPTION_TRACE=y
+CONFIG_SYSVIPC_COMPAT=y
+CONFIG_SYS_SUPPORTS_HUGETLBFS=y
+CONFIG_TASKSTATS=y
+CONFIG_TASK_DELAY_ACCT=y
+CONFIG_TASK_IO_ACCOUNTING=y
+CONFIG_TASK_XACCT=y
+CONFIG_TCG_TIS_I2C_INFINEON=y
+CONFIG_TCG_TPM=y
+CONFIG_TEE=y
+CONFIG_THERMAL=y
+CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y
+CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0
+CONFIG_THERMAL_GOV_STEP_WISE=y
+CONFIG_THERMAL_OF=y
+CONFIG_THREAD_INFO_IN_TASK=y
+CONFIG_TICK_CPU_ACCOUNTING=y
+CONFIG_TIMER_OF=y
+CONFIG_TIMER_PROBE=y
+CONFIG_TIME_NS=y
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_TRANSPARENT_HUGEPAGE=y
+CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
+# CONFIG_TRANSPARENT_HUGEPAGE_MADVISE is not set
+CONFIG_TREE_RCU=y
+CONFIG_TREE_SRCU=y
+CONFIG_TUN=y
+# CONFIG_UACCE is not set
+# CONFIG_UCLAMP_TASK is not set
+CONFIG_UNMAP_KERNEL_AT_EL0=y
+CONFIG_USB=y
+CONFIG_USB_BDC_UDC=y
+CONFIG_USB_CHIPIDEA=y
+CONFIG_USB_CHIPIDEA_HOST=y
+CONFIG_USB_CHIPIDEA_UDC=y
+CONFIG_USB_COMMON=y
+CONFIG_USB_CONN_GPIO=y
+CONFIG_USB_DWC2=y
+CONFIG_USB_DWC2_DUAL_ROLE=y
+CONFIG_USB_DWC3=y
+CONFIG_USB_DWC3_DUAL_ROLE=y
+# CONFIG_USB_DWC3_GADGET is not set
+# CONFIG_USB_DWC3_HOST is not set
+CONFIG_USB_DWC3_MESON_G12A=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_HCD_PLATFORM=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_HSIC_USB3503=y
+CONFIG_USB_ISP1760=y
+CONFIG_USB_ISP1760_DUAL_ROLE=y
+# CONFIG_USB_ISP1760_GADGET_ROLE is not set
+CONFIG_USB_ISP1760_HCD=y
+# CONFIG_USB_ISP1760_HOST_ROLE is not set
+CONFIG_USB_ISP1761_UDC=y
+CONFIG_USB_MUSB_DUAL_ROLE=y
+# CONFIG_USB_MUSB_GADGET is not set
+CONFIG_USB_MUSB_HDRC=y
+# CONFIG_USB_MUSB_HOST is not set
+CONFIG_USB_OHCI_HCD=y
+CONFIG_USB_OHCI_HCD_PLATFORM=y
+CONFIG_USB_OTG=y
+CONFIG_USB_PHY=y
+CONFIG_USB_ROLE_SWITCH=y
+CONFIG_USB_SNP_CORE=y
+CONFIG_USB_SNP_UDC_PLAT=y
+CONFIG_USB_STORAGE=y
+CONFIG_USB_SUPPORT=y
+CONFIG_USB_ULPI=y
+CONFIG_USB_ULPI_BUS=y
+CONFIG_USB_ULPI_VIEWPORT=y
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_XHCI_PLATFORM=y
+CONFIG_USER_NS=y
+CONFIG_UTS_NS=y
+CONFIG_VEXPRESS_CONFIG=y
+CONFIG_VFAT_FS=y
+CONFIG_VFIO=y
+CONFIG_VFIO_IOMMU_TYPE1=y
+# CONFIG_VFIO_MDEV is not set
+# CONFIG_VFIO_NOIOMMU is not set
+CONFIG_VFIO_PCI=y
+CONFIG_VFIO_PCI_INTX=y
+CONFIG_VFIO_PCI_MMAP=y
+# CONFIG_VFIO_PLATFORM is not set
+CONFIG_VFIO_VIRQFD=y
+CONFIG_VIRTIO=y
+CONFIG_VIRTIO_BALLOON=y
+CONFIG_VIRTIO_BLK=y
+CONFIG_VIRTIO_CONSOLE=y
+CONFIG_VIRTIO_MMIO=y
+CONFIG_VIRTIO_NET=y
+CONFIG_VIRTIO_PCI=y
+CONFIG_VIRTIO_PCI_LEGACY=y
+CONFIG_VIRTUALIZATION=y
+CONFIG_VLAN_8021Q_GVRP=y
+CONFIG_VLAN_8021Q_MVRP=y
+CONFIG_VMAP_STACK=y
+CONFIG_WANT_DEV_COREDUMP=y
+CONFIG_WATCHDOG_CORE=y
+CONFIG_XARRAY_MULTI=y
+CONFIG_XPS=y
+CONFIG_XXHASH=y
+# CONFIG_ZONE_DEVICE is not set
+CONFIG_ZONE_DMA32=y
diff --git a/target/linux/amlogic/mesongx/target.mk b/target/linux/amlogic/mesongx/target.mk
new file mode 100644
index 000000000..34d1a58c6
--- /dev/null
+++ b/target/linux/amlogic/mesongx/target.mk
@@ -0,0 +1,12 @@
+ARCH:=aarch64
+CPU_TYPE:=cortex-a53
+BOARDNAME:=Amlogic S905x boards (64 bit)
+
+KERNEL_PATCHVER:=5.15
+
+DEFAULT_PACKAGES+=ethtool parted kmod-fb
+
+define Target/Description
+	Build firmware image for Amlogic S905x devices.
+	This firmware features a 64 bit kernel.
+endef
diff --git a/target/linux/amlogic/modules.mk b/target/linux/amlogic/modules.mk
new file mode 100644
index 000000000..6866241a0
--- /dev/null
+++ b/target/linux/amlogic/modules.mk
@@ -0,0 +1,15 @@
+define Package/brcmfmac-firmware-43455-sdio-phicomm-n1
+  SECTION:=firmware
+  CATEGORY:=Firmware
+  TITLE:=Broadcom BCM43455 firmware for Phicomm N1
+  VERSION:=1.0.0
+  DEPENDS:=+brcmfmac-firmware-43455-sdio +brcmfmac-nvram-43455-sdio
+endef
+
+define Package/brcmfmac-firmware-43455-sdio-phicomm-n1/install
+	$(INSTALL_DIR) $(1)/lib/firmware/brcm
+	$(LN) brcmfmac43455-sdio.raspberrypi,4-model-b.txt $(1)/lib/firmware/brcm/brcmfmac43455-sdio.phicomm,n1.txt
+	$(LN) brcmfmac43455-sdio.bin $(1)/lib/firmware/brcm/brcmfmac43455-sdio.phicomm,n1.bin
+	$(LN) brcmfmac43455-sdio.clm_blob $(1)/lib/firmware/brcm/brcmfmac43455-sdio.phicomm,n1.clm_blob
+endef
+$(eval $(call BuildPackage,brcmfmac-firmware-43455-sdio-phicomm-n1))
diff --git a/target/linux/amlogic/patches-5.15/001-dts-s905d-fix-high-load.patch b/target/linux/amlogic/patches-5.15/001-dts-s905d-fix-high-load.patch
new file mode 100644
index 000000000..80bac1c6a
--- /dev/null
+++ b/target/linux/amlogic/patches-5.15/001-dts-s905d-fix-high-load.patch
@@ -0,0 +1,21 @@
+---
+ arch/arm64/boot/dts/amlogic/meson-gxl-s905d-p230.dts | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905d-p230.dts b/arch/arm64/boot/dts/amlogic/meson-gxl-s905d-p230.dts
+index b2ab05c22..f025109f2 100644
+--- a/arch/arm64/boot/dts/amlogic/meson-gxl-s905d-p230.dts
++++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905d-p230.dts
+@@ -86,8 +86,7 @@ external_phy: ethernet-phy@0 {
+ 		reset-gpios = <&gpio GPIOZ_14 GPIO_ACTIVE_LOW>;
+ 
+ 		interrupt-parent = <&gpio_intc>;
+-		interrupts = <29 IRQ_TYPE_LEVEL_LOW>;
+-		eee-broken-1000t;
++		interrupts = <25 IRQ_TYPE_LEVEL_LOW>;
+ 	};
+ };
+ 
+-- 
+2.41.0
+
diff --git a/target/linux/amlogic/patches-5.15/002-dts-improve-phicomm-n1-support.patch b/target/linux/amlogic/patches-5.15/002-dts-improve-phicomm-n1-support.patch
new file mode 100644
index 000000000..79b07abc4
--- /dev/null
+++ b/target/linux/amlogic/patches-5.15/002-dts-improve-phicomm-n1-support.patch
@@ -0,0 +1,49 @@
+--- a/arch/arm64/boot/dts/amlogic/meson-gxl-s905d-phicomm-n1.dts
++++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905d-phicomm-n1.dts
+@@ -10,6 +10,17 @@
+ / {
+ 	compatible = "phicomm,n1", "amlogic,s905d", "amlogic,meson-gxl";
+ 	model = "Phicomm N1";
++	
++	aliases {
++		mmc0 = &sd_emmc_b;
++		mmc1 = &sd_emmc_c;
++		mmc2 = &sd_emmc_a;
++
++		led-boot = &led_work;
++		led-failsafe = &led_work;
++		led-running = &led_work;
++		led-upgrade = &led_work;
++	};
+ 
+ 	cvbs-connector {
+ 		status = "disabled";
+@@ -18,7 +29,7 @@
+ 	leds {
+ 		compatible = "gpio-leds";
+ 
+-		led {
++		led_work: led {
+ 			label = "n1:white:status";
+ 			gpios = <&gpio_ao GPIOAO_9 GPIO_ACTIVE_HIGH>;
+ 			default-state = "on";
+@@ -32,4 +43,19 @@
+ 
+ &usb {
+ 	dr_mode = "host";
++};
++
++&sd_emmc_a {
++	max-frequency = <80000000>;
++	sd-uhs-ddr50;
++};
++
++&sd_emmc_b {
++	status = "disabled";
++};
++
++&ethmac {
++	snps,aal;
++	snps,txpbl = <0x8>;
++	snps,rxpbl = <0x8>;
+ };
diff --git a/target/linux/meson/patches-6.1/902-use-system-LED-for-OpenWrt.patch b/target/linux/amlogic/patches-6.1/902-use-system-LED-for-OpenWrt.patch
similarity index 100%
rename from target/linux/meson/patches-6.1/902-use-system-LED-for-OpenWrt.patch
rename to target/linux/amlogic/patches-6.1/902-use-system-LED-for-OpenWrt.patch
diff --git a/target/linux/meson/patches-6.1/903-add-dts-and-identify-emmc.patch b/target/linux/amlogic/patches-6.1/903-add-dts-and-identify-emmc.patch
similarity index 100%
rename from target/linux/meson/patches-6.1/903-add-dts-and-identify-emmc.patch
rename to target/linux/amlogic/patches-6.1/903-add-dts-and-identify-emmc.patch
diff --git a/target/linux/meson/patches-6.1/905-pwm-meson-modify-and-simplify-calculation-in.patch b/target/linux/amlogic/patches-6.1/905-pwm-meson-modify-and-simplify-calculation-in.patch
similarity index 100%
rename from target/linux/meson/patches-6.1/905-pwm-meson-modify-and-simplify-calculation-in.patch
rename to target/linux/amlogic/patches-6.1/905-pwm-meson-modify-and-simplify-calculation-in.patch
diff --git a/target/linux/meson/image/Makefile b/target/linux/meson/image/Makefile
deleted file mode 100644
index 2aac6a2fa..000000000
--- a/target/linux/meson/image/Makefile
+++ /dev/null
@@ -1,57 +0,0 @@
-#
-# This is free software, licensed under the GNU General Public License v2.
-# See /LICENSE for more information.
-#
-include $(TOPDIR)/rules.mk
-include $(INCLUDE_DIR)/image.mk
-
-FAT32_BLOCK_SIZE=1024
-FAT32_BLOCKS=$(shell echo $$(($(CONFIG_TARGET_KERNEL_PARTSIZE)*1024*1024/$(FAT32_BLOCK_SIZE))))
-
-define Build/boot-script
-	# Make an U-boot image and copy it to the boot partition
-	mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "boot.scr" -d boot.txt  $(KDIR)/boot.scr
-endef
-
-define Build/emmc-common
-	$(RM) -f $@.boot
-	mkfs.fat -C $@.boot $(FAT32_BLOCKS)
-
-	mkdir -p $(KDIR)/boot.fat
-
-	$(CP) $(KDIR)/boot.scr $(KDIR)/boot.fat/boot.scr
-	mcopy -i $@.boot $(KDIR)/boot.scr ::
-	$(CP) $(IMAGE_KERNEL) $(KDIR)/boot.fat/uImage
-	mcopy -i $@.boot $(KDIR)/boot.fat/uImage ::
-
-	$(foreach dts,$(shell echo $(DEVICE_DTS)),$(CP) $(DTS_DIR)/$(dts).dtb $(KDIR)/boot.fat/dtb;)
-	mcopy -i $@.boot $(KDIR)/boot.fat/dtb ::
-
-	$(RM) -rf $(KDIR)/boot.fat
-
-	./gen_aml_emmc_img.sh $@ $@.boot $(IMAGE_ROOTFS) \
-		$(CONFIG_TARGET_KERNEL_PARTSIZE) $(CONFIG_TARGET_ROOTFS_PARTSIZE)
-endef
-
-### Devices ###
-define Device/Default
-  FILESYSTEMS := ext4
-  IMAGES := emmc.img
-  KERNEL_DEPENDS = $$(wildcard $(DTS_DIR)/$$(DEVICE_DTS).dts)
-  KERNEL_LOADADDR := 0x01080000
-  KERNEL_NAME := Image
-  KERNEL := kernel-bin | uImage none
-  PROFILES = Default $$(DEVICE_NAME)
-endef
-
-define Device/thunder-onecloud
-  DEVICE_DTS := meson8b-onecloud
-  DEVICE_TITLE := Thunder OneCloud
-  KERNEL_LOADADDR := 0x00208000
-  IMAGE/emmc.img := boot-script onecloud | emmc-common $$(DEVICE_NAME)
-endef
-ifeq ($(SUBTARGET),meson8b)
-  TARGET_DEVICES += thunder-onecloud
-endif
-
-$(eval $(call BuildImage))