diff --git a/.github/labeler.yml b/.github/labeler.yml
index 826931501..8f1517115 100644
--- a/.github/labeler.yml
+++ b/.github/labeler.yml
@@ -28,6 +28,7 @@
"Software :chains:":
- lib/*
+ - tools/*
- config/cli/*
- .github/workflows/*
diff --git a/tools/README.md b/tools/README.md
new file mode 100644
index 000000000..a77dce54a
--- /dev/null
+++ b/tools/README.md
@@ -0,0 +1,4 @@
+|tool| usage|
+|:--|:--|
+|mk_format_patch|facilitate the creation of a series of non-numbered patches|
+|unifying_configs|helps to unify kernel configs (kernel 5.x only)|
diff --git a/tools/mk_format_patch b/tools/mk_format_patch
new file mode 100755
index 000000000..3f4eee773
--- /dev/null
+++ b/tools/mk_format_patch
@@ -0,0 +1,240 @@
+#!/bin/bash
+#
+# License: (MIT)
+#
+# Copyright (c) 2020-2022 Leonid Gasheev aka
+#
+# mkdir -p ~/tmp/kernel.org-5.10/patches.kernel.org
+# cd /gituser/linux-stable>
+# mk_format_patch . v5.10.40..v5.10.41 ~/tmp/kernel.org-5.10/patches.kernel.org
+#
+
+used_f ()
+{
+ echo -e "$mess"
+ echo -e "\n Used:"
+ echo -e "\n$0 \n\nor"
+ echo -e "\n$0 \n"
+}
+
+# intelect copy
+# Copy only those patches that have changed their content,
+# so as not to create unnecessary noise.
+ii_cp()
+{
+ local new_p=$1
+ local old_p=$2
+
+ if [ "$(diff -N \
+ --ignore-matching-lines="^From [0-9a-f]\{40\}" \
+ --ignore-matching-lines="^index [0-9a-f]\{7\}" \
+ --ignore-matching-lines="^Subject:" \
+ $old_p $new_p 2>/dev/null)" != "" ]
+ then
+ cp --backup=none -f $new_p $old_p
+ counter=1
+ else
+ counter=0
+ fi
+}
+
+mk_patch_series ()
+{
+ local url_t="${1}"
+ if test -d "$url_t"; then url_t="$(realpath $url_t)"; fi
+ local range="${2:-HEAD..HEAD}"
+ local target="${3:-~/tmp}"
+ if test -d $target; then target="$(realpath $target)"; fi
+ for p in ${4} ${5} ${6}
+ do
+ case $p in
+ *=*) eval "local ${p}" ;;
+ esac
+ done
+
+ local target_name
+ local target_dir
+ local mess=""
+
+ echo -e "\nLOCAL GIT URL =: [\033[1;34m$url_t\033[0m]"
+ echo -e "revision range =: [\033[1;34m$range\033[0m]"
+ echo -e "target folder for patches =: [\033[1;34m$target\033[0m]"
+ echo -e "prefix =: [\033[1;34m$prefix\033[0m]"
+ echo -e "numbered =: [\033[1;31m${numbered:-false}\033[0m]\n"
+
+ [ -d $url_t ] || mess+=" bad url [$url_t]\n"
+ [ "$(git -C $url_t rev-parse --git-dir 2>/dev/null)" != ".git" ] && \
+ mess+=" It's NOT git\n"
+
+ [ $(git -C $url_t rev-list ${range%..*} -1 2>/dev/null) ] || \
+ mess+=" bad first tag [${range%..*}]\n"
+
+ [ $(git -C $url_t rev-list ${range#*..} -1 2>/dev/null) ] || \
+ mess+=" bad second tag [${range#*..}]\n"
+
+ [ -d $target ] || mess+=" bad target dir [$target]\n"
+
+if [ "$mess" == "" ]
+then
+ local tmp_dir=$(mktemp -d /tmp/format_patch_XXXXXXX)
+ local origin_url="$(git -C $url_t remote get-url origin 2>/dev/null)"
+
+ echo " It's generate format-patch: "
+ echo " In tmp folder: $tmp_dir"
+
+ target_name="$(basename $target)"
+ target_dir="$(dirname $target)"
+
+ if ! $numbered
+ then
+ numbered=false
+ if test "${target_name#*.}" != "$target_name"
+ then
+ sufix="${target_name#*.}"
+ else
+ sufix="conf"
+ fi
+ else
+ case "$origin_url" in
+
+ *linux-stable*)
+ numbered=${numbered:-true}
+ prefix="${range#*..v}-"
+ sufix="kernel.org"
+ ;;
+
+ *megous*)
+ numbered=${numbered:-false}
+ t_branch="$(git -C $url_t branch --show-current)"
+ prefix=${prefix:-"o${t_branch#*-}-"}
+ #sufix="${t_branch%%-*}${t_branch#*-}"
+ sufix="megous"
+ ;;
+
+ *linux-evl*)
+ numbered=${numbered:-false}
+ t_branch="$(git -C $url_t branch --show-current)"
+ sufix='evl'
+ ;;
+
+ *)
+ numbered=${numbered:-true}
+ prefix=PREF
+ sufix=SUF
+ ;;
+ esac
+
+ fi
+
+
+ if [ -f ${target_dir}/series.$sufix ];then
+
+ mv -f ${target_dir}/series.$sufix ${target_dir}/series.${sufix}.old
+ grep "^#.*$" ${target_dir}/series.${sufix}.old > ${target_dir}/series.$sufix
+
+ else
+
+ echo -e "#\n#\tAutomatically generated by the script mk_format_patch\n#" \
+ >${target_dir}/series.$sufix
+
+ [ -n "$origin_url" ] && \
+ echo -e "#\t${origin_url}\n#" >>${target_dir}/series.$sufix
+
+ fi
+
+ if $numbered
+ then
+ $(git -C $url_t \
+ format-patch $range \
+ -o $tmp_dir/
+ ) 2>/dev/null
+
+ echo -e "\t\tAll generated patches: [$(ls $tmp_dir | wc -l)]"
+ $(cd $tmp_dir
+ for pt in $(ls)
+ do
+ if test -s $pt
+ then
+ echo -e "\t$target_name/${prefix}${pt#*0}" \
+ >> ${target_dir}/series.$sufix
+
+ mv $pt ${target}/${prefix}${pt#*0}
+ fi
+ done
+ )
+
+ else
+ mkdir $tmp_dir/$target_name
+ sum_counter=0
+ prefix=""
+
+ $(git -C $url_t \
+ format-patch --filename-max-length=75 $range \
+ -o $tmp_dir/$target_name
+ ) 2>/dev/null
+
+ echo -e "\t\tAll generated patches: [$(cd $tmp_dir/$target_name; ls | wc -l)]"
+ $(cd $tmp_dir/$target_name
+ for pt in $(ls)
+ do
+ if test -s $pt
+ then
+ if test -f ${prefix}${pt#*-} && test -f "2-${prefix}${pt#*-}";then
+
+ $(konsole -e /usr/bin/nano "2-${prefix}${pt#*-}") & \
+ konsole -e /usr/bin/nano ${pt} & \
+ konsole -e /usr/bin/nano ../series.$sufix && \
+ wait
+
+ elif test -f ${prefix}${pt#*-};then
+
+ echo -e "\t$target_name/2-${prefix}${pt#*-}" \
+ >> ../series.$sufix
+ mv $pt "2-${prefix}${pt#*-}"
+
+ else
+ echo -e "\t$target_name/${prefix}${pt#*-}" \
+ >> ../series.$sufix
+ mv $pt ${prefix}${pt#*-}
+ fi
+ else
+ rm $pt
+ fi
+ done
+ )
+ echo -e "\t\tGood patches: [$(cd $tmp_dir/$target_name; ls | wc -l)]"
+
+ # Remove non-existent patches if they have been renamed or are no longer applied.
+ $(cd $target
+ for pt in $(ls)
+ do
+ if test ! -f $tmp_dir/$target_name/$pt;then rm $pt;fi
+ done
+ )
+
+ # Intelligent copying
+ $(cd $tmp_dir/$target_name
+ for pt in $(ls)
+ do
+ ii_cp $pt $target/$pt
+ done
+ )
+ cat $tmp_dir/series.$sufix >>${target_dir}/series.$sufix
+ rm -f ${target_dir}/series.${sufix}.old
+
+ fi
+
+ rm -rf $tmp_dir
+else
+ used_f
+fi
+}
+
+########## start ##########
+counter=0
+#echo "cmd line = [$@]"
+mk_patch_series ${1} ${2} ${3} ${4} ${5} ${6}
+
+###########
+exit
+###########
diff --git a/tools/unifying_configs b/tools/unifying_configs
new file mode 100755
index 000000000..e5e8d6dc0
--- /dev/null
+++ b/tools/unifying_configs
@@ -0,0 +1,35 @@
+#!/bin/bash
+#
+# License: (MIT)
+#
+# Copyright (c) 2020-2022 Igor Pecovnik
+#
+# This small snippet helps to unify kernel configs > v5 uptions
+#
+# Usage:
+# cd config/kernel
+# bash unifying_configs CONFIG_HAVE_FUNCTION_TRACER y
+#
+
+if [[ -n $1 ]]; then
+
+while true; do
+ read -p "Do you wish to apply changes? " yn
+ case $yn in
+ [Yy]* )
+ LOCATION=($(grep " Kernel Configuration" *.config | grep " 5." | cut -d":" -f1))
+ for loc in "${LOCATION[@]}"
+ do
+ if grep --quiet "# $1 is not set" $loc; then
+ echo "Changing ... $1 in file $loc"
+ sed -i -- 's/# '$1' is not set/'$1'='$2'/g' $loc
+ fi
+ done
+ break;;
+ [Nn]* ) exit;;
+ * ) echo "Please answer yes or no.";;
+ esac
+done
+else
+ echo "Example use: bash $(basename "$0") CONFIG_HAVE_FUNCTION_TRACER y"
+fi