[][MAC80211][misc][update autobuild folder for WiFi7]
[Description]
Refactor autobuild folder for external build PASS.
Update MT7996 mp2.0 FW to 20230608.
[Release-log]
N/A
Change-Id: Idf22eb7dd01a777657f90ff0ce170f31abb106f7
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/7633627
diff --git a/autobuild_mac80211_release/openwrt_patches-21.02/mtk_soc/0900-sbc-create-related-tools-and-scripts.patch b/autobuild_mac80211_release/openwrt_patches-21.02/mtk_soc/0900-sbc-create-related-tools-and-scripts.patch
new file mode 100644
index 0000000..332ee64
--- /dev/null
+++ b/autobuild_mac80211_release/openwrt_patches-21.02/mtk_soc/0900-sbc-create-related-tools-and-scripts.patch
@@ -0,0 +1,465 @@
+diff --git a/scripts/make-squashfs-hashed.sh b/scripts/make-squashfs-hashed.sh
+new file mode 100755
+index 0000000..a4b183e
+--- /dev/null
++++ b/scripts/make-squashfs-hashed.sh
+@@ -0,0 +1,23 @@
++#!/bin/bash
++#
++# 1. Using veritysetup to append hash image into squashfs
++# 2. Parsing output of veritysetup to generate uboot script
++#
++SQUASHFS_FILE_PATH=$1
++STAGING_DIR_HOST=$2
++TOPDIR=$3
++SUMMARY_FILE=$4
++
++FILE_SIZE=`stat -c "%s" ${SQUASHFS_FILE_PATH}`
++BLOCK_SIZE=4096
++
++DATA_BLOCKS=$((${FILE_SIZE} / ${BLOCK_SIZE}))
++[ $((${FILE_SIZE} % ${BLOCK_SIZE})) -ne 0 ] && DATA_BLOCKS=$((${DATA_BLOCKS} + 1))
++
++HASH_OFFSET=$((${DATA_BLOCKS} * ${BLOCK_SIZE}))
++
++${STAGING_DIR_HOST}/bin/veritysetup format \
++ --data-blocks=${DATA_BLOCKS} \
++ --hash-offset=${HASH_OFFSET} \
++ ${SQUASHFS_FILE_PATH} ${SQUASHFS_FILE_PATH} \
++ > ${SUMMARY_FILE}
+diff --git a/scripts/prepare-dm-verity-uboot-script.sh b/scripts/prepare-dm-verity-uboot-script.sh
+new file mode 100755
+index 0000000..a66b921
+--- /dev/null
++++ b/scripts/prepare-dm-verity-uboot-script.sh
+@@ -0,0 +1,54 @@
++#!/bin/bash
++
++ROOT_DEVICE=$1
++EXTRA_ARGS=$2
++
++while read line; do
++ key=$(echo ${line} | cut -f1 -d':')
++ value=$(echo ${line} | cut -f2 -d':')
++
++ case "${key}" in
++ "UUID")
++ UUID=${value}
++ ;;
++ "Data blocks")
++ DATA_BLOCKS=${value}
++ ;;
++ "Data block size")
++ DATA_BLOCK_SIZE=${value}
++ ;;
++ "Hash block size")
++ HASH_BLOCK_SIZE=${value}
++ ;;
++ "Hash algorithm")
++ HASH_ALG=${value}
++ ;;
++ "Salt")
++ SALT=${value}
++ ;;
++ "Root hash")
++ ROOT_HASH=${value}
++ ;;
++ esac
++done
++
++#
++# dm-mod.create=<name>,<uuid>,<minor>,<flags>,
++# <start_sector> <num_sectors> <target_type> <target_args>
++# <target_type>=verity
++# <target_args>=<version> <data_dev> <hash_dev> <data_block_size> <hash_block_size>
++# <num_data_blocks> <hash_start_block> <algorithm> <root_hash> <salt>
++#
++# <uuid> ::= xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | ""
++# <minor> ::= The device minor number | ""
++# <flags> ::= "ro" | "rw"
++#
++# More detail in field you can ref.
++# Documentation/admin-guide/device-mapper/dm-init.rst
++# Documentation/admin-guide/device-mapper/verity.rst
++#
++
++BOOTARGS=$( printf '%s root=/dev/dm-0 dm-mod.create="dm-verity,,,ro,0 %s verity 1 %s %s %s %s %s %s %s %s %s"' \
++ "${EXTRA_ARGS}" $((${DATA_BLOCKS} * 8)) ${ROOT_DEVICE} ${ROOT_DEVICE} ${DATA_BLOCK_SIZE} ${HASH_BLOCK_SIZE} ${DATA_BLOCKS} $((${DATA_BLOCKS} + 1)) ${HASH_ALG} ${ROOT_HASH} ${SALT} )
++
++echo setenv bootargs ${BOOTARGS}
+diff --git a/tools/ar-tool/Makefile b/tools/ar-tool/Makefile
+new file mode 100644
+index 0000000..2b22ac0
+--- /dev/null
++++ b/tools/ar-tool/Makefile
+@@ -0,0 +1,36 @@
++#
++# Copyright (C) 2011-2012 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ar-tool
++PKG_VERSION:=1
++
++include $(INCLUDE_DIR)/host-build.mk
++
++define Host/Prepare
++ mkdir -p $(HOST_BUILD_DIR)
++ $(CP) ./src/* $(HOST_BUILD_DIR)/
++endef
++
++define Host/Compile
++ $(MAKE) -C $(HOST_BUILD_DIR)
++endef
++
++define Host/Configure
++endef
++
++define Host/Install
++ $(CP) $(HOST_BUILD_DIR)/ar-tool $(STAGING_DIR_HOST)/bin/
++endef
++
++define Host/Clean
++ rm -f $(HOST_BUILD_DIR)/ar-tool
++ rm -f $(STAGING_DIR_HOST)/bin/ar-tool
++endef
++
++$(eval $(call HostBuild))
+diff --git a/tools/ar-tool/src/Makefile b/tools/ar-tool/src/Makefile
+new file mode 100644
+index 0000000..26ab3cf
+--- /dev/null
++++ b/tools/ar-tool/src/Makefile
+@@ -0,0 +1,20 @@
++#
++# Copyright (C) 2019 MediaTek Inc.
++#
++# Author: Sam Shih <sam.shih@mediatek.com>
++#
++# SPDX-License-Identifier: BSD-3-Clause
++# https://spdx.org/licenses
++#
++
++TARGET := ar-tool
++
++.PHONY: all clean
++
++all: ${TARGET}
++
++%: %.py Makefile
++ cp $< $@
++
++clean:
++ rm ${TARGET}
+diff --git a/tools/ar-tool/src/ar-tool.py b/tools/ar-tool/src/ar-tool.py
+new file mode 100755
+index 0000000..e33510b
+--- /dev/null
++++ b/tools/ar-tool/src/ar-tool.py
+@@ -0,0 +1,302 @@
++#!/usr/bin/python
++import os
++import sys
++from xml.dom import minidom
++import pdb
++import traceback
++import re
++
++
++class bl_ar_table_t:
++
++ def __init__(self, input_file):
++ self.input_file = input_file
++ self.ar_ver_list = []
++
++ def generate_ar_ver_code(self):
++ code = ""
++ code += "/* \n"
++ code += " * This file is auto-generated by ar-tool\n"
++ code += " * please do not modify this file manually\n"
++ code += " */\n"
++ code += "#include <plat/common/platform.h>\n"
++ code += "const uint32_t bl_ar_ver = %d;\n" % self.ar_ver_list[-1]
++ return code
++
++ def generate_ar_conf_code(self):
++ code = ""
++ code += "BL_AR_VER\t:=\t%d\n" % self.ar_ver_list[-1]
++ return code
++
++ def check_and_set_ar_ver_list(self, ar_ver):
++ if ((ar_ver not in self.ar_ver_list) and (ar_ver <= 64) and (ar_ver >= 0)):
++ self.ar_ver_list.append(ar_ver)
++ return True
++ else:
++ return False
++
++ def get_data_by_name_from_ar_entry(self, xml_node, entry_id, name, print_err=True):
++ i = entry_id
++ datalist = xml_node.getElementsByTagName(name)
++ if not datalist:
++ if print_err is True:
++ print("XML parse fail in ar_entry[%d]:" % i)
++ print(" Chilld node '%s' not exist" % name)
++ return None
++ data = None
++ if len(datalist) != 1:
++ if print_err is True:
++ print("XML parse fail in ar_entry[%d]:" % i)
++ print(" Duplicate '%s' node exist" % name)
++ return None
++ datanode = datalist[0].firstChild
++ if not datanode:
++ if print_err is True:
++ print("XML parse fail in ar_entry[%d].%s:" % (i, name))
++ print(" '%s' data not exist" % name)
++ return None
++ if datanode.nodeType != datanode.TEXT_NODE:
++ if print_err is True:
++ print("XML parse fail in ar_entry[%d].%s:" % (i, name))
++ print(" '%s' data not exist" % name)
++ return None
++ return str(datanode.data)
++
++ def get_int_by_name_from_ar_entry(self, xml_node, entry_id, name, print_err=True):
++ data = self.get_data_by_name_from_ar_entry(xml_node, entry_id, name, print_err)
++ if data:
++ data = data.strip()
++ if not data.isdigit():
++ if print_err is True:
++ print("XML parse fail in ar_entry[%d].%s:" % (i, name))
++ print(" '%s' must be an integer" % name)
++ return None
++ return data
++ return None
++
++ def xml_debug_show(self, line, column):
++ f = open(self.input_file, "r")
++ if not f:
++ sys.stderr.write("Unable to open file '%s'\n" % self.input_file)
++ raise
++ xml_data = f.read()
++ xml_lines = xml_data.split("\n")
++ f.close()
++ print("input xml fail at line %d, column %d" % (line, column))
++ if line < 2:
++ show_lines = [xml_lines[line]]
++ elif line+2 >= len(xml_lines):
++ show_lines = [xml_lines[line]]
++ else:
++ show_lines = xml_lines[line-1:line+1]
++ for line in show_lines:
++ print(line)
++
++ def parse(self):
++ data = None
++ try:
++ f = open(self.input_file, "r")
++ if not f:
++ raise
++ f.close()
++ except:
++ sys.stderr.write("Unable to open file '%s'\n" % self.input_file)
++ return 1
++ try:
++ xmldoc = minidom.parse(self.input_file)
++ ar_entry_list = xmldoc.getElementsByTagName('bl_ar_entry')
++
++ for i in range(0, len(ar_entry_list)):
++ ar_entry = ar_entry_list[i]
++ data = self.get_int_by_name_from_ar_entry(ar_entry, i, "USED", False)
++ if not data:
++ continue
++
++ data = self.get_int_by_name_from_ar_entry(ar_entry, i, "BL_AR_VER")
++ if not data:
++ return 1
++ if data:
++ data = data.strip()
++ if self.check_and_set_ar_ver_list(int(data)) is False:
++ print("XML parse fail in bl_ar_entry[%d].BL_AR_VER:" % i)
++ print(" 'BL_AR_VER' value duplicate or exceed range")
++ return 1
++ print("Get %d record in bl_ar_table" % len(self.ar_ver_list))
++ except:
++ sys.stderr.write("Unable to parse file '%s'\n" % self.input_file)
++ crash_info = traceback.format_exc()
++ m = re.search("ExpatError: mismatched tag: line (.+), column (.+)", crash_info)
++ if m:
++ line = int(m.group(1))
++ column = int(m.group(2))
++ self.xml_debug_show(line, column)
++ print(m.group(0))
++ else:
++ print(crash_info)
++ return 1
++ return 0
++
++
++class fw_ar_table_t:
++
++ def __init__(self, input_file):
++ self.input_file = input_file
++ self.ar_ver_list = []
++
++ def generate_ar_ver_code(self):
++ code = ""
++ code += "/* \n"
++ code += " * This file is auto-generated by ar-tool\n"
++ code += " * please do not modify this file manually\n"
++ code += " */\n"
++ code += "const uint32_t fw_ar_ver = %d;\n" % self.ar_ver_list[-1]
++ return code
++
++ def generate_ar_conf_code(self):
++ code = ""
++ code += "FW_AR_VER\t:=\t%d\n" % self.ar_ver_list[-1]
++ return code
++
++ def check_and_set_ar_ver_list(self, ar_ver):
++ if ((ar_ver not in self.ar_ver_list) and (ar_ver <= 64) and (ar_ver >= 0)):
++ self.ar_ver_list.append(ar_ver)
++ return True
++ else:
++ return False
++
++ def get_data_by_name_from_ar_entry(self, xml_node, entry_id, name, print_err=True):
++ i = entry_id
++ datalist = xml_node.getElementsByTagName(name)
++ if not datalist:
++ if print_err is True:
++ print("XML parse fail in ar_entry[%d]:" % i)
++ print(" Chilld node '%s' not exist" % name)
++ return None
++ data = None
++ if len(datalist) != 1:
++ if print_err is True:
++ print("XML parse fail in ar_entry[%d]:" % i)
++ print(" Duplicate '%s' node exist" % name)
++ return None
++ datanode = datalist[0].firstChild
++ if not datanode:
++ if print_err is True:
++ print("XML parse fail in ar_entry[%d].%s:" % (i, name))
++ print(" '%s' data not exist" % name)
++ return None
++ if datanode.nodeType != datanode.TEXT_NODE:
++ if print_err is True:
++ print("XML parse fail in ar_entry[%d].%s:" % (i, name))
++ print(" '%s' data not exist" % name)
++ return None
++ return str(datanode.data)
++
++ def get_int_by_name_from_ar_entry(self, xml_node, entry_id, name, print_err=True):
++ data = self.get_data_by_name_from_ar_entry(xml_node, entry_id, name, print_err)
++ if data:
++ data = data.strip()
++ if not data.isdigit():
++ if print_err is True:
++ print("XML parse fail in ar_entry[%d].%s:" % (i, name))
++ print(" '%s' must be an integer" % name)
++ return None
++ return data
++ return None
++
++ def xml_debug_show(self, line, column):
++ f = open(self.input_file, "r")
++ if not f:
++ sys.stderr.write("Unable to open file '%s'\n" % self.input_file)
++ raise
++ xml_data = f.read()
++ xml_lines = xml_data.split("\n")
++ f.close()
++ print("input xml fail at line %d, column %d" % (line, column))
++ if line < 2:
++ show_lines = [xml_lines[line]]
++ elif line+2 >= len(xml_lines):
++ show_lines = [xml_lines[line]]
++ else:
++ show_lines = xml_lines[line-1:line+1]
++ for line in show_lines:
++ print(line)
++
++ def parse(self):
++ data = None
++ try:
++ f = open(self.input_file, "r")
++ if not f:
++ raise
++ f.close()
++ except:
++ sys.stderr.write("Unable to open file '%s'\n" % self.input_file)
++ return 1
++ try:
++ xmldoc = minidom.parse(self.input_file)
++ ar_entry_list = xmldoc.getElementsByTagName('fw_ar_entry')
++
++ for i in range(0, len(ar_entry_list)):
++ ar_entry = ar_entry_list[i]
++ data = self.get_int_by_name_from_ar_entry(ar_entry, i, "USED", False)
++ if not data:
++ continue
++
++ data = self.get_int_by_name_from_ar_entry(ar_entry, i, "FW_AR_VER")
++ if not data:
++ return 1
++ if data:
++ data = data.strip()
++ if self.check_and_set_ar_ver_list(int(data)) is False:
++ print("XML parse fail in fw_ar_entry[%d].FW_AR_VER:" % i)
++ print(" 'FW_AR_VER' value duplicate or exceed range")
++ return 1
++ print("Get %d record in fw_ar_table" % len(self.ar_ver_list))
++ except:
++ sys.stderr.write("Unable to parse file '%s'\n" % self.input_file)
++ crash_info = traceback.format_exc()
++ m = re.search("ExpatError: mismatched tag: line (.+), column (.+)", crash_info)
++ if m:
++ line = int(m.group(1))
++ column = int(m.group(2))
++ self.xml_debug_show(line, column)
++ print(m.group(0))
++ else:
++ print(crash_info)
++ return 1
++ return 0
++
++
++def main(argc, argv):
++ if argc != 5:
++ sys.stdout.write("ar-tool [bl_ar_table|fw_ar_table] [create_ar_ver|create_ar_conf] $(input_file) $(output_file)\n")
++ return 1
++ if argv[1] == "bl_ar_table":
++ ar_table = bl_ar_table_t(argv[3])
++ else:
++ ar_table = fw_ar_table_t(argv[3])
++ if ar_table.parse() != 0:
++ return 1
++ if argv[2] == "create_ar_ver":
++ code = ar_table.generate_ar_ver_code()
++ print("(%s) --> (%s)" % (argv[3], argv[4]))
++ #print(code)
++ f = open(argv[4], "w")
++ f.write(code)
++ f.close()
++ return 0
++ elif argv[2] == "create_ar_conf":
++ code = ar_table.generate_ar_conf_code()
++ print("(%s) --> (%s)" % (argv[3], argv[4]))
++ #print(code)
++ f = open(argv[4], "w")
++ f.write(code)
++ f.close()
++ return 0
++ else:
++ print("Unknow option '%s'" % argv[1])
++ return 1
++
++
++if __name__ == '__main__':
++ sys.exit(main(len(sys.argv), sys.argv))
++