commit:     6664485fa485389a7dc56f27dc52dff43bfb6bbd
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Mon May  4 20:58:59 2020 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Mon May  4 20:58:59 2020 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=6664485f

Adding genpatches. Detail in full log

Support for namespace user.pax.* on tmpfs.
Enable link security restrictions by default.
Bluetooth: Check key sizes only when Secure Simple Pairing is
enabled. See bug #686758.This hid-apple patch enables swapping
of the FN and left Control keys and some additional on some
apple keyboards. See bug #622902.Add Gentoo Linux support
config settings and defaults. Kernel patch enables gcc >= v9.1
optimizations for additional CPUs. Patch to tmp513 to require
REGMAP_I2C for building. Add support for ZSTD-compressed kernel
and initramfs (use=experimental)

Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org>

 0000_README                                        |  56 ++
 1500_XATTR_USER_PREFIX.patch                       |  67 +++
 ...ble-link-security-restrictions-by-default.patch |  20 +
 ...zes-only-if-Secure-Simple-Pairing-enabled.patch |  37 ++
 2600_enable-key-swapping-for-apple-mac.patch       | 114 ++++
 ...3-Fix-build-issue-by-selecting-CONFIG_REG.patch |  30 +
 ..._ZSTD-v5-1-8-prepare-zstd-for-preboot-env.patch |  82 +++
 ...STD-v5-2-8-prepare-xxhash-for-preboot-env.patch |  94 +++
 ...STD-v5-3-8-add-zstd-support-to-decompress.patch | 422 ++++++++++++++
 ...-v5-4-8-add-support-for-zstd-compres-kern.patch |  65 +++
 ...add-support-for-zstd-compressed-initramfs.patch |  50 ++
 ..._ZSTD-v5-6-8-bump-ZO-z-extra-bytes-margin.patch |  20 +
 ...v5-7-8-support-for-ZSTD-compressed-kernel.patch |  92 +++
 ...5-8-8-gitignore-add-ZSTD-compressed-files.patch |  12 +
 5012_enable-cpu-optimizations-for-gcc91.patch      | 632 +++++++++++++++++++++
 15 files changed, 1793 insertions(+)

diff --git a/0000_README b/0000_README
index 9018993..639ad9e 100644
--- a/0000_README
+++ b/0000_README
@@ -43,6 +43,62 @@ EXPERIMENTAL
 Individual Patch Descriptions:
 --------------------------------------------------------------------------
 
+Patch:  1500_XATTR_USER_PREFIX.patch
+From:   https://bugs.gentoo.org/show_bug.cgi?id=470644
+Desc:   Support for namespace user.pax.* on tmpfs.
+
+Patch:  1510_fs-enable-link-security-restrictions-by-default.patch
+From:   
http://sources.debian.net/src/linux/3.16.7-ckt4-3/debian/patches/debian/fs-enable-link-security-restrictions-by-default.patch/
+Desc:   Enable link security restrictions by default.
+
+Patch:  2000_BT-Check-key-sizes-only-if-Secure-Simple-Pairing-enabled.patch
+From:   
https://lore.kernel.org/linux-bluetooth/[email protected]/raw
+Desc:   Bluetooth: Check key sizes only when Secure Simple Pairing is enabled. 
See bug #686758
+
+Patch:  2600_enable-key-swapping-for-apple-mac.patch
+From:   https://github.com/free5lot/hid-apple-patched
+Desc:   This hid-apple patch enables swapping of the FN and left Control keys 
and some additional on some apple keyboards. See bug #622902
+
+Patch:  2900_tmp513-Fix-build-issue-by-selecting-CONFIG_REG.patch
+From:   https://bugs.gentoo.org/710790
+Desc:   tmp513 requies REGMAP_I2C to build.  Select it by default in Kconfig. 
See bug #710790. Thanks to Phil Stracchino
+
 Patch:  4567_distro-Gentoo-Kconfig.patch
 From:   Tom Wijsman <[email protected]>
 Desc:   Add Gentoo Linux support config settings and defaults.
+
+Patch:         5000_ZSTD-v5-1-8-prepare-zstd-for-preboot-env.patch
+From:   https://lkml.org/lkml/2020/4/1/29
+Desc:   lib: prepare zstd for preboot environment
+
+Patch:  5001_ZSTD-v5-2-8-prepare-xxhash-for-preboot-env.patch
+From:   https://lkml.org/lkml/2020/4/1/29
+Desc:   lib: prepare xxhash for preboot environment
+
+Patch:  5002_ZSTD-v5-3-8-add-zstd-support-to-decompress.patch
+From:   https://lkml.org/lkml/2020/4/1/29
+Desc:   lib: add zstd support to decompress
+
+Patch:  5003_ZSTD-v5-4-8-add-support-for-zstd-compres-kern.patch
+From:   https://lkml.org/lkml/2020/4/1/29
+Desc:   init: add support for zstd compressed kernel
+
+Patch:  5004_ZSTD-v5-5-8-add-support-for-zstd-compressed-initramfs.patch
+From:   https://lkml.org/lkml/2020/4/1/29
+Desc:   usr: add support for zstd compressed initramfs
+
+Patch:  5005_ZSTD-v5-6-8-bump-ZO-z-extra-bytes-margin.patch
+From:   https://lkml.org/lkml/2020/4/1/29
+Desc:   x86: bump ZO_z_extra_bytes margin for zstd
+
+Patch:  5006_ZSTD-v5-7-8-support-for-ZSTD-compressed-kernel.patch
+From:   https://lkml.org/lkml/2020/4/1/29
+Desc:   x86: Add support for ZSTD compressed kernel
+
+Patch:  5007_ZSTD-v5-8-8-gitignore-add-ZSTD-compressed-files.patch
+From:   https://lkml.org/lkml/2020/4/1/29
+Desc:   .gitignore: add ZSTD-compressed files
+
+Patch:  5012_enable-cpu-optimizations-for-gcc91.patch
+From:   https://github.com/graysky2/kernel_gcc_patch/
+Desc:   Kernel patch enables gcc >= v9.1 optimizations for additional CPUs.

diff --git a/1500_XATTR_USER_PREFIX.patch b/1500_XATTR_USER_PREFIX.patch
new file mode 100644
index 0000000..245dcc2
--- /dev/null
+++ b/1500_XATTR_USER_PREFIX.patch
@@ -0,0 +1,67 @@
+From: Anthony G. Basile <[email protected]>
+
+This patch adds support for a restricted user-controlled namespace on
+tmpfs filesystem used to house PaX flags.  The namespace must be of the
+form user.pax.* and its value cannot exceed a size of 8 bytes.
+
+This is needed even on all Gentoo systems so that XATTR_PAX flags
+are preserved for users who might build packages using portage on
+a tmpfs system with a non-hardened kernel and then switch to a
+hardened kernel with XATTR_PAX enabled.
+
+The namespace is added to any user with Extended Attribute support
+enabled for tmpfs.  Users who do not enable xattrs will not have
+the XATTR_PAX flags preserved.
+
+diff --git a/include/uapi/linux/xattr.h b/include/uapi/linux/xattr.h
+index 1590c49..5eab462 100644
+--- a/include/uapi/linux/xattr.h
++++ b/include/uapi/linux/xattr.h
+@@ -73,5 +73,9 @@
+ #define XATTR_POSIX_ACL_DEFAULT  "posix_acl_default"
+ #define XATTR_NAME_POSIX_ACL_DEFAULT XATTR_SYSTEM_PREFIX 
XATTR_POSIX_ACL_DEFAULT
+ 
++/* User namespace */
++#define XATTR_PAX_PREFIX XATTR_USER_PREFIX "pax."
++#define XATTR_PAX_FLAGS_SUFFIX "flags"
++#define XATTR_NAME_PAX_FLAGS XATTR_PAX_PREFIX XATTR_PAX_FLAGS_SUFFIX
+ 
+ #endif /* _UAPI_LINUX_XATTR_H */
+--- a/mm/shmem.c       2020-05-04 15:30:27.042035334 -0400
++++ b/mm/shmem.c       2020-05-04 15:34:57.013881725 -0400
+@@ -3238,6 +3238,14 @@ static int shmem_xattr_handler_set(const
+       struct shmem_inode_info *info = SHMEM_I(inode);
+ 
+       name = xattr_full_name(handler, name);
++
++      if (!strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN)) {
++              if (strcmp(name, XATTR_NAME_PAX_FLAGS))
++                      return -EOPNOTSUPP;
++              if (size > 8)
++                      return -EINVAL;
++      }
++
+       return simple_xattr_set(&info->xattrs, name, value, size, flags, NULL);
+ }
+ 
+@@ -3253,6 +3261,12 @@ static const struct xattr_handler shmem_
+       .set = shmem_xattr_handler_set,
+ };
+ 
++static const struct xattr_handler shmem_user_xattr_handler = {
++      .prefix = XATTR_USER_PREFIX,
++      .get = shmem_xattr_handler_get,
++      .set = shmem_xattr_handler_set,
++};
++
+ static const struct xattr_handler *shmem_xattr_handlers[] = {
+ #ifdef CONFIG_TMPFS_POSIX_ACL
+       &posix_acl_access_xattr_handler,
+@@ -3260,6 +3274,7 @@ static const struct xattr_handler *shmem
+ #endif
+       &shmem_security_xattr_handler,
+       &shmem_trusted_xattr_handler,
++      &shmem_user_xattr_handler,
+       NULL
+ };
+ 

diff --git a/1510_fs-enable-link-security-restrictions-by-default.patch 
b/1510_fs-enable-link-security-restrictions-by-default.patch
new file mode 100644
index 0000000..f0ed144
--- /dev/null
+++ b/1510_fs-enable-link-security-restrictions-by-default.patch
@@ -0,0 +1,20 @@
+From: Ben Hutchings <[email protected]>
+Subject: fs: Enable link security restrictions by default
+Date: Fri, 02 Nov 2012 05:32:06 +0000
+Bug-Debian: https://bugs.debian.org/609455
+Forwarded: not-needed
+This reverts commit 561ec64ae67ef25cac8d72bb9c4bfc955edfd415
+('VFS: don't do protected {sym,hard}links by default').
+--- a/fs/namei.c       2018-09-28 07:56:07.770005006 -0400
++++ b/fs/namei.c       2018-09-28 07:56:43.370349204 -0400
+@@ -885,8 +885,8 @@ static inline void put_link(struct namei
+               path_put(&last->link);
+ }
+ 
+-int sysctl_protected_symlinks __read_mostly = 0;
+-int sysctl_protected_hardlinks __read_mostly = 0;
++int sysctl_protected_symlinks __read_mostly = 1;
++int sysctl_protected_hardlinks __read_mostly = 1;
+ int sysctl_protected_fifos __read_mostly;
+ int sysctl_protected_regular __read_mostly;
+ 

diff --git 
a/2000_BT-Check-key-sizes-only-if-Secure-Simple-Pairing-enabled.patch 
b/2000_BT-Check-key-sizes-only-if-Secure-Simple-Pairing-enabled.patch
new file mode 100644
index 0000000..394ad48
--- /dev/null
+++ b/2000_BT-Check-key-sizes-only-if-Secure-Simple-Pairing-enabled.patch
@@ -0,0 +1,37 @@
+The encryption is only mandatory to be enforced when both sides are using
+Secure Simple Pairing and this means the key size check makes only sense
+in that case.
+
+On legacy Bluetooth 2.0 and earlier devices like mice the encryption was
+optional and thus causing an issue if the key size check is not bound to
+using Secure Simple Pairing.
+
+Fixes: d5bb334a8e17 ("Bluetooth: Align minimum encryption key size for LE and 
BR/EDR connections")
+Signed-off-by: Marcel Holtmann <[email protected]>
+Cc: [email protected]
+---
+ net/bluetooth/hci_conn.c | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
+index 3cf0764d5793..7516cdde3373 100644
+--- a/net/bluetooth/hci_conn.c
++++ b/net/bluetooth/hci_conn.c
+@@ -1272,8 +1272,13 @@ int hci_conn_check_link_mode(struct hci_conn *conn)
+                       return 0;
+       }
+ 
+-      if (hci_conn_ssp_enabled(conn) &&
+-          !test_bit(HCI_CONN_ENCRYPT, &conn->flags))
++      /* If Secure Simple Pairing is not enabled, then legacy connection
++       * setup is used and no encryption or key sizes can be enforced.
++       */
++      if (!hci_conn_ssp_enabled(conn))
++              return 1;
++
++      if (!test_bit(HCI_CONN_ENCRYPT, &conn->flags))
+               return 0;
+ 
+       /* The minimum encryption key size needs to be enforced by the
+-- 
+2.20.1

diff --git a/2600_enable-key-swapping-for-apple-mac.patch 
b/2600_enable-key-swapping-for-apple-mac.patch
new file mode 100644
index 0000000..ab228d3
--- /dev/null
+++ b/2600_enable-key-swapping-for-apple-mac.patch
@@ -0,0 +1,114 @@
+--- a/drivers/hid/hid-apple.c
++++ b/drivers/hid/hid-apple.c
+@@ -52,6 +52,22 @@
+               "(For people who want to keep Windows PC keyboard muscle 
memory. "
+               "[0] = as-is, Mac layout. 1 = swapped, Windows layout.)");
+ 
++static unsigned int swap_fn_leftctrl;
++module_param(swap_fn_leftctrl, uint, 0644);
++MODULE_PARM_DESC(swap_fn_leftctrl, "Swap the Fn and left Control keys. "
++              "(For people who want to keep PC keyboard muscle memory. "
++              "[0] = as-is, Mac layout, 1 = swapped, PC layout)");
++
++static unsigned int rightalt_as_rightctrl;
++module_param(rightalt_as_rightctrl, uint, 0644);
++MODULE_PARM_DESC(rightalt_as_rightctrl, "Use the right Alt key as a right 
Ctrl key. "
++              "[0] = as-is, Mac layout. 1 = Right Alt is right Ctrl");
++
++static unsigned int ejectcd_as_delete;
++module_param(ejectcd_as_delete, uint, 0644);
++MODULE_PARM_DESC(ejectcd_as_delete, "Use Eject-CD key as Delete key. "
++              "([0] = disabled, 1 = enabled)");
++
+ struct apple_sc {
+       unsigned long quirks;
+       unsigned int fn_on;
+@@ -164,6 +180,21 @@
+       { }
+ };
+ 
++static const struct apple_key_translation swapped_fn_leftctrl_keys[] = {
++      { KEY_FN, KEY_LEFTCTRL },
++      { }
++};
++
++static const struct apple_key_translation rightalt_as_rightctrl_keys[] = {
++      { KEY_RIGHTALT, KEY_RIGHTCTRL },
++      { }
++};
++
++static const struct apple_key_translation ejectcd_as_delete_keys[] = {
++      { KEY_EJECTCD,  KEY_DELETE },
++      { }
++};
++
+ static const struct apple_key_translation *apple_find_translation(
+               const struct apple_key_translation *table, u16 from)
+ {
+@@ -183,9 +214,11 @@
+       struct apple_sc *asc = hid_get_drvdata(hid);
+       const struct apple_key_translation *trans, *table;
+ 
+-      if (usage->code == KEY_FN) {
++      u16 fn_keycode = (swap_fn_leftctrl) ? (KEY_LEFTCTRL) : (KEY_FN);
++
++      if (usage->code == fn_keycode) {
+               asc->fn_on = !!value;
+-              input_event(input, usage->type, usage->code, value);
++              input_event(input, usage->type, KEY_FN, value);
+               return 1;
+       }
+ 
+@@ -264,6 +297,30 @@
+               }
+       }
+ 
++      if (swap_fn_leftctrl) {
++              trans = apple_find_translation(swapped_fn_leftctrl_keys, 
usage->code);
++              if (trans) {
++                      input_event(input, usage->type, trans->to, value);
++                      return 1;
++              }
++      }
++
++      if (ejectcd_as_delete) {
++              trans = apple_find_translation(ejectcd_as_delete_keys, 
usage->code);
++              if (trans) {
++                      input_event(input, usage->type, trans->to, value);
++                      return 1;
++              }
++      }
++
++      if (rightalt_as_rightctrl) {
++              trans = apple_find_translation(rightalt_as_rightctrl_keys, 
usage->code);
++              if (trans) {
++                      input_event(input, usage->type, trans->to, value);
++                      return 1;
++              }
++      }
++
+       return 0;
+ }
+ 
+@@ -327,6 +384,21 @@
+ 
+       for (trans = apple_iso_keyboard; trans->from; trans++)
+               set_bit(trans->to, input->keybit);
++
++      if (swap_fn_leftctrl) {
++              for (trans = swapped_fn_leftctrl_keys; trans->from; trans++)
++                      set_bit(trans->to, input->keybit);
++      }
++
++      if (ejectcd_as_delete) {
++              for (trans = ejectcd_as_delete_keys; trans->from; trans++)
++                      set_bit(trans->to, input->keybit);
++      }
++
++        if (rightalt_as_rightctrl) {
++              for (trans = rightalt_as_rightctrl_keys; trans->from; trans++)
++                      set_bit(trans->to, input->keybit);
++      }
+ }
+ 
+ static int apple_input_mapping(struct hid_device *hdev, struct hid_input *hi,

diff --git a/2900_tmp513-Fix-build-issue-by-selecting-CONFIG_REG.patch 
b/2900_tmp513-Fix-build-issue-by-selecting-CONFIG_REG.patch
new file mode 100644
index 0000000..4335685
--- /dev/null
+++ b/2900_tmp513-Fix-build-issue-by-selecting-CONFIG_REG.patch
@@ -0,0 +1,30 @@
+From dc328d75a6f37f4ff11a81ae16b1ec88c3197640 Mon Sep 17 00:00:00 2001
+From: Mike Pagano <[email protected]>
+Date: Mon, 23 Mar 2020 08:20:06 -0400
+Subject: [PATCH 1/1] This driver requires REGMAP_I2C to build.  Select it by
+ default in Kconfig. Reported at gentoo bugzilla:
+ https://bugs.gentoo.org/710790
+Cc: [email protected]
+
+Reported-by: Phil Stracchino <[email protected]>
+
+Signed-off-by: Mike Pagano <[email protected]>
+---
+ drivers/hwmon/Kconfig | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
+index 47ac20aee06f..530b4f29ba85 100644
+--- a/drivers/hwmon/Kconfig
++++ b/drivers/hwmon/Kconfig
+@@ -1769,6 +1769,7 @@ config SENSORS_TMP421
+ config SENSORS_TMP513
+       tristate "Texas Instruments TMP513 and compatibles"
+       depends on I2C
++      select REGMAP_I2C
+       help
+         If you say yes here you get support for Texas Instruments TMP512,
+         and TMP513 temperature and power supply sensor chips.
+-- 
+2.24.1
+

diff --git a/5000_ZSTD-v5-1-8-prepare-zstd-for-preboot-env.patch 
b/5000_ZSTD-v5-1-8-prepare-zstd-for-preboot-env.patch
new file mode 100644
index 0000000..297a8d4
--- /dev/null
+++ b/5000_ZSTD-v5-1-8-prepare-zstd-for-preboot-env.patch
@@ -0,0 +1,82 @@
+diff --git a/lib/zstd/decompress.c b/lib/zstd/decompress.c
+index 269ee9a796c1..73ded63278cf 100644
+--- a/lib/zstd/decompress.c
++++ b/lib/zstd/decompress.c
+@@ -2490,6 +2490,7 @@ size_t ZSTD_decompressStream(ZSTD_DStream *zds, 
ZSTD_outBuffer *output, ZSTD_inB
+       }
+ }
+ 
++#ifndef ZSTD_PREBOOT
+ EXPORT_SYMBOL(ZSTD_DCtxWorkspaceBound);
+ EXPORT_SYMBOL(ZSTD_initDCtx);
+ EXPORT_SYMBOL(ZSTD_decompressDCtx);
+@@ -2529,3 +2530,4 @@ EXPORT_SYMBOL(ZSTD_insertBlock);
+ 
+ MODULE_LICENSE("Dual BSD/GPL");
+ MODULE_DESCRIPTION("Zstd Decompressor");
++#endif
+diff --git a/lib/zstd/fse_decompress.c b/lib/zstd/fse_decompress.c
+index a84300e5a013..0b353530fb3f 100644
+--- a/lib/zstd/fse_decompress.c
++++ b/lib/zstd/fse_decompress.c
+@@ -47,6 +47,7 @@
+ ****************************************************************/
+ #include "bitstream.h"
+ #include "fse.h"
++#include "zstd_internal.h"
+ #include <linux/compiler.h>
+ #include <linux/kernel.h>
+ #include <linux/string.h> /* memcpy, memset */
+@@ -60,14 +61,6 @@
+               enum { FSE_static_assert = 1 / (int)(!!(c)) }; \
+       } /* use only *after* variable declarations */
+ 
+-/* check and forward error code */
+-#define CHECK_F(f)                  \
+-      {                           \
+-              size_t const e = f; \
+-              if (FSE_isError(e)) \
+-                      return e;   \
+-      }
+-
+ /* **************************************************************
+ *  Templates
+ ****************************************************************/
+diff --git a/lib/zstd/zstd_internal.h b/lib/zstd/zstd_internal.h
+index 1a79fab9e13a..dac753397f86 100644
+--- a/lib/zstd/zstd_internal.h
++++ b/lib/zstd/zstd_internal.h
+@@ -127,7 +127,14 @@ static const U32 OF_defaultNormLog = OF_DEFAULTNORMLOG;
+ *  Shared functions to include for inlining
+ *********************************************/
+ ZSTD_STATIC void ZSTD_copy8(void *dst, const void *src) {
+-      memcpy(dst, src, 8);
++      /*
++       * zstd relies heavily on gcc being able to analyze and inline this
++       * memcpy() call, since it is called in a tight loop. Preboot mode
++       * is compiled in freestanding mode, which stops gcc from analyzing
++       * memcpy(). Use __builtin_memcpy() to tell gcc to analyze this as a
++       * regular memcpy().
++       */
++      __builtin_memcpy(dst, src, 8);
+ }
+ /*! ZSTD_wildcopy() :
+ *   custom version of memcpy(), can copy up to 7 bytes too many (8 bytes if 
length==0) */
+@@ -137,13 +144,16 @@ ZSTD_STATIC void ZSTD_wildcopy(void *dst, const void 
*src, ptrdiff_t length)
+       const BYTE* ip = (const BYTE*)src;
+       BYTE* op = (BYTE*)dst;
+       BYTE* const oend = op + length;
+-      /* Work around https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81388.
++#if defined(GCC_VERSION) && GCC_VERSION >= 70000 && GCC_VERSION < 70200
++      /*
++       * Work around https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81388.
+        * Avoid the bad case where the loop only runs once by handling the
+        * special case separately. This doesn't trigger the bug because it
+        * doesn't involve pointer/integer overflow.
+        */
+       if (length <= 8)
+               return ZSTD_copy8(dst, src);
++#endif
+       do {
+               ZSTD_copy8(op, ip);
+               op += 8;

diff --git a/5001_ZSTD-v5-2-8-prepare-xxhash-for-preboot-env.patch 
b/5001_ZSTD-v5-2-8-prepare-xxhash-for-preboot-env.patch
new file mode 100644
index 0000000..88e4674
--- /dev/null
+++ b/5001_ZSTD-v5-2-8-prepare-xxhash-for-preboot-env.patch
@@ -0,0 +1,94 @@
+diff --git a/lib/xxhash.c b/lib/xxhash.c
+index aa61e2a3802f..b4364e011392 100644
+--- a/lib/xxhash.c
++++ b/lib/xxhash.c
+@@ -80,13 +80,11 @@ void xxh32_copy_state(struct xxh32_state *dst, const 
struct xxh32_state *src)
+ {
+       memcpy(dst, src, sizeof(*dst));
+ }
+-EXPORT_SYMBOL(xxh32_copy_state);
+ 
+ void xxh64_copy_state(struct xxh64_state *dst, const struct xxh64_state *src)
+ {
+       memcpy(dst, src, sizeof(*dst));
+ }
+-EXPORT_SYMBOL(xxh64_copy_state);
+ 
+ /*-***************************
+  * Simple Hash Functions
+@@ -151,7 +149,6 @@ uint32_t xxh32(const void *input, const size_t len, const 
uint32_t seed)
+ 
+       return h32;
+ }
+-EXPORT_SYMBOL(xxh32);
+ 
+ static uint64_t xxh64_round(uint64_t acc, const uint64_t input)
+ {
+@@ -234,7 +231,6 @@ uint64_t xxh64(const void *input, const size_t len, const 
uint64_t seed)
+ 
+       return h64;
+ }
+-EXPORT_SYMBOL(xxh64);
+ 
+ /*-**************************************************
+  * Advanced Hash Functions
+@@ -251,7 +247,6 @@ void xxh32_reset(struct xxh32_state *statePtr, const 
uint32_t seed)
+       state.v4 = seed - PRIME32_1;
+       memcpy(statePtr, &state, sizeof(state));
+ }
+-EXPORT_SYMBOL(xxh32_reset);
+ 
+ void xxh64_reset(struct xxh64_state *statePtr, const uint64_t seed)
+ {
+@@ -265,7 +260,6 @@ void xxh64_reset(struct xxh64_state *statePtr, const 
uint64_t seed)
+       state.v4 = seed - PRIME64_1;
+       memcpy(statePtr, &state, sizeof(state));
+ }
+-EXPORT_SYMBOL(xxh64_reset);
+ 
+ int xxh32_update(struct xxh32_state *state, const void *input, const size_t 
len)
+ {
+@@ -334,7 +328,6 @@ int xxh32_update(struct xxh32_state *state, const void 
*input, const size_t len)
+ 
+       return 0;
+ }
+-EXPORT_SYMBOL(xxh32_update);
+ 
+ uint32_t xxh32_digest(const struct xxh32_state *state)
+ {
+@@ -372,7 +365,6 @@ uint32_t xxh32_digest(const struct xxh32_state *state)
+ 
+       return h32;
+ }
+-EXPORT_SYMBOL(xxh32_digest);
+ 
+ int xxh64_update(struct xxh64_state *state, const void *input, const size_t 
len)
+ {
+@@ -439,7 +431,6 @@ int xxh64_update(struct xxh64_state *state, const void 
*input, const size_t len)
+ 
+       return 0;
+ }
+-EXPORT_SYMBOL(xxh64_update);
+ 
+ uint64_t xxh64_digest(const struct xxh64_state *state)
+ {
+@@ -494,7 +485,19 @@ uint64_t xxh64_digest(const struct xxh64_state *state)
+ 
+       return h64;
+ }
++
++#ifndef XXH_PREBOOT
++EXPORT_SYMBOL(xxh32_copy_state);
++EXPORT_SYMBOL(xxh64_copy_state);
++EXPORT_SYMBOL(xxh32);
++EXPORT_SYMBOL(xxh64);
++EXPORT_SYMBOL(xxh32_reset);
++EXPORT_SYMBOL(xxh64_reset);
++EXPORT_SYMBOL(xxh32_update);
++EXPORT_SYMBOL(xxh32_digest);
++EXPORT_SYMBOL(xxh64_update);
+ EXPORT_SYMBOL(xxh64_digest);
+ 
+ MODULE_LICENSE("Dual BSD/GPL");
+ MODULE_DESCRIPTION("xxHash");
++#endif

diff --git a/5002_ZSTD-v5-3-8-add-zstd-support-to-decompress.patch 
b/5002_ZSTD-v5-3-8-add-zstd-support-to-decompress.patch
new file mode 100644
index 0000000..1c22fa3
--- /dev/null
+++ b/5002_ZSTD-v5-3-8-add-zstd-support-to-decompress.patch
@@ -0,0 +1,422 @@
+diff --git a/include/linux/decompress/unzstd.h 
b/include/linux/decompress/unzstd.h
+new file mode 100644
+index 000000000000..56d539ae880f
+--- /dev/null
++++ b/include/linux/decompress/unzstd.h
+@@ -0,0 +1,11 @@
++/* SPDX-License-Identifier: GPL-2.0 */
++#ifndef LINUX_DECOMPRESS_UNZSTD_H
++#define LINUX_DECOMPRESS_UNZSTD_H
++
++int unzstd(unsigned char *inbuf, long len,
++         long (*fill)(void*, unsigned long),
++         long (*flush)(void*, unsigned long),
++         unsigned char *output,
++         long *pos,
++         void (*error_fn)(char *x));
++#endif
+diff --git a/lib/Kconfig b/lib/Kconfig
+index 5d53f9609c25..e883aecb9279 100644
+--- a/lib/Kconfig
++++ b/lib/Kconfig
+@@ -336,6 +336,10 @@ config DECOMPRESS_LZ4
+       select LZ4_DECOMPRESS
+       tristate
+ 
++config DECOMPRESS_ZSTD
++      select ZSTD_DECOMPRESS
++      tristate
++
+ #
+ # Generic allocator support is selected if needed
+ #
+diff --git a/lib/Makefile b/lib/Makefile
+index ab68a8674360..3ce4ac296611 100644
+--- a/lib/Makefile
++++ b/lib/Makefile
+@@ -166,6 +166,7 @@ lib-$(CONFIG_DECOMPRESS_LZMA) += decompress_unlzma.o
+ lib-$(CONFIG_DECOMPRESS_XZ) += decompress_unxz.o
+ lib-$(CONFIG_DECOMPRESS_LZO) += decompress_unlzo.o
+ lib-$(CONFIG_DECOMPRESS_LZ4) += decompress_unlz4.o
++lib-$(CONFIG_DECOMPRESS_ZSTD) += decompress_unzstd.o
+ 
+ obj-$(CONFIG_TEXTSEARCH) += textsearch.o
+ obj-$(CONFIG_TEXTSEARCH_KMP) += ts_kmp.o
+diff --git a/lib/decompress.c b/lib/decompress.c
+index 857ab1af1ef3..ab3fc90ffc64 100644
+--- a/lib/decompress.c
++++ b/lib/decompress.c
+@@ -13,6 +13,7 @@
+ #include <linux/decompress/inflate.h>
+ #include <linux/decompress/unlzo.h>
+ #include <linux/decompress/unlz4.h>
++#include <linux/decompress/unzstd.h>
+ 
+ #include <linux/types.h>
+ #include <linux/string.h>
+@@ -37,6 +38,9 @@
+ #ifndef CONFIG_DECOMPRESS_LZ4
+ # define unlz4 NULL
+ #endif
++#ifndef CONFIG_DECOMPRESS_ZSTD
++# define unzstd NULL
++#endif
+ 
+ struct compress_format {
+       unsigned char magic[2];
+@@ -52,6 +56,7 @@ static const struct compress_format compressed_formats[] 
__initconst = {
+       { {0xfd, 0x37}, "xz", unxz },
+       { {0x89, 0x4c}, "lzo", unlzo },
+       { {0x02, 0x21}, "lz4", unlz4 },
++      { {0x28, 0xb5}, "zstd", unzstd },
+       { {0, 0}, NULL, NULL }
+ };
+ 
+diff --git a/lib/decompress_unzstd.c b/lib/decompress_unzstd.c
+new file mode 100644
+index 000000000000..f317afab502f
+--- /dev/null
++++ b/lib/decompress_unzstd.c
+@@ -0,0 +1,342 @@
++// SPDX-License-Identifier: GPL-2.0
++
++/*
++ * Important notes about in-place decompression
++ *
++ * At least on x86, the kernel is decompressed in place: the compressed data
++ * is placed to the end of the output buffer, and the decompressor overwrites
++ * most of the compressed data. There must be enough safety margin to
++ * guarantee that the write position is always behind the read position.
++ *
++ * The safety margin for ZSTD with a 128 KB block size is calculated below.
++ * Note that the margin with ZSTD is bigger than with GZIP or XZ!
++ *
++ * The worst case for in-place decompression is that the beginning of
++ * the file is compressed extremely well, and the rest of the file is
++ * uncompressible. Thus, we must look for worst-case expansion when the
++ * compressor is encoding uncompressible data.
++ *
++ * The structure of the .zst file in case of a compresed kernel is as follows.
++ * Maximum sizes (as bytes) of the fields are in parenthesis.
++ *
++ *    Frame Header: (18)
++ *    Blocks: (N)
++ *    Checksum: (4)
++ *
++ * The frame header and checksum overhead is at most 22 bytes.
++ *
++ * ZSTD stores the data in blocks. Each block has a header whose size is
++ * a 3 bytes. After the block header, there is up to 128 KB of payload.
++ * The maximum uncompressed size of the payload is 128 KB. The minimum
++ * uncompressed size of the payload is never less than the payload size
++ * (excluding the block header).
++ *
++ * The assumption, that the uncompressed size of the payload is never
++ * smaller than the payload itself, is valid only when talking about
++ * the payload as a whole. It is possible that the payload has parts where
++ * the decompressor consumes more input than it produces output. Calculating
++ * the worst case for this would be tricky. Instead of trying to do that,
++ * let's simply make sure that the decompressor never overwrites any bytes
++ * of the payload which it is currently reading.
++ *
++ * Now we have enough information to calculate the safety margin. We need
++ *   - 22 bytes for the .zst file format headers;
++ *   - 3 bytes per every 128 KiB of uncompressed size (one block header per
++ *     block); and
++ *   - 128 KiB (biggest possible zstd block size) to make sure that the
++ *     decompressor never overwrites anything from the block it is currently
++ *     reading.
++ *
++ * We get the following formula:
++ *
++ *    safety_margin = 22 + uncompressed_size * 3 / 131072 + 131072
++ *                 <= 22 + (uncompressed_size >> 15) + 131072
++ */
++
++/*
++ * Preboot environments #include "path/to/decompress_unzstd.c".
++ * All of the source files we depend on must be #included.
++ * zstd's only source dependeny is xxhash, which has no source
++ * dependencies.
++ *
++ * zstd and xxhash avoid declaring themselves as modules
++ * when ZSTD_PREBOOT and XXH_PREBOOT are defined.
++ */
++#ifdef STATIC
++# define ZSTD_PREBOOT
++# define XXH_PREBOOT
++# include "xxhash.c"
++# include "zstd/entropy_common.c"
++# include "zstd/fse_decompress.c"
++# include "zstd/huf_decompress.c"
++# include "zstd/zstd_common.c"
++# include "zstd/decompress.c"
++#endif
++
++#include <linux/decompress/mm.h>
++#include <linux/kernel.h>
++#include <linux/zstd.h>
++
++/* 128MB is the maximum window size supported by zstd. */
++#define ZSTD_WINDOWSIZE_MAX   (1 << ZSTD_WINDOWLOG_MAX)
++/* Size of the input and output buffers in multi-call mode.
++ * Pick a larger size because it isn't used during kernel decompression,
++ * since that is single pass, and we have to allocate a large buffer for
++ * zstd's window anyways. The larger size speeds up initramfs decompression.
++ */
++#define ZSTD_IOBUF_SIZE               (1 << 17)
++
++static int INIT handle_zstd_error(size_t ret, void (*error)(char *x))
++{
++      const int err = ZSTD_getErrorCode(ret);
++
++      if (!ZSTD_isError(ret))
++              return 0;
++
++      switch (err) {
++      case ZSTD_error_memory_allocation:
++              error("ZSTD decompressor ran out of memory");
++              break;
++      case ZSTD_error_prefix_unknown:
++              error("Input is not in the ZSTD format (wrong magic bytes)");
++              break;
++      case ZSTD_error_dstSize_tooSmall:
++      case ZSTD_error_corruption_detected:
++      case ZSTD_error_checksum_wrong:
++              error("ZSTD-compressed data is corrupt");
++              break;
++      default:
++              error("ZSTD-compressed data is probably corrupt");
++              break;
++      }
++      return -1;
++}
++
++/*
++ * Handle the case where we have the entire input and output in one segment.
++ * We can allocate less memory (no circular buffer for the sliding window),
++ * and avoid some memcpy() calls.
++ */
++static int INIT decompress_single(const u8 *in_buf, long in_len, u8 *out_buf,
++                                long out_len, long *in_pos,
++                                void (*error)(char *x))
++{
++      const size_t wksp_size = ZSTD_DCtxWorkspaceBound();
++      void *wksp = large_malloc(wksp_size);
++      ZSTD_DCtx *dctx = ZSTD_initDCtx(wksp, wksp_size);
++      int err;
++      size_t ret;
++
++      if (dctx == NULL) {
++              error("Out of memory while allocating ZSTD_DCtx");
++              err = -1;
++              goto out;
++      }
++      /*
++       * Find out how large the frame actually is, there may be junk at
++       * the end of the frame that ZSTD_decompressDCtx() can't handle.
++       */
++      ret = ZSTD_findFrameCompressedSize(in_buf, in_len);
++      err = handle_zstd_error(ret, error);
++      if (err)
++              goto out;
++      in_len = (long)ret;
++
++      ret = ZSTD_decompressDCtx(dctx, out_buf, out_len, in_buf, in_len);
++      err = handle_zstd_error(ret, error);
++      if (err)
++              goto out;
++
++      if (in_pos != NULL)
++              *in_pos = in_len;
++
++      err = 0;
++out:
++      if (wksp != NULL)
++              large_free(wksp);
++      return err;
++}
++
++static int INIT __unzstd(unsigned char *in_buf, long in_len,
++                       long (*fill)(void*, unsigned long),
++                       long (*flush)(void*, unsigned long),
++                       unsigned char *out_buf, long out_len,
++                       long *in_pos,
++                       void (*error)(char *x))
++{
++      ZSTD_inBuffer in;
++      ZSTD_outBuffer out;
++      ZSTD_frameParams params;
++      void *in_allocated = NULL;
++      void *out_allocated = NULL;
++      void *wksp = NULL;
++      size_t wksp_size;
++      ZSTD_DStream *dstream;
++      int err;
++      size_t ret;
++
++      if (out_len == 0)
++              out_len = LONG_MAX; /* no limit */
++
++      if (fill == NULL && flush == NULL)
++              /*
++               * We can decompress faster and with less memory when we have a
++               * single chunk.
++               */
++              return decompress_single(in_buf, in_len, out_buf, out_len,
++                                       in_pos, error);
++
++      /*
++       * If in_buf is not provided, we must be using fill(), so allocate
++       * a large enough buffer. If it is provided, it must be at least
++       * ZSTD_IOBUF_SIZE large.
++       */
++      if (in_buf == NULL) {
++              in_allocated = large_malloc(ZSTD_IOBUF_SIZE);
++              if (in_allocated == NULL) {
++                      error("Out of memory while allocating input buffer");
++                      err = -1;
++                      goto out;
++              }
++              in_buf = in_allocated;
++              in_len = 0;
++      }
++      /* Read the first chunk, since we need to decode the frame header. */
++      if (fill != NULL)
++              in_len = fill(in_buf, ZSTD_IOBUF_SIZE);
++      if (in_len < 0) {
++              error("ZSTD-compressed data is truncated");
++              err = -1;
++              goto out;
++      }
++      /* Set the first non-empty input buffer. */
++      in.src = in_buf;
++      in.pos = 0;
++      in.size = in_len;
++      /* Allocate the output buffer if we are using flush(). */
++      if (flush != NULL) {
++              out_allocated = large_malloc(ZSTD_IOBUF_SIZE);
++              if (out_allocated == NULL) {
++                      error("Out of memory while allocating output buffer");
++                      err = -1;
++                      goto out;
++              }
++              out_buf = out_allocated;
++              out_len = ZSTD_IOBUF_SIZE;
++      }
++      /* Set the output buffer. */
++      out.dst = out_buf;
++      out.pos = 0;
++      out.size = out_len;
++
++      /*
++       * We need to know the window size to allocate the ZSTD_DStream.
++       * Since we are streaming, we need to allocate a buffer for the sliding
++       * window. The window size varies from 1 KB to ZSTD_WINDOWSIZE_MAX
++       * (8 MB), so it is important to use the actual value so as not to
++       * waste memory when it is smaller.
++       */
++      ret = ZSTD_getFrameParams(&params, in.src, in.size);
++      err = handle_zstd_error(ret, error);
++      if (err)
++              goto out;
++      if (ret != 0) {
++              error("ZSTD-compressed data has an incomplete frame header");
++              err = -1;
++              goto out;
++      }
++      if (params.windowSize > ZSTD_WINDOWSIZE_MAX) {
++              error("ZSTD-compressed data has too large a window size");
++              err = -1;
++              goto out;
++      }
++
++      /*
++       * Allocate the ZSTD_DStream now that we know how much memory is
++       * required.
++       */
++      wksp_size = ZSTD_DStreamWorkspaceBound(params.windowSize);
++      wksp = large_malloc(wksp_size);
++      dstream = ZSTD_initDStream(params.windowSize, wksp, wksp_size);
++      if (dstream == NULL) {
++              error("Out of memory while allocating ZSTD_DStream");
++              err = -1;
++              goto out;
++      }
++
++      /*
++       * Decompression loop:
++       * Read more data if necessary (error if no more data can be read).
++       * Call the decompression function, which returns 0 when finished.
++       * Flush any data produced if using flush().
++       */
++      if (in_pos != NULL)
++              *in_pos = 0;
++      do {
++              /*
++               * If we need to reload data, either we have fill() and can
++               * try to get more data, or we don't and the input is truncated.
++               */
++              if (in.pos == in.size) {
++                      if (in_pos != NULL)
++                              *in_pos += in.pos;
++                      in_len = fill ? fill(in_buf, ZSTD_IOBUF_SIZE) : -1;
++                      if (in_len < 0) {
++                              error("ZSTD-compressed data is truncated");
++                              err = -1;
++                              goto out;
++                      }
++                      in.pos = 0;
++                      in.size = in_len;
++              }
++              /* Returns zero when the frame is complete. */
++              ret = ZSTD_decompressStream(dstream, &out, &in);
++              err = handle_zstd_error(ret, error);
++              if (err)
++                      goto out;
++              /* Flush all of the data produced if using flush(). */
++              if (flush != NULL && out.pos > 0) {
++                      if (out.pos != flush(out.dst, out.pos)) {
++                              error("Failed to flush()");
++                              err = -1;
++                              goto out;
++                      }
++                      out.pos = 0;
++              }
++      } while (ret != 0);
++
++      if (in_pos != NULL)
++              *in_pos += in.pos;
++
++      err = 0;
++out:
++      if (in_allocated != NULL)
++              large_free(in_allocated);
++      if (out_allocated != NULL)
++              large_free(out_allocated);
++      if (wksp != NULL)
++              large_free(wksp);
++      return err;
++}
++
++#ifndef ZSTD_PREBOOT
++STATIC int INIT unzstd(unsigned char *buf, long len,
++                     long (*fill)(void*, unsigned long),
++                     long (*flush)(void*, unsigned long),
++                     unsigned char *out_buf,
++                     long *pos,
++                     void (*error)(char *x))
++{
++      return __unzstd(buf, len, fill, flush, out_buf, 0, pos, error);
++}
++#else
++STATIC int INIT __decompress(unsigned char *buf, long len,
++                           long (*fill)(void*, unsigned long),
++                           long (*flush)(void*, unsigned long),
++                           unsigned char *out_buf, long out_len,
++                           long *pos,
++                           void (*error)(char *x))
++{
++      return __unzstd(buf, len, fill, flush, out_buf, out_len, pos, error);
++}
++#endif

diff --git a/5003_ZSTD-v5-4-8-add-support-for-zstd-compres-kern.patch 
b/5003_ZSTD-v5-4-8-add-support-for-zstd-compres-kern.patch
new file mode 100644
index 0000000..d9dc79e
--- /dev/null
+++ b/5003_ZSTD-v5-4-8-add-support-for-zstd-compres-kern.patch
@@ -0,0 +1,65 @@
+diff --git a/init/Kconfig b/init/Kconfig
+index 492bb7000aa4..806874fdd663 100644
+--- a/init/Kconfig
++++ b/init/Kconfig
+@@ -176,13 +176,16 @@ config HAVE_KERNEL_LZO
+ config HAVE_KERNEL_LZ4
+       bool
+ 
++config HAVE_KERNEL_ZSTD
++      bool
++
+ config HAVE_KERNEL_UNCOMPRESSED
+       bool
+ 
+ choice
+       prompt "Kernel compression mode"
+       default KERNEL_GZIP
+-      depends on HAVE_KERNEL_GZIP || HAVE_KERNEL_BZIP2 || HAVE_KERNEL_LZMA || 
HAVE_KERNEL_XZ || HAVE_KERNEL_LZO || HAVE_KERNEL_LZ4 || HAVE_KERNEL_UNCOMPRESSED
++      depends on HAVE_KERNEL_GZIP || HAVE_KERNEL_BZIP2 || HAVE_KERNEL_LZMA || 
HAVE_KERNEL_XZ || HAVE_KERNEL_LZO || HAVE_KERNEL_LZ4 || HAVE_KERNEL_ZSTD || 
HAVE_KERNEL_UNCOMPRESSED
+       help
+         The linux kernel is a kind of self-extracting executable.
+         Several compression algorithms are available, which differ
+@@ -261,6 +264,16 @@ config KERNEL_LZ4
+         is about 8% bigger than LZO. But the decompression speed is
+         faster than LZO.
+ 
++config KERNEL_ZSTD
++      bool "ZSTD"
++      depends on HAVE_KERNEL_ZSTD
++      help
++        ZSTD is a compression algorithm targeting intermediate compression
++        with fast decompression speed. It will compress better than GZIP and
++        decompress around the same speed as LZO, but slower than LZ4. You
++        will need at least 192 KB RAM or more for booting. The zstd command
++        line tools is required for compression.
++
+ config KERNEL_UNCOMPRESSED
+       bool "None"
+       depends on HAVE_KERNEL_UNCOMPRESSED
+diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
+index b12dd5ba4896..efe69b78d455 100644
+--- a/scripts/Makefile.lib
++++ b/scripts/Makefile.lib
+@@ -405,6 +405,21 @@ quiet_cmd_xzkern = XZKERN  $@
+ quiet_cmd_xzmisc = XZMISC  $@
+       cmd_xzmisc = cat $(real-prereqs) | xz --check=crc32 --lzma2=dict=1MiB > 
$@
+ 
++# ZSTD
++# ---------------------------------------------------------------------------
++# Appends the uncompressed size of the data using size_append. The .zst
++# format has the size information available at the beginning of the file too,
++# but it's in a more complex format and it's good to avoid changing the part
++# of the boot code that reads the uncompressed size.
++# Note that the bytes added by size_append will make the zstd tool think that
++# the file is corrupt. This is expected.
++
++quiet_cmd_zstd = ZSTD    $@
++cmd_zstd = (cat $(filter-out FORCE,$^) | \
++      zstd -19 && \
++        $(call size_append, $(filter-out FORCE,$^))) > $@ || \
++      (rm -f $@ ; false)
++
+ # ASM offsets
+ # ---------------------------------------------------------------------------
+ 

diff --git a/5004_ZSTD-v5-5-8-add-support-for-zstd-compressed-initramfs.patch 
b/5004_ZSTD-v5-5-8-add-support-for-zstd-compressed-initramfs.patch
new file mode 100644
index 0000000..0096db1
--- /dev/null
+++ b/5004_ZSTD-v5-5-8-add-support-for-zstd-compressed-initramfs.patch
@@ -0,0 +1,50 @@
+diff --git a/usr/Kconfig b/usr/Kconfig
+index 96afb03b65f9..2599bc21c1b2 100644
+--- a/usr/Kconfig
++++ b/usr/Kconfig
+@@ -100,6 +100,15 @@ config RD_LZ4
+         Support loading of a LZ4 encoded initial ramdisk or cpio buffer
+         If unsure, say N.
+ 
++config RD_ZSTD
++      bool "Support initial ramdisk/ramfs compressed using ZSTD"
++      default y
++      depends on BLK_DEV_INITRD
++      select DECOMPRESS_ZSTD
++      help
++        Support loading of a ZSTD encoded initial ramdisk or cpio buffer.
++        If unsure, say N.
++
+ choice
+       prompt "Built-in initramfs compression mode"
+       depends on INITRAMFS_SOURCE != ""
+@@ -196,6 +205,17 @@ config INITRAMFS_COMPRESSION_LZ4
+         If you choose this, keep in mind that most distros don't provide lz4
+         by default which could cause a build failure.
+ 
++config INITRAMFS_COMPRESSION_ZSTD
++      bool "ZSTD"
++      depends on RD_ZSTD
++      help
++        ZSTD is a compression algorithm targeting intermediate compression
++        with fast decompression speed. It will compress better than GZIP and
++        decompress around the same speed as LZO, but slower than LZ4.
++
++        If you choose this, keep in mind that you may need to install the zstd
++        tool to be able to compress the initram.
++
+ config INITRAMFS_COMPRESSION_NONE
+       bool "None"
+       help
+diff --git a/usr/Makefile b/usr/Makefile
+index c12e6b15ce72..b1a81a40eab1 100644
+--- a/usr/Makefile
++++ b/usr/Makefile
+@@ -15,6 +15,7 @@ compress-$(CONFIG_INITRAMFS_COMPRESSION_LZMA)        := lzma
+ compress-$(CONFIG_INITRAMFS_COMPRESSION_XZ)   := xzmisc
+ compress-$(CONFIG_INITRAMFS_COMPRESSION_LZO)  := lzo
+ compress-$(CONFIG_INITRAMFS_COMPRESSION_LZ4)  := lz4
++compress-$(CONFIG_INITRAMFS_COMPRESSION_ZSTD) := zstd
+ 
+ obj-$(CONFIG_BLK_DEV_INITRD) := initramfs_data.o
+ 

diff --git a/5005_ZSTD-v5-6-8-bump-ZO-z-extra-bytes-margin.patch 
b/5005_ZSTD-v5-6-8-bump-ZO-z-extra-bytes-margin.patch
new file mode 100644
index 0000000..4e86d56
--- /dev/null
+++ b/5005_ZSTD-v5-6-8-bump-ZO-z-extra-bytes-margin.patch
@@ -0,0 +1,20 @@
+diff --git a/arch/x86/boot/header.S b/arch/x86/boot/header.S
+index 735ad7f21ab0..6dbd7e9f74c9 100644
+--- a/arch/x86/boot/header.S
++++ b/arch/x86/boot/header.S
+@@ -539,8 +539,14 @@ pref_address:             .quad LOAD_PHYSICAL_ADDR        
# preferred load addr
+ # the size-dependent part now grows so fast.
+ #
+ # extra_bytes = (uncompressed_size >> 8) + 65536
++#
++# ZSTD compressed data grows by at most 3 bytes per 128K, and only has a 22
++# byte fixed overhead but has a maximum block size of 128K, so it needs a
++# larger margin.
++#
++# extra_bytes = (uncompressed_size >> 8) + 131072
+ 
+-#define ZO_z_extra_bytes      ((ZO_z_output_len >> 8) + 65536)
++#define ZO_z_extra_bytes      ((ZO_z_output_len >> 8) + 131072)
+ #if ZO_z_output_len > ZO_z_input_len
+ # define ZO_z_extract_offset  (ZO_z_output_len + ZO_z_extra_bytes - \
+                                ZO_z_input_len)

diff --git a/5006_ZSTD-v5-7-8-support-for-ZSTD-compressed-kernel.patch 
b/5006_ZSTD-v5-7-8-support-for-ZSTD-compressed-kernel.patch
new file mode 100644
index 0000000..6147136
--- /dev/null
+++ b/5006_ZSTD-v5-7-8-support-for-ZSTD-compressed-kernel.patch
@@ -0,0 +1,92 @@
+diff --git a/Documentation/x86/boot.rst b/Documentation/x86/boot.rst
+index fa7ddc0428c8..0404e99dc1d4 100644
+--- a/Documentation/x86/boot.rst
++++ b/Documentation/x86/boot.rst
+@@ -782,9 +782,9 @@ Protocol:  2.08+
+   uncompressed data should be determined using the standard magic
+   numbers.  The currently supported compression formats are gzip
+   (magic numbers 1F 8B or 1F 9E), bzip2 (magic number 42 5A), LZMA
+-  (magic number 5D 00), XZ (magic number FD 37), and LZ4 (magic number
+-  02 21).  The uncompressed payload is currently always ELF (magic
+-  number 7F 45 4C 46).
++  (magic number 5D 00), XZ (magic number FD 37), LZ4 (magic number
++  02 21) and ZSTD (magic number 28 B5). The uncompressed payload is
++  currently always ELF (magic number 7F 45 4C 46).
+ 
+ ============  ==============
+ Field name:   payload_length
+diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
+index 886fa8368256..912f783bc01a 100644
+--- a/arch/x86/Kconfig
++++ b/arch/x86/Kconfig
+@@ -185,6 +185,7 @@ config X86
+       select HAVE_KERNEL_LZMA
+       select HAVE_KERNEL_LZO
+       select HAVE_KERNEL_XZ
++      select HAVE_KERNEL_ZSTD
+       select HAVE_KPROBES
+       select HAVE_KPROBES_ON_FTRACE
+       select HAVE_FUNCTION_ERROR_INJECTION
+diff --git a/arch/x86/boot/compressed/Makefile 
b/arch/x86/boot/compressed/Makefile
+index 7619742f91c9..471e61400a2e 100644
+--- a/arch/x86/boot/compressed/Makefile
++++ b/arch/x86/boot/compressed/Makefile
+@@ -26,7 +26,7 @@ OBJECT_FILES_NON_STANDARD    := y
+ KCOV_INSTRUMENT               := n
+ 
+ targets := vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 
vmlinux.bin.lzma \
+-      vmlinux.bin.xz vmlinux.bin.lzo vmlinux.bin.lz4
++      vmlinux.bin.xz vmlinux.bin.lzo vmlinux.bin.lz4 vmlinux.bin.zst
+ 
+ KBUILD_CFLAGS := -m$(BITS) -O2
+ KBUILD_CFLAGS += -fno-strict-aliasing $(call cc-option, -fPIE, -fPIC)
+@@ -145,6 +145,8 @@ $(obj)/vmlinux.bin.lzo: $(vmlinux.bin.all-y) FORCE
+       $(call if_changed,lzo)
+ $(obj)/vmlinux.bin.lz4: $(vmlinux.bin.all-y) FORCE
+       $(call if_changed,lz4)
++$(obj)/vmlinux.bin.zst: $(vmlinux.bin.all-y) FORCE
++      $(call if_changed,zstd)
+ 
+ suffix-$(CONFIG_KERNEL_GZIP)  := gz
+ suffix-$(CONFIG_KERNEL_BZIP2) := bz2
+@@ -152,6 +154,7 @@ suffix-$(CONFIG_KERNEL_LZMA)       := lzma
+ suffix-$(CONFIG_KERNEL_XZ)    := xz
+ suffix-$(CONFIG_KERNEL_LZO)   := lzo
+ suffix-$(CONFIG_KERNEL_LZ4)   := lz4
++suffix-$(CONFIG_KERNEL_ZSTD)  := zst
+ 
+ quiet_cmd_mkpiggy = MKPIGGY $@
+       cmd_mkpiggy = $(obj)/mkpiggy $< > $@
+diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c
+index 9652d5c2afda..39e592d0e0b4 100644
+--- a/arch/x86/boot/compressed/misc.c
++++ b/arch/x86/boot/compressed/misc.c
+@@ -77,6 +77,10 @@ static int lines, cols;
+ #ifdef CONFIG_KERNEL_LZ4
+ #include "../../../../lib/decompress_unlz4.c"
+ #endif
++
++#ifdef CONFIG_KERNEL_ZSTD
++#include "../../../../lib/decompress_unzstd.c"
++#endif
+ /*
+  * NOTE: When adding a new decompressor, please update the analysis in
+  * ../header.S.
+diff --git a/arch/x86/include/asm/boot.h b/arch/x86/include/asm/boot.h
+index 680c320363db..d6dd43d25d9f 100644
+--- a/arch/x86/include/asm/boot.h
++++ b/arch/x86/include/asm/boot.h
+@@ -24,9 +24,11 @@
+ # error "Invalid value for CONFIG_PHYSICAL_ALIGN"
+ #endif
+ 
+-#ifdef CONFIG_KERNEL_BZIP2
++#if defined(CONFIG_KERNEL_BZIP2)
+ # define BOOT_HEAP_SIZE               0x400000
+-#else /* !CONFIG_KERNEL_BZIP2 */
++#elif defined(CONFIG_KERNEL_ZSTD)
++# define BOOT_HEAP_SIZE                0x30000
++#else
+ # define BOOT_HEAP_SIZE                0x10000
+ #endif
+ 

diff --git a/5007_ZSTD-v5-8-8-gitignore-add-ZSTD-compressed-files.patch 
b/5007_ZSTD-v5-8-8-gitignore-add-ZSTD-compressed-files.patch
new file mode 100644
index 0000000..adf8578
--- /dev/null
+++ b/5007_ZSTD-v5-8-8-gitignore-add-ZSTD-compressed-files.patch
@@ -0,0 +1,12 @@
+diff --git a/.gitignore b/.gitignore
+index 2258e906f01c..23871de69072 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -44,6 +44,7 @@
+ *.tab.[ch]
+ *.tar
+ *.xz
++*.zst
+ Module.symvers
+ modules.builtin
+ modules.order

diff --git a/5012_enable-cpu-optimizations-for-gcc91.patch 
b/5012_enable-cpu-optimizations-for-gcc91.patch
new file mode 100644
index 0000000..049ec12
--- /dev/null
+++ b/5012_enable-cpu-optimizations-for-gcc91.patch
@@ -0,0 +1,632 @@
+WARNING
+This patch works with gcc versions 9.1+ and with kernel version 5.7+ and should
+NOT be applied when compiling on older versions of gcc due to key name changes
+of the march flags introduced with the version 4.9 release of gcc.[1]
+
+Use the older version of this patch hosted on the same github for older
+versions of gcc.
+
+FEATURES
+This patch adds additional CPU options to the Linux kernel accessible under:
+ Processor type and features  --->
+  Processor family --->
+
+The expanded microarchitectures include:
+* AMD Improved K8-family
+* AMD K10-family
+* AMD Family 10h (Barcelona)
+* AMD Family 14h (Bobcat)
+* AMD Family 16h (Jaguar)
+* AMD Family 15h (Bulldozer)
+* AMD Family 15h (Piledriver)
+* AMD Family 15h (Steamroller)
+* AMD Family 15h (Excavator)
+* AMD Family 17h (Zen)
+* AMD Family 17h (Zen 2)
+* Intel Silvermont low-power processors
+* Intel Goldmont low-power processors (Apollo Lake and Denverton)
+* Intel Goldmont Plus low-power processors (Gemini Lake)
+* Intel 1st Gen Core i3/i5/i7 (Nehalem)
+* Intel 1.5 Gen Core i3/i5/i7 (Westmere)
+* Intel 2nd Gen Core i3/i5/i7 (Sandybridge)
+* Intel 3rd Gen Core i3/i5/i7 (Ivybridge)
+* Intel 4th Gen Core i3/i5/i7 (Haswell)
+* Intel 5th Gen Core i3/i5/i7 (Broadwell)
+* Intel 6th Gen Core i3/i5/i7 (Skylake)
+* Intel 6th Gen Core i7/i9 (Skylake X)
+* Intel 8th Gen Core i3/i5/i7 (Cannon Lake)
+* Intel 10th Gen Core i7/i9 (Ice Lake)
+* Intel Xeon (Cascade Lake)
+
+It also offers to compile passing the 'native' option which, "selects the CPU
+to generate code for at compilation time by determining the processor type of
+the compiling machine. Using -march=native enables all instruction subsets
+supported by the local machine and will produce code optimized for the local
+machine under the constraints of the selected instruction set."[3]
+
+MINOR NOTES
+This patch also changes 'atom' to 'bonnell' in accordance with the gcc v4.9
+changes. Note that upstream is using the deprecated 'match=atom' flags when I
+believe it should use the newer 'march=bonnell' flag for atom processors.[2]
+
+It is not recommended to compile on Atom-CPUs with the 'native' option.[4] The
+recommendation is to use the 'atom' option instead.
+
+BENEFITS
+Small but real speed increases are measurable using a make endpoint comparing
+a generic kernel to one built with one of the respective microarchs.
+
+See the following experimental evidence supporting this statement:
+https://github.com/graysky2/kernel_gcc_patch
+
+REQUIREMENTS
+linux version >=5.7
+gcc version >=9.1
+
+ACKNOWLEDGMENTS
+This patch builds on the seminal work by Jeroen.[5]
+
+REFERENCES
+1. https://gcc.gnu.org/gcc-4.9/changes.html
+2. https://bugzilla.kernel.org/show_bug.cgi?id=77461
+3. https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html
+4. https://github.com/graysky2/kernel_gcc_patch/issues/15
+5. http://www.linuxforge.net/docs/linux/linux-gcc.php
+
+--- a/arch/x86/include/asm/vermagic.h  2019-12-15 18:16:08.000000000 -0500
++++ b/arch/x86/include/asm/vermagic.h  2019-12-17 14:03:55.968871551 -0500
+@@ -27,6 +27,36 @@ struct mod_arch_specific {
+ #define MODULE_PROC_FAMILY "586MMX "
+ #elif defined CONFIG_MCORE2
+ #define MODULE_PROC_FAMILY "CORE2 "
++#elif defined CONFIG_MNATIVE
++#define MODULE_PROC_FAMILY "NATIVE "
++#elif defined CONFIG_MNEHALEM
++#define MODULE_PROC_FAMILY "NEHALEM "
++#elif defined CONFIG_MWESTMERE
++#define MODULE_PROC_FAMILY "WESTMERE "
++#elif defined CONFIG_MSILVERMONT
++#define MODULE_PROC_FAMILY "SILVERMONT "
++#elif defined CONFIG_MGOLDMONT
++#define MODULE_PROC_FAMILY "GOLDMONT "
++#elif defined CONFIG_MGOLDMONTPLUS
++#define MODULE_PROC_FAMILY "GOLDMONTPLUS "
++#elif defined CONFIG_MSANDYBRIDGE
++#define MODULE_PROC_FAMILY "SANDYBRIDGE "
++#elif defined CONFIG_MIVYBRIDGE
++#define MODULE_PROC_FAMILY "IVYBRIDGE "
++#elif defined CONFIG_MHASWELL
++#define MODULE_PROC_FAMILY "HASWELL "
++#elif defined CONFIG_MBROADWELL
++#define MODULE_PROC_FAMILY "BROADWELL "
++#elif defined CONFIG_MSKYLAKE
++#define MODULE_PROC_FAMILY "SKYLAKE "
++#elif defined CONFIG_MSKYLAKEX
++#define MODULE_PROC_FAMILY "SKYLAKEX "
++#elif defined CONFIG_MCANNONLAKE
++#define MODULE_PROC_FAMILY "CANNONLAKE "
++#elif defined CONFIG_MICELAKE
++#define MODULE_PROC_FAMILY "ICELAKE "
++#elif defined CONFIG_MCASCADELAKE
++#define MODULE_PROC_FAMILY "CASCADELAKE "
+ #elif defined CONFIG_MATOM
+ #define MODULE_PROC_FAMILY "ATOM "
+ #elif defined CONFIG_M686
+@@ -45,6 +75,28 @@ struct mod_arch_specific {
+ #define MODULE_PROC_FAMILY "K7 "
+ #elif defined CONFIG_MK8
+ #define MODULE_PROC_FAMILY "K8 "
++#elif defined CONFIG_MK8SSE3
++#define MODULE_PROC_FAMILY "K8SSE3 "
++#elif defined CONFIG_MK10
++#define MODULE_PROC_FAMILY "K10 "
++#elif defined CONFIG_MBARCELONA
++#define MODULE_PROC_FAMILY "BARCELONA "
++#elif defined CONFIG_MBOBCAT
++#define MODULE_PROC_FAMILY "BOBCAT "
++#elif defined CONFIG_MBULLDOZER
++#define MODULE_PROC_FAMILY "BULLDOZER "
++#elif defined CONFIG_MPILEDRIVER
++#define MODULE_PROC_FAMILY "PILEDRIVER "
++#elif defined CONFIG_MSTEAMROLLER
++#define MODULE_PROC_FAMILY "STEAMROLLER "
++#elif defined CONFIG_MJAGUAR
++#define MODULE_PROC_FAMILY "JAGUAR "
++#elif defined CONFIG_MEXCAVATOR
++#define MODULE_PROC_FAMILY "EXCAVATOR "
++#elif defined CONFIG_MZEN
++#define MODULE_PROC_FAMILY "ZEN "
++#elif defined CONFIG_MZEN2
++#define MODULE_PROC_FAMILY "ZEN2 "
+ #elif defined CONFIG_MELAN
+ #define MODULE_PROC_FAMILY "ELAN "
+ #elif defined CONFIG_MCRUSOE
+--- a/arch/x86/Kconfig.cpu     2019-12-15 18:16:08.000000000 -0500
++++ b/arch/x86/Kconfig.cpu     2019-12-17 14:09:03.805642284 -0500
+@@ -123,6 +123,7 @@ config MPENTIUMM
+ config MPENTIUM4
+       bool "Pentium-4/Celeron(P4-based)/Pentium-4 M/older Xeon"
+       depends on X86_32
++      select X86_P6_NOP
+       ---help---
+         Select this for Intel Pentium 4 chips.  This includes the
+         Pentium 4, Pentium D, P4-based Celeron and Xeon, and
+@@ -155,9 +156,8 @@ config MPENTIUM4
+               -Paxville
+               -Dempsey
+ 
+-
+ config MK6
+-      bool "K6/K6-II/K6-III"
++      bool "AMD K6/K6-II/K6-III"
+       depends on X86_32
+       ---help---
+         Select this for an AMD K6-family processor.  Enables use of
+@@ -165,7 +165,7 @@ config MK6
+         flags to GCC.
+ 
+ config MK7
+-      bool "Athlon/Duron/K7"
++      bool "AMD Athlon/Duron/K7"
+       depends on X86_32
+       ---help---
+         Select this for an AMD Athlon K7-family processor.  Enables use of
+@@ -173,12 +173,90 @@ config MK7
+         flags to GCC.
+ 
+ config MK8
+-      bool "Opteron/Athlon64/Hammer/K8"
++      bool "AMD Opteron/Athlon64/Hammer/K8"
+       ---help---
+         Select this for an AMD Opteron or Athlon64 Hammer-family processor.
+         Enables use of some extended instructions, and passes appropriate
+         optimization flags to GCC.
+ 
++config MK8SSE3
++      bool "AMD Opteron/Athlon64/Hammer/K8 with SSE3"
++      ---help---
++        Select this for improved AMD Opteron or Athlon64 Hammer-family 
processors.
++        Enables use of some extended instructions, and passes appropriate
++        optimization flags to GCC.
++
++config MK10
++      bool "AMD 61xx/7x50/PhenomX3/X4/II/K10"
++      ---help---
++        Select this for an AMD 61xx Eight-Core Magny-Cours, Athlon X2 7x50,
++              Phenom X3/X4/II, Athlon II X2/X3/X4, or Turion II-family 
processor.
++        Enables use of some extended instructions, and passes appropriate
++        optimization flags to GCC.
++
++config MBARCELONA
++      bool "AMD Barcelona"
++      ---help---
++        Select this for AMD Family 10h Barcelona processors.
++
++        Enables -march=barcelona
++
++config MBOBCAT
++      bool "AMD Bobcat"
++      ---help---
++        Select this for AMD Family 14h Bobcat processors.
++
++        Enables -march=btver1
++
++config MJAGUAR
++      bool "AMD Jaguar"
++      ---help---
++        Select this for AMD Family 16h Jaguar processors.
++
++        Enables -march=btver2
++
++config MBULLDOZER
++      bool "AMD Bulldozer"
++      ---help---
++        Select this for AMD Family 15h Bulldozer processors.
++
++        Enables -march=bdver1
++
++config MPILEDRIVER
++      bool "AMD Piledriver"
++      ---help---
++        Select this for AMD Family 15h Piledriver processors.
++
++        Enables -march=bdver2
++
++config MSTEAMROLLER
++      bool "AMD Steamroller"
++      ---help---
++        Select this for AMD Family 15h Steamroller processors.
++
++        Enables -march=bdver3
++
++config MEXCAVATOR
++      bool "AMD Excavator"
++      ---help---
++        Select this for AMD Family 15h Excavator processors.
++
++        Enables -march=bdver4
++
++config MZEN
++      bool "AMD Zen"
++      ---help---
++        Select this for AMD Family 17h Zen processors.
++
++        Enables -march=znver1
++
++config MZEN2
++      bool "AMD Zen 2"
++      ---help---
++        Select this for AMD Family 17h Zen 2 processors.
++
++        Enables -march=znver2
++
+ config MCRUSOE
+       bool "Crusoe"
+       depends on X86_32
+@@ -260,6 +338,7 @@ config MVIAC7
+ 
+ config MPSC
+       bool "Intel P4 / older Netburst based Xeon"
++      select X86_P6_NOP
+       depends on X86_64
+       ---help---
+         Optimize for Intel Pentium 4, Pentium D and older Nocona/Dempsey
+@@ -269,8 +348,19 @@ config MPSC
+         using the cpu family field
+         in /proc/cpuinfo. Family 15 is an older Xeon, Family 6 a newer one.
+ 
++config MATOM
++      bool "Intel Atom"
++      select X86_P6_NOP
++      ---help---
++
++        Select this for the Intel Atom platform. Intel Atom CPUs have an
++        in-order pipelining architecture and thus can benefit from
++        accordingly optimized code. Use a recent GCC with specific Atom
++        support in order to fully benefit from selecting this option.
++
+ config MCORE2
+-      bool "Core 2/newer Xeon"
++      bool "Intel Core 2"
++      select X86_P6_NOP
+       ---help---
+ 
+         Select this for Intel Core 2 and newer Core 2 Xeons (Xeon 51xx and
+@@ -278,14 +368,133 @@ config MCORE2
+         family in /proc/cpuinfo. Newer ones have 6 and older ones 15
+         (not a typo)
+ 
+-config MATOM
+-      bool "Intel Atom"
++        Enables -march=core2
++
++config MNEHALEM
++      bool "Intel Nehalem"
++      select X86_P6_NOP
+       ---help---
+ 
+-        Select this for the Intel Atom platform. Intel Atom CPUs have an
+-        in-order pipelining architecture and thus can benefit from
+-        accordingly optimized code. Use a recent GCC with specific Atom
+-        support in order to fully benefit from selecting this option.
++        Select this for 1st Gen Core processors in the Nehalem family.
++
++        Enables -march=nehalem
++
++config MWESTMERE
++      bool "Intel Westmere"
++      select X86_P6_NOP
++      ---help---
++
++        Select this for the Intel Westmere formerly Nehalem-C family.
++
++        Enables -march=westmere
++
++config MSILVERMONT
++      bool "Intel Silvermont"
++      select X86_P6_NOP
++      ---help---
++
++        Select this for the Intel Silvermont platform.
++
++        Enables -march=silvermont
++
++config MGOLDMONT
++      bool "Intel Goldmont"
++      select X86_P6_NOP
++      ---help---
++
++        Select this for the Intel Goldmont platform including Apollo Lake and 
Denverton.
++
++        Enables -march=goldmont
++
++config MGOLDMONTPLUS
++      bool "Intel Goldmont Plus"
++      select X86_P6_NOP
++      ---help---
++
++        Select this for the Intel Goldmont Plus platform including Gemini 
Lake.
++
++        Enables -march=goldmont-plus
++
++config MSANDYBRIDGE
++      bool "Intel Sandy Bridge"
++      select X86_P6_NOP
++      ---help---
++
++        Select this for 2nd Gen Core processors in the Sandy Bridge family.
++
++        Enables -march=sandybridge
++
++config MIVYBRIDGE
++      bool "Intel Ivy Bridge"
++      select X86_P6_NOP
++      ---help---
++
++        Select this for 3rd Gen Core processors in the Ivy Bridge family.
++
++        Enables -march=ivybridge
++
++config MHASWELL
++      bool "Intel Haswell"
++      select X86_P6_NOP
++      ---help---
++
++        Select this for 4th Gen Core processors in the Haswell family.
++
++        Enables -march=haswell
++
++config MBROADWELL
++      bool "Intel Broadwell"
++      select X86_P6_NOP
++      ---help---
++
++        Select this for 5th Gen Core processors in the Broadwell family.
++
++        Enables -march=broadwell
++
++config MSKYLAKE
++      bool "Intel Skylake"
++      select X86_P6_NOP
++      ---help---
++
++        Select this for 6th Gen Core processors in the Skylake family.
++
++        Enables -march=skylake
++
++config MSKYLAKEX
++      bool "Intel Skylake X"
++      select X86_P6_NOP
++      ---help---
++
++        Select this for 6th Gen Core processors in the Skylake X family.
++
++        Enables -march=skylake-avx512
++
++config MCANNONLAKE
++      bool "Intel Cannon Lake"
++      select X86_P6_NOP
++      ---help---
++
++        Select this for 8th Gen Core processors
++
++        Enables -march=cannonlake
++
++config MICELAKE
++      bool "Intel Ice Lake"
++      select X86_P6_NOP
++      ---help---
++
++        Select this for 10th Gen Core processors in the Ice Lake family.
++
++        Enables -march=icelake-client
++
++config MCASCADELAKE
++      bool "Intel Cascade Lake"
++      select X86_P6_NOP
++      ---help---
++
++        Select this for Xeon processors in the Cascade Lake family.
++
++        Enables -march=cascadelake
+ 
+ config GENERIC_CPU
+       bool "Generic-x86-64"
+@@ -294,6 +503,19 @@ config GENERIC_CPU
+         Generic x86-64 CPU.
+         Run equally well on all x86-64 CPUs.
+ 
++config MNATIVE
++ bool "Native optimizations autodetected by GCC"
++ ---help---
++
++   GCC 4.2 and above support -march=native, which automatically detects
++   the optimum settings to use based on your processor. -march=native
++   also detects and applies additional settings beyond -march specific
++   to your CPU, (eg. -msse4). Unless you have a specific reason not to
++   (e.g. distcc cross-compiling), you should probably be using
++   -march=native rather than anything listed below.
++
++   Enables -march=native
++
+ endchoice
+ 
+ config X86_GENERIC
+@@ -318,7 +540,7 @@ config X86_INTERNODE_CACHE_SHIFT
+ config X86_L1_CACHE_SHIFT
+       int
+       default "7" if MPENTIUM4 || MPSC
+-      default "6" if MK7 || MK8 || MPENTIUMM || MCORE2 || MATOM || MVIAC7 || 
X86_GENERIC || GENERIC_CPU
++      default "6" if MK7 || MK8 || MK8SSE3 || MK10 || MBARCELONA || MBOBCAT 
|| MBULLDOZER || MPILEDRIVER || MSTEAMROLLER || MEXCAVATOR || MZEN || MZEN2 || 
MJAGUAR || MPENTIUMM || MCORE2 || MNEHALEM || MWESTMERE || MSILVERMONT || 
MGOLDMONT || MGOLDMONTPLUS || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || 
MBROADWELL || MSKYLAKE || MSKYLAKEX || MCANNONLAKE || MICELAKE || MCASCADELAKE 
|| MNATIVE || MATOM || MVIAC7 || X86_GENERIC || GENERIC_CPU
+       default "4" if MELAN || M486SX || M486 || MGEODEGX1
+       default "5" if MWINCHIP3D || MWINCHIPC6 || MCRUSOE || MEFFICEON || 
MCYRIXIII || MK6 || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || 
M586 || MVIAC3_2 || MGEODE_LX
+ 
+@@ -336,35 +558,36 @@ config X86_ALIGNMENT_16
+ 
+ config X86_INTEL_USERCOPY
+       def_bool y
+-      depends on MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || 
M586MMX || X86_GENERIC || MK8 || MK7 || MEFFICEON || MCORE2
++      depends on MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || 
M586MMX || X86_GENERIC || MK8 || MK8SSE3 || MK7 || MEFFICEON || MCORE2 || MK10 
|| MBARCELONA || MNEHALEM || MWESTMERE || MSILVERMONT || MGOLDMONT || 
MGOLDMONTPLUS || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || 
MSKYLAKE || MSKYLAKEX || MCANNONLAKE || MICELAKE || MCASCADELAKE || MNATIVE
+ 
+ config X86_USE_PPRO_CHECKSUM
+       def_bool y
+-      depends on MWINCHIP3D || MWINCHIPC6 || MCYRIXIII || MK7 || MK6 || 
MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MK8 || MVIAC3_2 
|| MVIAC7 || MEFFICEON || MGEODE_LX || MCORE2 || MATOM
++      depends on MWINCHIP3D || MWINCHIPC6 || MCYRIXIII || MK7 || MK6 || MK10 
|| MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MK8 || 
MK8SSE3 || MVIAC3_2 || MVIAC7 || MEFFICEON || MGEODE_LX || MCORE2 || MNEHALEM 
|| MWESTMERE || MSILVERMONT || MGOLDMONT || MGOLDMONTPLUS || MSANDYBRIDGE || 
MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MSKYLAKEX || MCANNONLAKE || 
MICELAKE || MCASCADELAKE || MATOM || MNATIVE
+ 
+ config X86_USE_3DNOW
+       def_bool y
+       depends on (MCYRIXIII || MK7 || MGEODE_LX) && !UML
+ 
+-#
+-# P6_NOPs are a relatively minor optimization that require a family >=
+-# 6 processor, except that it is broken on certain VIA chips.
+-# Furthermore, AMD chips prefer a totally different sequence of NOPs
+-# (which work on all CPUs).  In addition, it looks like Virtual PC
+-# does not understand them.
+-#
+-# As a result, disallow these if we're not compiling for X86_64 (these
+-# NOPs do work on all x86-64 capable chips); the list of processors in
+-# the right-hand clause are the cores that benefit from this optimization.
+-#
+ config X86_P6_NOP
+-      def_bool y
+-      depends on X86_64
+-      depends on (MCORE2 || MPENTIUM4 || MPSC)
++      default n
++      bool "Support for P6_NOPs on Intel chips"
++      depends on (MCORE2 || MPENTIUM4 || MPSC || MATOM || MNEHALEM || 
MWESTMERE || MSILVERMONT || MGOLDMONT || MGOLDMONTPLUS  || MSANDYBRIDGE || 
MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MSKYLAKEX || MCANNONLAKE || 
MICELAKE || MCASCADELAKE || MNATIVE)
++      ---help---
++      P6_NOPs are a relatively minor optimization that require a family >=
++      6 processor, except that it is broken on certain VIA chips.
++      Furthermore, AMD chips prefer a totally different sequence of NOPs
++      (which work on all CPUs).  In addition, it looks like Virtual PC
++      does not understand them.
++
++      As a result, disallow these if we're not compiling for X86_64 (these
++      NOPs do work on all x86-64 capable chips); the list of processors in
++      the right-hand clause are the cores that benefit from this optimization.
++
++      Say Y if you have Intel CPU newer than Pentium Pro, N otherwise.
+ 
+ config X86_TSC
+       def_bool y
+-      depends on (MWINCHIP3D || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || 
MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX 
|| M586TSC || MK8 || MVIAC3_2 || MVIAC7 || MGEODEGX1 || MGEODE_LX || MCORE2 || 
MATOM) || X86_64
++      depends on (MWINCHIP3D || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || 
MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX 
|| M586TSC || MK8 || MK8SSE3 || MVIAC3_2 || MVIAC7 || MGEODEGX1 || MGEODE_LX || 
MCORE2 || MNEHALEM || MWESTMERE || MSILVERMONT || MGOLDMONT || MGOLDMONTPLUS || 
MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MSKYLAKEX 
|| MCANNONLAKE || MICELAKE || MCASCADELAKE || MNATIVE || MATOM) || X86_64
+ 
+ config X86_CMPXCHG64
+       def_bool y
+@@ -374,7 +597,7 @@ config X86_CMPXCHG64
+ # generates cmov.
+ config X86_CMOV
+       def_bool y
+-      depends on (MK8 || MK7 || MCORE2 || MPENTIUM4 || MPENTIUMM || 
MPENTIUMIII || MPENTIUMII || M686 || MVIAC3_2 || MVIAC7 || MCRUSOE || MEFFICEON 
|| X86_64 || MATOM || MGEODE_LX)
++      depends on (MK8 || MK8SSE3 || MK10 || MBARCELONA || MBOBCAT || 
MBULLDOZER || MPILEDRIVER || MSTEAMROLLER || MEXCAVATOR || MZEN || MZEN2 || 
MJAGUAR || MK7 || MCORE2 || MNEHALEM || MWESTMERE || MSILVERMONT || MGOLDMONT 
|| MGOLDMONTPLUS || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || 
MSKYLAKE || MSKYLAKEX || MCANNONLAKE || MICELAKE || MCASCADELAKE || MPENTIUM4 
|| MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MVIAC3_2 || MVIAC7 || 
MCRUSOE || MEFFICEON || X86_64 || MNATIVE || MATOM || MGEODE_LX)
+ 
+ config X86_MINIMUM_CPU_FAMILY
+       int
+--- a/arch/x86/Makefile        2019-12-15 18:16:08.000000000 -0500
++++ b/arch/x86/Makefile        2019-12-17 14:03:55.972204960 -0500
+@@ -119,13 +119,53 @@ else
+       KBUILD_CFLAGS += $(call cc-option,-mskip-rax-setup)
+ 
+         # FIXME - should be integrated in Makefile.cpu (Makefile_32.cpu)
++        cflags-$(CONFIG_MNATIVE) += $(call cc-option,-march=native)
+         cflags-$(CONFIG_MK8) += $(call cc-option,-march=k8)
++        cflags-$(CONFIG_MK8SSE3) += $(call cc-option,-march=k8-sse3,-mtune=k8)
++        cflags-$(CONFIG_MK10) += $(call cc-option,-march=amdfam10)
++        cflags-$(CONFIG_MBARCELONA) += $(call cc-option,-march=barcelona)
++        cflags-$(CONFIG_MBOBCAT) += $(call cc-option,-march=btver1)
++        cflags-$(CONFIG_MJAGUAR) += $(call cc-option,-march=btver2)
++        cflags-$(CONFIG_MBULLDOZER) += $(call cc-option,-march=bdver1)
++        cflags-$(CONFIG_MPILEDRIVER) += $(call cc-option,-march=bdver2)
++        cflags-$(CONFIG_MSTEAMROLLER) += $(call cc-option,-march=bdver3)
++        cflags-$(CONFIG_MEXCAVATOR) += $(call cc-option,-march=bdver4)
++        cflags-$(CONFIG_MZEN) += $(call cc-option,-march=znver1)
++        cflags-$(CONFIG_MZEN2) += $(call cc-option,-march=znver2)
+         cflags-$(CONFIG_MPSC) += $(call cc-option,-march=nocona)
+ 
+         cflags-$(CONFIG_MCORE2) += \
+-                $(call cc-option,-march=core2,$(call 
cc-option,-mtune=generic))
+-      cflags-$(CONFIG_MATOM) += $(call cc-option,-march=atom) \
+-              $(call cc-option,-mtune=atom,$(call cc-option,-mtune=generic))
++                $(call cc-option,-march=core2,$(call cc-option,-mtune=core2))
++        cflags-$(CONFIG_MNEHALEM) += \
++                $(call cc-option,-march=nehalem,$(call 
cc-option,-mtune=nehalem))
++        cflags-$(CONFIG_MWESTMERE) += \
++                $(call cc-option,-march=westmere,$(call 
cc-option,-mtune=westmere))
++        cflags-$(CONFIG_MSILVERMONT) += \
++                $(call cc-option,-march=silvermont,$(call 
cc-option,-mtune=silvermont))
++        cflags-$(CONFIG_MGOLDMONT) += \
++                $(call cc-option,-march=goldmont,$(call 
cc-option,-mtune=goldmont))
++        cflags-$(CONFIG_MGOLDMONTPLUS) += \
++                $(call cc-option,-march=goldmont-plus,$(call 
cc-option,-mtune=goldmont-plus))
++        cflags-$(CONFIG_MSANDYBRIDGE) += \
++                $(call cc-option,-march=sandybridge,$(call 
cc-option,-mtune=sandybridge))
++        cflags-$(CONFIG_MIVYBRIDGE) += \
++                $(call cc-option,-march=ivybridge,$(call 
cc-option,-mtune=ivybridge))
++        cflags-$(CONFIG_MHASWELL) += \
++                $(call cc-option,-march=haswell,$(call 
cc-option,-mtune=haswell))
++        cflags-$(CONFIG_MBROADWELL) += \
++                $(call cc-option,-march=broadwell,$(call 
cc-option,-mtune=broadwell))
++        cflags-$(CONFIG_MSKYLAKE) += \
++                $(call cc-option,-march=skylake,$(call 
cc-option,-mtune=skylake))
++        cflags-$(CONFIG_MSKYLAKEX) += \
++                $(call cc-option,-march=skylake-avx512,$(call 
cc-option,-mtune=skylake-avx512))
++        cflags-$(CONFIG_MCANNONLAKE) += \
++                $(call cc-option,-march=cannonlake,$(call 
cc-option,-mtune=cannonlake))
++        cflags-$(CONFIG_MICELAKE) += \
++                $(call cc-option,-march=icelake-client,$(call 
cc-option,-mtune=icelake-client))
++        cflags-$(CONFIG_MCASCADELAKE) += \
++                $(call cc-option,-march=cascadelake,$(call 
cc-option,-mtune=cascadelake))
++        cflags-$(CONFIG_MATOM) += $(call cc-option,-march=bonnell) \
++                $(call cc-option,-mtune=bonnell,$(call 
cc-option,-mtune=generic))
+         cflags-$(CONFIG_GENERIC_CPU) += $(call cc-option,-mtune=generic)
+         KBUILD_CFLAGS += $(cflags-y)
+ 
+--- a/arch/x86/Makefile_32.cpu 2019-12-15 18:16:08.000000000 -0500
++++ b/arch/x86/Makefile_32.cpu 2019-12-17 14:03:55.972204960 -0500
+@@ -24,7 +24,19 @@ cflags-$(CONFIG_MK6)                += -march=k6
+ # Please note, that patches that add -march=athlon-xp and friends are 
pointless.
+ # They make zero difference whatsosever to performance at this time.
+ cflags-$(CONFIG_MK7)          += -march=athlon
++cflags-$(CONFIG_MNATIVE) += $(call cc-option,-march=native)
+ cflags-$(CONFIG_MK8)          += $(call cc-option,-march=k8,-march=athlon)
++cflags-$(CONFIG_MK8SSE3)              += $(call 
cc-option,-march=k8-sse3,-march=athlon)
++cflags-$(CONFIG_MK10) += $(call cc-option,-march=amdfam10,-march=athlon)
++cflags-$(CONFIG_MBARCELONA)   += $(call 
cc-option,-march=barcelona,-march=athlon)
++cflags-$(CONFIG_MBOBCAT)      += $(call cc-option,-march=btver1,-march=athlon)
++cflags-$(CONFIG_MJAGUAR)      += $(call cc-option,-march=btver2,-march=athlon)
++cflags-$(CONFIG_MBULLDOZER)   += $(call cc-option,-march=bdver1,-march=athlon)
++cflags-$(CONFIG_MPILEDRIVER)  += $(call cc-option,-march=bdver2,-march=athlon)
++cflags-$(CONFIG_MSTEAMROLLER) += $(call cc-option,-march=bdver3,-march=athlon)
++cflags-$(CONFIG_MEXCAVATOR)   += $(call cc-option,-march=bdver4,-march=athlon)
++cflags-$(CONFIG_MZEN) += $(call cc-option,-march=znver1,-march=athlon)
++cflags-$(CONFIG_MZEN2)        += $(call cc-option,-march=znver2,-march=athlon)
+ cflags-$(CONFIG_MCRUSOE)      += -march=i686 -falign-functions=0 
-falign-jumps=0 -falign-loops=0
+ cflags-$(CONFIG_MEFFICEON)    += -march=i686 $(call tune,pentium3) 
-falign-functions=0 -falign-jumps=0 -falign-loops=0
+ cflags-$(CONFIG_MWINCHIPC6)   += $(call 
cc-option,-march=winchip-c6,-march=i586)
+@@ -33,8 +45,22 @@ cflags-$(CONFIG_MCYRIXIII)  += $(call cc-
+ cflags-$(CONFIG_MVIAC3_2)     += $(call cc-option,-march=c3-2,-march=i686)
+ cflags-$(CONFIG_MVIAC7)               += -march=i686
+ cflags-$(CONFIG_MCORE2)               += -march=i686 $(call tune,core2)
+-cflags-$(CONFIG_MATOM)                += $(call cc-option,-march=atom,$(call 
cc-option,-march=core2,-march=i686)) \
+-      $(call cc-option,-mtune=atom,$(call cc-option,-mtune=generic))
++cflags-$(CONFIG_MNEHALEM)     += -march=i686 $(call tune,nehalem)
++cflags-$(CONFIG_MWESTMERE)    += -march=i686 $(call tune,westmere)
++cflags-$(CONFIG_MSILVERMONT)  += -march=i686 $(call tune,silvermont)
++cflags-$(CONFIG_MGOLDMONT)    += -march=i686 $(call tune,goldmont)
++cflags-$(CONFIG_MGOLDMONTPLUS)        += -march=i686 $(call 
tune,goldmont-plus)
++cflags-$(CONFIG_MSANDYBRIDGE) += -march=i686 $(call tune,sandybridge)
++cflags-$(CONFIG_MIVYBRIDGE)   += -march=i686 $(call tune,ivybridge)
++cflags-$(CONFIG_MHASWELL)     += -march=i686 $(call tune,haswell)
++cflags-$(CONFIG_MBROADWELL)   += -march=i686 $(call tune,broadwell)
++cflags-$(CONFIG_MSKYLAKE)     += -march=i686 $(call tune,skylake)
++cflags-$(CONFIG_MSKYLAKEX)    += -march=i686 $(call tune,skylake-avx512)
++cflags-$(CONFIG_MCANNONLAKE)  += -march=i686 $(call tune,cannonlake)
++cflags-$(CONFIG_MICELAKE)     += -march=i686 $(call tune,icelake-client)
++cflags-$(CONFIG_MCASCADELAKE) += -march=i686 $(call tune,cascadelake)
++cflags-$(CONFIG_MATOM)                += $(call 
cc-option,-march=bonnell,$(call cc-option,-march=core2,-march=i686)) \
++      $(call cc-option,-mtune=bonnell,$(call cc-option,-mtune=generic))
+ 
+ # AMD Elan support
+ cflags-$(CONFIG_MELAN)                += -march=i486

Reply via email to