aboutsummarylogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.SRCINFO43
-rwxr-xr-x[-rw-r--r--]0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch (renamed from 0001-add-sysctl-to-disallow-unprivileged-CLONE_NEWUSER-by.patch)70
-rw-r--r--0002-ZEN-Add-CONFIG-for-unprivileged_userns_clone.patch57
-rwxr-xr-x0002-iwlwifi-pcie-restore-support-for-Killer-Qu-C0-NICs.patch42
-rw-r--r--0003-bootsplash.patch746
-rwxr-xr-x0003-iwlwifi-mvm-Do-not-require-PHY_SKU-NVM-section-for-3.patch40
-rw-r--r--0004-bootsplash.patch669
-rwxr-xr-x0004-drm-i915-Wean-off-drm_pci_alloc-drm_pci_free.patch260
-rw-r--r--0005-bootsplash.patch66
-rwxr-xr-x0005-drm-Remove-PageReserved-manipulation-from-drm_pci_al.patch91
-rw-r--r--0006-bootsplash.patch215
-rwxr-xr-x0006-drm-i915-execlists-Always-force-a-context-reload-whe.patch145
-rwxr-xr-x[-rw-r--r--]0007-bootsplash.patch973
-rwxr-xr-x[-rw-r--r--]0008-bootsplash.patch717
-rwxr-xr-x[-rw-r--r--]0009-bootsplash.patch92
-rwxr-xr-x[-rw-r--r--]0010-bootsplash.patch234
-rwxr-xr-x[-rw-r--r--]0011-bootsplash.patch338
-rwxr-xr-x[-rw-r--r--]0012-bootsplash.patch403
-rwxr-xr-x[-rw-r--r--]0013-bootsplash.patch161
-rwxr-xr-x[-rw-r--r--]0014-bootsplash.patch530
-rwxr-xr-x[-rw-r--r--]0015-bootsplash.patch119
-rwxr-xr-x0016-bootsplash.patch321
-rwxr-xr-x0017-bootsplash.patch129
-rwxr-xr-x0018-bootsplash.patch511
-rwxr-xr-x0019-bootsplash.patch102
-rw-r--r--PKGBUILD53
-rw-r--r--config737
27 files changed, 4306 insertions, 3558 deletions
diff --git a/.SRCINFO b/.SRCINFO
index e0a3b45ae089..1610d61131d5 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,6 +1,6 @@
pkgbase = linux-bootsplash
pkgdesc = Linux kernel with kernel bootsplash support
- pkgver = 5.2.11
+ pkgver = 5.5.3
pkgrel = 1
url = https://www.kernel.org/
arch = x86_64
@@ -10,18 +10,17 @@ pkgbase = linux-bootsplash
makedepends = bc
makedepends = libelf
options = !strip
- source = https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.2.11.tar.xz
+ source = https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.5.3.tar.xz
source = config
source = 60-linux.hook
source = 90-linux.hook
source = linux.preset
- source = enable_additional_cpu_optimizations-20190714.tar.gz::https://github.com/graysky2/kernel_gcc_patch/archive/20190714.tar.gz
- source = 0001-add-sysctl-to-disallow-unprivileged-CLONE_NEWUSER-by.patch
- source = 0002-ZEN-Add-CONFIG-for-unprivileged_userns_clone.patch
- source = 0003-bootsplash.patch
- source = 0004-bootsplash.patch
- source = 0005-bootsplash.patch
- source = 0006-bootsplash.patch
+ source = 0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch
+ source = 0002-iwlwifi-pcie-restore-support-for-Killer-Qu-C0-NICs.patch
+ source = 0003-iwlwifi-mvm-Do-not-require-PHY_SKU-NVM-section-for-3.patch
+ source = 0004-drm-i915-Wean-off-drm_pci_alloc-drm_pci_free.patch
+ source = 0005-drm-Remove-PageReserved-manipulation-from-drm_pci_al.patch
+ source = 0006-drm-i915-execlists-Always-force-a-context-reload-whe.patch
source = 0007-bootsplash.patch
source = 0008-bootsplash.patch
source = 0009-bootsplash.patch
@@ -31,18 +30,24 @@ pkgbase = linux-bootsplash
source = 0013-bootsplash.patch
source = 0014-bootsplash.patch
source = 0015-bootsplash.patch
+ source = 0016-bootsplash.patch
+ source = 0017-bootsplash.patch
+ source = 0018-bootsplash.patch
+ source = 0019-bootsplash.patch
source = ajax-loader.gif
validpgpkeys = ABAF11C65A2970B130ABE3C479BE3E4300411886
validpgpkeys = 647F28654894E3BD457199BE38DBBDC86092693E
- sha256sums = 0c2a831f993dc8a8a8e1ca4186b467de72ff173c6f5855e2aab70f6f7fb033f9
- sha256sums = SKIP
- sha256sums = 1c4d5500a3b4995035c2e940fc0ad2a2dae7be047c8eb20c097444e348258f87
+ sha256sums = 2bef3edcf44c746383045f4a809b2013e18c52319c827875ed8e89138951cab2
+ sha256sums = 99f9170890845cd168271b4e6d75390dea1106b6aa06c032e3435074de05b95c
sha256sums = ae2e95db94ef7176207c690224169594d49445e04249d2499e9d2fbc117a0b21
sha256sums = c043f3033bb781e2688794a59f6d1f7ed49ef9b13eb77ff9a425df33a244a636
sha256sums = ad6344badc91ad0630caacde83f7f9b97276f80d26a20619a87952be65492c65
- sha256sums = f1abc13a8d859fbf6350040e45d7f04ad551a6d39f113ba96fbbd820118c0e36
- sha256sums = 91fafa76bf9cb32159ac7f22191b3589278b91e65bc4505cf2fc6013b8037bf3
- sha256sums = ef926edbd866d95464eb86f7565de572eb97ecfa0369d3b2e078016a0e71a871
+ sha256sums = c981eacffe1091fbd4b22fd6359163bea343591c44c7c53573391541eb943d17
+ sha256sums = a25a82ce5a7e84d7a580036a250aa4d2621ab0fdac0f375b40417a207f87cf87
+ sha256sums = d5b209bcd90d11fd83055ffe8aea617776101502908c4aefdc7f6f3bc3a87929
+ sha256sums = 03bcdd2668403cf7875bab86313cb4719dc35e202f4bb21c61c3646215a15be3
+ sha256sums = 49a63d402a35dcefe18e858b0c66d0983a075c003fcfb50426fd0ba79639fafe
+ sha256sums = 8e1e9cf077e774ac579bbaa7cb5932a1f96f50fad7a72fa998b868137c2472d3
sha256sums = a504f6cf84094e08eaa3cc5b28440261797bf4f06f04993ee46a20628ff2b53c
sha256sums = e096b127a5208f56d368d2cb938933454d7200d70c86b763aa22c38e0ddb8717
sha256sums = 8c1c880f2caa9c7ae43281a35410203887ea8eae750fe8d360d0c8bf80fcc6e0
@@ -55,7 +60,7 @@ pkgbase = linux-bootsplash
sha256sums = e9f22cbb542591087d2d66dc6dc912b1434330ba3cd13d2df741d869a2c31e89
sha256sums = 27471eee564ca3149dd271b0817719b5565a9594dc4d884fe3dc51a5f03832bc
sha256sums = 60e295601e4fb33d9bf65f198c54c7eb07c0d1e91e2ad1e0dd6cd6e142cb266d
- sha256sums = 035ea4b2a7621054f4560471f45336b981538a40172d8f17285910d4e0e0b3ef
+ sha256sums = 92a06fecdc3b5d7ea47d0b922cbedd2c227084f7aaf9d70858a3250eb73f740c
sha256sums = aebc793d0064383ee6b1625bf3bb32532ec30a5c12bf9117066107d412119123
pkgname = linux-bootsplash
@@ -67,12 +72,12 @@ pkgname = linux-bootsplash
depends = mkinitcpio
optdepends = crda: to set the correct wireless channels of your country
optdepends = bootsplash-systemd: to enable bootsplash
- provides = linux=5.2.11
+ provides = linux=5.5.3
backup = etc/mkinitcpio.d/linux-bootsplash.preset
pkgname = linux-bootsplash-headers
pkgdesc = Header files and scripts for building modules for Linux-bootsplash kernel
depends = linux
- provides = linux-headers=5.2.11
- provides = linux-headers=5.2.11
+ provides = linux-headers=5.5.3
+ provides = linux-headers=5.5.3
diff --git a/0001-add-sysctl-to-disallow-unprivileged-CLONE_NEWUSER-by.patch b/0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch
index e7432e3242f2..4f44a57c52b4 100644..100755
--- a/0001-add-sysctl-to-disallow-unprivileged-CLONE_NEWUSER-by.patch
+++ b/0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch
@@ -1,23 +1,49 @@
-From e71668257d1353a7bd428ec90f0871b038db813b Mon Sep 17 00:00:00 2001
-From: Serge Hallyn <serge.hallyn@canonical.com>
-Date: Fri, 31 May 2013 19:12:12 +0100
-Subject: [PATCH 1/3] add sysctl to disallow unprivileged CLONE_NEWUSER by
- default
+From 0bbf7dded241dc90f2f63ed89ea8884f3c2dd37f Mon Sep 17 00:00:00 2001
+From: "Jan Alexander Steffens (heftig)" <jan.steffens@gmail.com>
+Date: Mon, 16 Sep 2019 04:53:20 +0200
+Subject: [PATCH 1/7] ZEN: Add sysctl and CONFIG to disallow unprivileged
+ CLONE_NEWUSER
-Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
-[bwh: Remove unneeded binary sysctl bits]
-Signed-off-by: Daniel Micay <danielmicay@gmail.com>
+Our default behavior continues to match the vanilla kernel.
---
+ init/Kconfig | 16 ++++++++++++++++
kernel/fork.c | 15 +++++++++++++++
kernel/sysctl.c | 12 ++++++++++++
- kernel/user_namespace.c | 3 +++
- 3 files changed, 30 insertions(+)
+ kernel/user_namespace.c | 7 +++++++
+ 4 files changed, 50 insertions(+)
+diff --git a/init/Kconfig b/init/Kconfig
+index 47d40f399000..6647db098428 100644
+--- a/init/Kconfig
++++ b/init/Kconfig
+@@ -1103,6 +1103,22 @@ config USER_NS
+
+ If unsure, say N.
+
++config USER_NS_UNPRIVILEGED
++ bool "Allow unprivileged users to create namespaces"
++ default y
++ depends on USER_NS
++ help
++ When disabled, unprivileged users will not be able to create
++ new namespaces. Allowing users to create their own namespaces
++ has been part of several recent local privilege escalation
++ exploits, so if you need user namespaces but are
++ paranoid^Wsecurity-conscious you want to disable this.
++
++ This setting can be overridden at runtime via the
++ kernel.unprivileged_userns_clone sysctl.
++
++ If unsure, say Y.
++
+ config PID_NS
+ bool "PID Namespaces"
+ default y
diff --git a/kernel/fork.c b/kernel/fork.c
-index b69248e6f0e0..3b1cd11dc6dc 100644
+index 080809560072..1cb7b827b57b 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
-@@ -104,6 +104,11 @@
+@@ -106,6 +106,11 @@
#define CREATE_TRACE_POINTS
#include <trace/events/task.h>
@@ -29,7 +55,7 @@ index b69248e6f0e0..3b1cd11dc6dc 100644
/*
* Minimum number of threads to boot the kernel
-@@ -1695,6 +1700,10 @@ static __latent_entropy struct task_struct *copy_process(
+@@ -1843,6 +1848,10 @@ static __latent_entropy struct task_struct *copy_process(
if ((clone_flags & (CLONE_NEWUSER|CLONE_FS)) == (CLONE_NEWUSER|CLONE_FS))
return ERR_PTR(-EINVAL);
@@ -40,7 +66,7 @@ index b69248e6f0e0..3b1cd11dc6dc 100644
/*
* Thread groups must share signals as well, and detached threads
* can only be started up within the thread group.
-@@ -2528,6 +2537,12 @@ int ksys_unshare(unsigned long unshare_flags)
+@@ -2923,6 +2932,12 @@ int ksys_unshare(unsigned long unshare_flags)
if (unshare_flags & CLONE_NEWNS)
unshare_flags |= CLONE_FS;
@@ -54,10 +80,10 @@ index b69248e6f0e0..3b1cd11dc6dc 100644
if (err)
goto bad_unshare_out;
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
-index ba4d9e85feb8..e88b93a850df 100644
+index 70665934d53e..9797869ed829 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
-@@ -106,6 +106,9 @@ extern int core_uses_pid;
+@@ -110,6 +110,9 @@ extern int core_uses_pid;
extern char core_pattern[];
extern unsigned int core_pipe_limit;
#endif
@@ -67,7 +93,7 @@ index ba4d9e85feb8..e88b93a850df 100644
extern int pid_max;
extern int pid_max_min, pid_max_max;
extern int percpu_pagelist_fraction;
-@@ -515,6 +518,15 @@ static struct ctl_table kern_table[] = {
+@@ -546,6 +549,15 @@ static struct ctl_table kern_table[] = {
.proc_handler = proc_dointvec,
},
#endif
@@ -84,19 +110,23 @@ index ba4d9e85feb8..e88b93a850df 100644
{
.procname = "tainted",
diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c
-index 923414a246e9..6b9dbc257e34 100644
+index 8eadadc478f9..c36ecd19562c 100644
--- a/kernel/user_namespace.c
+++ b/kernel/user_namespace.c
-@@ -26,6 +26,9 @@
+@@ -21,6 +21,13 @@
#include <linux/bsearch.h>
#include <linux/sort.h>
+/* sysctl */
++#ifdef CONFIG_USER_NS_UNPRIVILEGED
++int unprivileged_userns_clone = 1;
++#else
+int unprivileged_userns_clone;
++#endif
+
static struct kmem_cache *user_ns_cachep __read_mostly;
static DEFINE_MUTEX(userns_state_mutex);
--
-2.21.0
+2.25.0
diff --git a/0002-ZEN-Add-CONFIG-for-unprivileged_userns_clone.patch b/0002-ZEN-Add-CONFIG-for-unprivileged_userns_clone.patch
deleted file mode 100644
index dfa89cceaeac..000000000000
--- a/0002-ZEN-Add-CONFIG-for-unprivileged_userns_clone.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-From b30ec6648774140adcbfc9b0e813ecfd0785f79d Mon Sep 17 00:00:00 2001
-From: "Jan Alexander Steffens (heftig)" <jan.steffens@gmail.com>
-Date: Thu, 7 Dec 2017 13:50:48 +0100
-Subject: [PATCH 2/3] ZEN: Add CONFIG for unprivileged_userns_clone
-
-This way our default behavior continues to match the vanilla kernel.
----
- init/Kconfig | 16 ++++++++++++++++
- kernel/user_namespace.c | 4 ++++
- 2 files changed, 20 insertions(+)
-
-diff --git a/init/Kconfig b/init/Kconfig
-index 4592bf7997c0..f3df02990aff 100644
---- a/init/Kconfig
-+++ b/init/Kconfig
-@@ -1004,6 +1004,22 @@ config USER_NS
-
- If unsure, say N.
-
-+config USER_NS_UNPRIVILEGED
-+ bool "Allow unprivileged users to create namespaces"
-+ default y
-+ depends on USER_NS
-+ help
-+ When disabled, unprivileged users will not be able to create
-+ new namespaces. Allowing users to create their own namespaces
-+ has been part of several recent local privilege escalation
-+ exploits, so if you need user namespaces but are
-+ paranoid^Wsecurity-conscious you want to disable this.
-+
-+ This setting can be overridden at runtime via the
-+ kernel.unprivileged_userns_clone sysctl.
-+
-+ If unsure, say Y.
-+
- config PID_NS
- bool "PID Namespaces"
- default y
-diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c
-index 6b9dbc257e34..107b17f0d528 100644
---- a/kernel/user_namespace.c
-+++ b/kernel/user_namespace.c
-@@ -27,7 +27,11 @@
- #include <linux/sort.h>
-
- /* sysctl */
-+#ifdef CONFIG_USER_NS_UNPRIVILEGED
-+int unprivileged_userns_clone = 1;
-+#else
- int unprivileged_userns_clone;
-+#endif
-
- static struct kmem_cache *user_ns_cachep __read_mostly;
- static DEFINE_MUTEX(userns_state_mutex);
---
-2.22.0
-
diff --git a/0002-iwlwifi-pcie-restore-support-for-Killer-Qu-C0-NICs.patch b/0002-iwlwifi-pcie-restore-support-for-Killer-Qu-C0-NICs.patch
new file mode 100755
index 000000000000..bd4b2bece81f
--- /dev/null
+++ b/0002-iwlwifi-pcie-restore-support-for-Killer-Qu-C0-NICs.patch
@@ -0,0 +1,42 @@
+From 62285c8ffeb4318bad4686ab794f43a82164514b Mon Sep 17 00:00:00 2001
+From: "Jan Alexander Steffens (heftig)" <jan.steffens@gmail.com>
+Date: Tue, 24 Dec 2019 06:16:39 +0100
+Subject: [PATCH 2/7] iwlwifi: pcie: restore support for Killer Qu C0 NICs
+
+Commit 809805a820c6 ("iwlwifi: pcie: move some cfg mangling from
+trans_pcie_alloc to probe") refactored the cfg mangling. Unfortunately,
+in this process the lines which picked the right cfg for Killer Qu C0
+NICs after C0 detection were lost. These lines were added by commit
+b9500577d361 ("iwlwifi: pcie: handle switching killer Qu B0 NICs to
+C0").
+
+I suspect this is more of the "merge damage" which commit 7cded5658329
+("iwlwifi: pcie: fix merge damage on making QnJ exclusive") talks about.
+
+Restore the missing lines so the driver loads the right firmware for
+these NICs.
+
+Fixes: 809805a820c6 ("iwlwifi: pcie: move some cfg mangling from trans_pcie_alloc to probe")
+Signed-off-by: Jan Alexander Steffens (heftig) <jan.steffens@gmail.com>
+---
+ drivers/net/wireless/intel/iwlwifi/pcie/drv.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
+index b0b7eca1754e..de62a6dc4e73 100644
+--- a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
++++ b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
+@@ -1107,6 +1107,10 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+ cfg = &iwl9560_2ac_cfg_qu_c0_jf_b0;
+ else if (cfg == &iwl9560_2ac_160_cfg_qu_b0_jf_b0)
+ cfg = &iwl9560_2ac_160_cfg_qu_c0_jf_b0;
++ else if (cfg == &killer1650s_2ax_cfg_qu_b0_hr_b0)
++ cfg = &killer1650s_2ax_cfg_qu_c0_hr_b0;
++ else if (cfg == &killer1650i_2ax_cfg_qu_b0_hr_b0)
++ cfg = &killer1650i_2ax_cfg_qu_c0_hr_b0;
+ }
+
+ /* same thing for QuZ... */
+--
+2.25.0
+
diff --git a/0003-bootsplash.patch b/0003-bootsplash.patch
deleted file mode 100644
index 924f23f33ce9..000000000000
--- a/0003-bootsplash.patch
+++ /dev/null
@@ -1,746 +0,0 @@
-diff --git a/MAINTAINERS b/MAINTAINERS
-index a74227ad082e..b5633b56391e 100644
---- a/MAINTAINERS
-+++ b/MAINTAINERS
-@@ -2705,6 +2705,14 @@ S: Supported
- F: drivers/net/bonding/
- F: include/uapi/linux/if_bonding.h
-
-+BOOTSPLASH
-+M: Max Staudt <mstaudt@suse.de>
-+L: linux-fbdev@vger.kernel.org
-+S: Maintained
-+F: drivers/video/fbdev/core/bootsplash*.*
-+F: drivers/video/fbdev/core/dummycon.c
-+F: include/linux/bootsplash.h
-+
- BPF (Safe dynamic programs and tools)
- M: Alexei Starovoitov <ast@kernel.org>
- M: Daniel Borkmann <daniel@iogearbox.net>
-diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig
-index 7f1f1fbcef9e..f3ff976266fe 100644
---- a/drivers/video/console/Kconfig
-+++ b/drivers/video/console/Kconfig
-@@ -151,6 +151,30 @@ config FRAMEBUFFER_CONSOLE_ROTATION
- such that other users of the framebuffer will remain normally
- oriented.
-
-+config BOOTSPLASH
-+ bool "Bootup splash screen"
-+ depends on FRAMEBUFFER_CONSOLE
-+ ---help---
-+ This option enables the Linux bootsplash screen.
-+
-+ The bootsplash is a full-screen logo or animation indicating a
-+ booting system. It replaces the classic scrolling text with a
-+ graphical alternative, similar to other systems.
-+
-+ Since this is technically implemented as a hook on top of fbcon,
-+ it can only work if the FRAMEBUFFER_CONSOLE is enabled and a
-+ framebuffer driver is active. Thus, to get a text-free boot,
-+ the system needs to boot with vesafb, efifb, or similar.
-+
-+ Once built into the kernel, the bootsplash needs to be enabled
-+ with bootsplash.enabled=1 and a splash file needs to be supplied.
-+
-+ Further documentation can be found in:
-+ Documentation/fb/bootsplash.txt
-+
-+ If unsure, say N.
-+ This is typically used by distributors and system integrators.
-+
- config STI_CONSOLE
- bool "STI text console"
- depends on PARISC
-diff --git a/drivers/video/fbdev/core/Makefile b/drivers/video/fbdev/core/Makefile
-index 73493bbd7a15..66895321928e 100644
---- a/drivers/video/fbdev/core/Makefile
-+++ b/drivers/video/fbdev/core/Makefile
-@@ -29,3 +29,6 @@ obj-$(CONFIG_FB_SYS_IMAGEBLIT) += sysimgblt.o
- obj-$(CONFIG_FB_SYS_FOPS) += fb_sys_fops.o
- obj-$(CONFIG_FB_SVGALIB) += svgalib.o
- obj-$(CONFIG_FB_DDC) += fb_ddc.o
-+
-+obj-$(CONFIG_BOOTSPLASH) += bootsplash.o bootsplash_render.o \
-+ dummyblit.o
-diff --git a/drivers/video/fbdev/core/bootsplash.c b/drivers/video/fbdev/core/bootsplash.c
-new file mode 100644
-index 000000000000..e449755af268
---- /dev/null
-+++ b/drivers/video/fbdev/core/bootsplash.c
-@@ -0,0 +1,294 @@
-+/*
-+ * Kernel based bootsplash.
-+ *
-+ * (Main file: Glue code, workers, timer, PM, kernel and userland API)
-+ *
-+ * Authors:
-+ * Max Staudt <mstaudt@suse.de>
-+ *
-+ * SPDX-License-Identifier: GPL-2.0
-+ */
-+
-+#define pr_fmt(fmt) "bootsplash: " fmt
-+
-+
-+#include <linux/atomic.h>
-+#include <linux/bootsplash.h>
-+#include <linux/console.h>
-+#include <linux/device.h> /* dev_warn() */
-+#include <linux/fb.h>
-+#include <linux/fs.h>
-+#include <linux/kernel.h>
-+#include <linux/jiffies.h>
-+#include <linux/module.h>
-+#include <linux/mutex.h>
-+#include <linux/platform_device.h>
-+#include <linux/printk.h>
-+#include <linux/selection.h> /* console_blanked */
-+#include <linux/stringify.h>
-+#include <linux/types.h>
-+#include <linux/vmalloc.h>
-+#include <linux/vt_kern.h>
-+#include <linux/workqueue.h>
-+
-+#include "bootsplash_internal.h"
-+
-+
-+/*
-+ * We only have one splash screen, so let's keep a single
-+ * instance of the internal state.
-+ */
-+static struct splash_priv splash_state;
-+
-+
-+static void splash_callback_redraw_vc(struct work_struct *ignored)
-+{
-+ if (console_blanked)
-+ return;
-+
-+ console_lock();
-+ if (vc_cons[fg_console].d)
-+ update_screen(vc_cons[fg_console].d);
-+ console_unlock();
-+}
-+
-+
-+static bool is_fb_compatible(const struct fb_info *info)
-+{
-+ if (!(info->flags & FBINFO_BE_MATH)
-+ != !fb_be_math((struct fb_info *)info)) {
-+ dev_warn(info->device,
-+ "Can't draw on foreign endianness framebuffer.\n");
-+
-+ return false;
-+ }
-+
-+ if (info->flags & FBINFO_MISC_TILEBLITTING) {
-+ dev_warn(info->device,
-+ "Can't draw splash on tiling framebuffer.\n");
-+
-+ return false;
-+ }
-+
-+ if (info->fix.type != FB_TYPE_PACKED_PIXELS
-+ || (info->fix.visual != FB_VISUAL_TRUECOLOR
-+ && info->fix.visual != FB_VISUAL_DIRECTCOLOR)) {
-+ dev_warn(info->device,
-+ "Can't draw splash on non-packed or non-truecolor framebuffer.\n");
-+
-+ dev_warn(info->device,
-+ " type: %u visual: %u\n",
-+ info->fix.type, info->fix.visual);
-+
-+ return false;
-+ }
-+
-+ if (info->var.bits_per_pixel != 16
-+ && info->var.bits_per_pixel != 24
-+ && info->var.bits_per_pixel != 32) {
-+ dev_warn(info->device,
-+ "We only support drawing on framebuffers with 16, 24, or 32 bpp, not %d.\n",
-+ info->var.bits_per_pixel);
-+
-+ return false;
-+ }
-+
-+ return true;
-+}
-+
-+
-+/*
-+ * Called by fbcon_switch() when an instance is activated or refreshed.
-+ */
-+void bootsplash_render_full(struct fb_info *info)
-+{
-+ if (!is_fb_compatible(info))
-+ return;
-+
-+ bootsplash_do_render_background(info);
-+}
-+
-+
-+/*
-+ * External status enquiry and on/off switch
-+ */
-+bool bootsplash_would_render_now(void)
-+{
-+ return !oops_in_progress
-+ && !console_blanked
-+ && bootsplash_is_enabled();
-+}
-+
-+bool bootsplash_is_enabled(void)
-+{
-+ bool was_enabled;
-+
-+ /* Make sure we have the newest state */
-+ smp_rmb();
-+
-+ was_enabled = test_bit(0, &splash_state.enabled);
-+
-+ return was_enabled;
-+}
-+
-+void bootsplash_disable(void)
-+{
-+ int was_enabled;
-+
-+ was_enabled = test_and_clear_bit(0, &splash_state.enabled);
-+
-+ if (was_enabled) {
-+ if (oops_in_progress) {
-+ /* Redraw screen now so we can see a panic */
-+ if (vc_cons[fg_console].d)
-+ update_screen(vc_cons[fg_console].d);
-+ } else {
-+ /* No urgency, redraw at next opportunity */
-+ schedule_work(&splash_state.work_redraw_vc);
-+ }
-+ }
-+}
-+
-+void bootsplash_enable(void)
-+{
-+ bool was_enabled;
-+
-+ if (oops_in_progress)
-+ return;
-+
-+ was_enabled = test_and_set_bit(0, &splash_state.enabled);
-+
-+ if (!was_enabled)
-+ schedule_work(&splash_state.work_redraw_vc);
-+}
-+
-+
-+/*
-+ * Userland API via platform device in sysfs
-+ */
-+static ssize_t splash_show_enabled(struct device *dev,
-+ struct device_attribute *attr, char *buf)
-+{
-+ return sprintf(buf, "%d\n", bootsplash_is_enabled());
-+}
-+
-+static ssize_t splash_store_enabled(struct device *device,
-+ struct device_attribute *attr,
-+ const char *buf, size_t count)
-+{
-+ bool enable;
-+ int err;
-+
-+ if (!buf || !count)
-+ return -EFAULT;
-+
-+ err = kstrtobool(buf, &enable);
-+ if (err)
-+ return err;
-+
-+ if (enable)
-+ bootsplash_enable();
-+ else
-+ bootsplash_disable();
-+
-+ return count;
-+}
-+
-+static DEVICE_ATTR(enabled, 0644, splash_show_enabled, splash_store_enabled);
-+
-+
-+static struct attribute *splash_dev_attrs[] = {
-+ &dev_attr_enabled.attr,
-+ NULL
-+};
-+
-+ATTRIBUTE_GROUPS(splash_dev);
-+
-+
-+
-+
-+/*
-+ * Power management fixup via platform device
-+ *
-+ * When the system is woken from sleep or restored after hibernating, we
-+ * cannot expect the screen contents to still be present in video RAM.
-+ * Thus, we have to redraw the splash if we're currently active.
-+ */
-+static int splash_resume(struct device *device)
-+{
-+ if (bootsplash_would_render_now())
-+ schedule_work(&splash_state.work_redraw_vc);
-+
-+ return 0;
-+}
-+
-+static int splash_suspend(struct device *device)
-+{
-+ cancel_work_sync(&splash_state.work_redraw_vc);
-+
-+ return 0;
-+}
-+
-+
-+static const struct dev_pm_ops splash_pm_ops = {
-+ .thaw = splash_resume,
-+ .restore = splash_resume,
-+ .resume = splash_resume,
-+ .suspend = splash_suspend,
-+ .freeze = splash_suspend,
-+};
-+
-+static struct platform_driver splash_driver = {
-+ .driver = {
-+ .name = "bootsplash",
-+ .pm = &splash_pm_ops,
-+ },
-+};
-+
-+
-+/*
-+ * Main init
-+ */
-+void bootsplash_init(void)
-+{
-+ int ret;
-+
-+ /* Initialized already? */
-+ if (splash_state.splash_device)
-+ return;
-+
-+
-+ /* Register platform device to export user API */
-+ ret = platform_driver_register(&splash_driver);
-+ if (ret) {
-+ pr_err("platform_driver_register() failed: %d\n", ret);
-+ goto err;
-+ }
-+
-+ splash_state.splash_device
-+ = platform_device_alloc("bootsplash", 0);
-+
-+ if (!splash_state.splash_device)
-+ goto err_driver;
-+
-+ splash_state.splash_device->dev.groups = splash_dev_groups;
-+
-+ ret = platform_device_add(splash_state.splash_device);
-+ if (ret) {
-+ pr_err("platform_device_add() failed: %d\n", ret);
-+ goto err_device;
-+ }
-+
-+
-+ INIT_WORK(&splash_state.work_redraw_vc, splash_callback_redraw_vc);
-+
-+ return;
-+
-+err_device:
-+ platform_device_put(splash_state.splash_device);
-+ splash_state.splash_device = NULL;
-+err_driver:
-+ platform_driver_unregister(&splash_driver);
-+err:
-+ pr_err("Failed to initialize.\n");
-+}
-diff --git a/drivers/video/fbdev/core/bootsplash_internal.h b/drivers/video/fbdev/core/bootsplash_internal.h
-new file mode 100644
-index 000000000000..b11da5cb90bf
---- /dev/null
-+++ b/drivers/video/fbdev/core/bootsplash_internal.h
-@@ -0,0 +1,55 @@
-+/*
-+ * Kernel based bootsplash.
-+ *
-+ * (Internal data structures used at runtime)
-+ *
-+ * Authors:
-+ * Max Staudt <mstaudt@suse.de>
-+ *
-+ * SPDX-License-Identifier: GPL-2.0
-+ */
-+
-+#ifndef __BOOTSPLASH_INTERNAL_H
-+#define __BOOTSPLASH_INTERNAL_H
-+
-+
-+#include <linux/types.h>
-+#include <linux/fb.h>
-+#include <linux/kernel.h>
-+#include <linux/mutex.h>
-+#include <linux/spinlock.h>
-+
-+
-+/*
-+ * Runtime types
-+ */
-+struct splash_priv {
-+ /*
-+ * Enabled/disabled state, to be used with atomic bit operations.
-+ * Bit 0: 0 = Splash hidden
-+ * 1 = Splash shown
-+ *
-+ * Note: fbcon.c uses this twice, by calling
-+ * bootsplash_would_render_now() in set_blitting_type() and
-+ * in fbcon_switch().
-+ * This is racy, but eventually consistent: Turning the
-+ * splash on/off will cause a redraw, which calls
-+ * fbcon_switch(), which calls set_blitting_type().
-+ * So the last on/off toggle will make things consistent.
-+ */
-+ unsigned long enabled;
-+
-+ /* Our gateway to userland via sysfs */
-+ struct platform_device *splash_device;
-+
-+ struct work_struct work_redraw_vc;
-+};
-+
-+
-+
-+/*
-+ * Rendering functions
-+ */
-+void bootsplash_do_render_background(struct fb_info *info);
-+
-+#endif
-diff --git a/drivers/video/fbdev/core/bootsplash_render.c b/drivers/video/fbdev/core/bootsplash_render.c
-new file mode 100644
-index 000000000000..4d7e0117f653
---- /dev/null
-+++ b/drivers/video/fbdev/core/bootsplash_render.c
-@@ -0,0 +1,93 @@
-+/*
-+ * Kernel based bootsplash.
-+ *
-+ * (Rendering functions)
-+ *
-+ * Authors:
-+ * Max Staudt <mstaudt@suse.de>
-+ *
-+ * SPDX-License-Identifier: GPL-2.0
-+ */
-+
-+#define pr_fmt(fmt) "bootsplash: " fmt
-+
-+
-+#include <linux/bootsplash.h>
-+#include <linux/fb.h>
-+#include <linux/kernel.h>
-+#include <linux/printk.h>
-+#include <linux/types.h>
-+
-+#include "bootsplash_internal.h"
-+
-+
-+
-+
-+/*
-+ * Rendering: Internal drawing routines
-+ */
-+
-+
-+/*
-+ * Pack pixel into target format and do Big/Little Endian handling.
-+ * This would be a good place to handle endianness conversion if necessary.
-+ */
-+static inline u32 pack_pixel(const struct fb_var_screeninfo *dst_var,
-+ u8 red, u8 green, u8 blue)
-+{
-+ u32 dstpix;
-+
-+ /* Quantize pixel */
-+ red = red >> (8 - dst_var->red.length);
-+ green = green >> (8 - dst_var->green.length);
-+ blue = blue >> (8 - dst_var->blue.length);
-+
-+ /* Pack pixel */
-+ dstpix = red << (dst_var->red.offset)
-+ | green << (dst_var->green.offset)
-+ | blue << (dst_var->blue.offset);
-+
-+ /*
-+ * Move packed pixel to the beginning of the memory cell,
-+ * so we can memcpy() it out easily
-+ */
-+#ifdef __BIG_ENDIAN
-+ switch (dst_var->bits_per_pixel) {
-+ case 16:
-+ dstpix <<= 16;
-+ break;
-+ case 24:
-+ dstpix <<= 8;
-+ break;
-+ case 32:
-+ break;
-+ }
-+#else
-+ /* This is intrinsically unnecessary on Little Endian */
-+#endif
-+
-+ return dstpix;
-+}
-+
-+
-+void bootsplash_do_render_background(struct fb_info *info)
-+{
-+ unsigned int x, y;
-+ u32 dstpix;
-+ u32 dst_octpp = info->var.bits_per_pixel / 8;
-+
-+ dstpix = pack_pixel(&info->var,
-+ 0,
-+ 0,
-+ 0);
-+
-+ for (y = 0; y < info->var.yres_virtual; y++) {
-+ u8 *dstline = info->screen_buffer + (y * info->fix.line_length);
-+
-+ for (x = 0; x < info->var.xres_virtual; x++) {
-+ memcpy(dstline, &dstpix, dst_octpp);
-+
-+ dstline += dst_octpp;
-+ }
-+ }
-+}
-diff --git a/drivers/video/fbdev/core/dummyblit.c b/drivers/video/fbdev/core/dummyblit.c
-new file mode 100644
-index 000000000000..8c22ff92ce24
---- /dev/null
-+++ b/drivers/video/fbdev/core/dummyblit.c
-@@ -0,0 +1,89 @@
-+/*
-+ * linux/drivers/video/fbdev/core/dummyblit.c -- Dummy Blitting Operation
-+ *
-+ * Authors:
-+ * Max Staudt <mstaudt@suse.de>
-+ *
-+ * These functions are used in place of blitblit/tileblit to suppress
-+ * fbcon's text output while a splash is shown.
-+ *
-+ * Only suppressing actual rendering keeps the text buffer in the VC layer
-+ * intact and makes it easy to switch back from the bootsplash to a full
-+ * text console with a simple redraw (with the original functions in place).
-+ *
-+ * Based on linux/drivers/video/fbdev/core/bitblit.c
-+ * and linux/drivers/video/fbdev/core/tileblit.c
-+ *
-+ * SPDX-License-Identifier: GPL-2.0
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/fb.h>
-+#include <linux/vt_kern.h>
-+#include <linux/console.h>
-+#include <asm/types.h>
-+#include "fbcon.h"
-+
-+static void dummy_bmove(struct vc_data *vc, struct fb_info *info, int sy,
-+ int sx, int dy, int dx, int height, int width)
-+{
-+ ;
-+}
-+
-+static void dummy_clear(struct vc_data *vc, struct fb_info *info, int sy,
-+ int sx, int height, int width)
-+{
-+ ;
-+}
-+
-+static void dummy_putcs(struct vc_data *vc, struct fb_info *info,
-+ const unsigned short *s, int count, int yy, int xx,
-+ int fg, int bg)
-+{
-+ ;
-+}
-+
-+static void dummy_clear_margins(struct vc_data *vc, struct fb_info *info,
-+ int color, int bottom_only)
-+{
-+ ;
-+}
-+
-+static void dummy_cursor(struct vc_data *vc, struct fb_info *info, int mode,
-+ int softback_lines, int fg, int bg)
-+{
-+ ;
-+}
-+
-+static int dummy_update_start(struct fb_info *info)
-+{
-+ /*
-+ * Copied from bitblit.c and tileblit.c
-+ *
-+ * As of Linux 4.12, nobody seems to care about our return value.
-+ */
-+ struct fbcon_ops *ops = info->fbcon_par;
-+ int err;
-+
-+ err = fb_pan_display(info, &ops->var);
-+ ops->var.xoffset = info->var.xoffset;
-+ ops->var.yoffset = info->var.yoffset;
-+ ops->var.vmode = info->var.vmode;
-+ return err;
-+}
-+
-+void fbcon_set_dummyops(struct fbcon_ops *ops)
-+{
-+ ops->bmove = dummy_bmove;
-+ ops->clear = dummy_clear;
-+ ops->putcs = dummy_putcs;
-+ ops->clear_margins = dummy_clear_margins;
-+ ops->cursor = dummy_cursor;
-+ ops->update_start = dummy_update_start;
-+ ops->rotate_font = NULL;
-+}
-+EXPORT_SYMBOL_GPL(fbcon_set_dummyops);
-+
-+MODULE_AUTHOR("Max Staudt <mstaudt@suse.de>");
-+MODULE_DESCRIPTION("Dummy Blitting Operation");
-+MODULE_LICENSE("GPL");
-diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
-index 04612f938bab..9a39a6fcfe98 100644
---- a/drivers/video/fbdev/core/fbcon.c
-+++ b/drivers/video/fbdev/core/fbcon.c
-@@ -80,6 +80,7 @@
- #include <asm/irq.h>
-
- #include "fbcon.h"
-+#include <linux/bootsplash.h>
-
- #ifdef FBCONDEBUG
- # define DPRINTK(fmt, args...) printk(KERN_DEBUG "%s: " fmt, __func__ , ## args)
-@@ -542,6 +543,8 @@ static int do_fbcon_takeover(int show_logo)
- for (i = first_fb_vc; i <= last_fb_vc; i++)
- con2fb_map[i] = info_idx;
-
-+ bootsplash_init();
-+
- err = do_take_over_console(&fb_con, first_fb_vc, last_fb_vc,
- fbcon_is_default);
-
-@@ -661,6 +664,9 @@ static void set_blitting_type(struct vc_data *vc, struct fb_info *info)
- else {
- fbcon_set_rotation(info);
- fbcon_set_bitops(ops);
-+
-+ if (bootsplash_would_render_now())
-+ fbcon_set_dummyops(ops);
- }
- }
-
-@@ -683,6 +689,19 @@ static void set_blitting_type(struct vc_data *vc, struct fb_info *info)
- ops->p = &fb_display[vc->vc_num];
- fbcon_set_rotation(info);
- fbcon_set_bitops(ops);
-+
-+ /*
-+ * Note:
-+ * This is *eventually correct*.
-+ * Setting the fbcon operations and drawing the splash happen at
-+ * different points in time. If the splash is enabled/disabled
-+ * in between, then bootsplash_{en,dis}able will schedule a
-+ * redraw, which will again render the splash (or not) and set
-+ * the correct fbcon ops.
-+ * The last run will then be the right one.
-+ */
-+ if (bootsplash_would_render_now())
-+ fbcon_set_dummyops(ops);
- }
-
- static int fbcon_invalid_charcount(struct fb_info *info, unsigned charcount)
-@@ -2184,6 +2203,9 @@ static int fbcon_switch(struct vc_data *vc)
- info = registered_fb[con2fb_map[vc->vc_num]];
- ops = info->fbcon_par;
-
-+ if (bootsplash_would_render_now())
-+ bootsplash_render_full(info);
-+
- if (softback_top) {
- if (softback_lines)
- fbcon_set_origin(vc);
-diff --git a/drivers/video/fbdev/core/fbcon.h b/drivers/video/fbdev/core/fbcon.h
-index 18f3ac144237..45f94347fe5e 100644
---- a/drivers/video/fbdev/core/fbcon.h
-+++ b/drivers/video/fbdev/core/fbcon.h
-@@ -214,6 +214,11 @@ static inline int attr_col_ec(int shift, struct vc_data *vc,
- #define SCROLL_REDRAW 0x004
- #define SCROLL_PAN_REDRAW 0x005
-
-+#ifdef CONFIG_BOOTSPLASH
-+extern void fbcon_set_dummyops(struct fbcon_ops *ops);
-+#else /* CONFIG_BOOTSPLASH */
-+#define fbcon_set_dummyops(x)
-+#endif /* CONFIG_BOOTSPLASH */
- #ifdef CONFIG_FB_TILEBLITTING
- extern void fbcon_set_tileops(struct vc_data *vc, struct fb_info *info);
- #endif
-diff --git a/include/linux/bootsplash.h b/include/linux/bootsplash.h
-new file mode 100644
-index 000000000000..c6dd0b43180d
---- /dev/null
-+++ b/include/linux/bootsplash.h
-@@ -0,0 +1,43 @@
-+/*
-+ * Kernel based bootsplash.
-+ *
-+ * Authors:
-+ * Max Staudt <mstaudt@suse.de>
-+ *
-+ * SPDX-License-Identifier: GPL-2.0
-+ */
-+
-+#ifndef __LINUX_BOOTSPLASH_H
-+#define __LINUX_BOOTSPLASH_H
-+
-+#include <linux/fb.h>
-+
-+
-+#ifdef CONFIG_BOOTSPLASH
-+
-+extern void bootsplash_render_full(struct fb_info *info);
-+
-+extern bool bootsplash_would_render_now(void);
-+
-+extern bool bootsplash_is_enabled(void);
-+extern void bootsplash_disable(void);
-+extern void bootsplash_enable(void);
-+
-+extern void bootsplash_init(void);
-+
-+#else /* CONFIG_BOOTSPLASH */
-+
-+#define bootsplash_render_full(x)
-+
-+#define bootsplash_would_render_now() (false)
-+
-+#define bootsplash_is_enabled() (false)
-+#define bootsplash_disable()
-+#define bootsplash_enable()
-+
-+#define bootsplash_init()
-+
-+#endif /* CONFIG_BOOTSPLASH */
-+
-+
-+#endif
diff --git a/0003-iwlwifi-mvm-Do-not-require-PHY_SKU-NVM-section-for-3.patch b/0003-iwlwifi-mvm-Do-not-require-PHY_SKU-NVM-section-for-3.patch
new file mode 100755
index 000000000000..bd1492b3484a
--- /dev/null
+++ b/0003-iwlwifi-mvm-Do-not-require-PHY_SKU-NVM-section-for-3.patch
@@ -0,0 +1,40 @@
+From 0e6fb279c7fc6fc818942f668f731946286c959c Mon Sep 17 00:00:00 2001
+From: Dan Moulding <dmoulding@me.com>
+Date: Tue, 28 Jan 2020 02:31:07 -0700
+Subject: [PATCH 3/7] iwlwifi: mvm: Do not require PHY_SKU NVM section for 3168
+ devices
+
+The logic for checking required NVM sections was recently fixed in
+commit b3f20e098293 ("iwlwifi: mvm: fix NVM check for 3168
+devices"). However, with that fixed the else is now taken for 3168
+devices and within the else clause there is a mandatory check for the
+PHY_SKU section. This causes the parsing to fail for 3168 devices.
+
+The PHY_SKU section is really only mandatory for the IWL_NVM_EXT
+layout (the phy_sku parameter of iwl_parse_nvm_data is only used when
+the NVM type is IWL_NVM_EXT). So this changes the PHY_SKU section
+check so that it's only mandatory for IWL_NVM_EXT.
+
+Fixes: b3f20e098293 ("iwlwifi: mvm: fix NVM check for 3168 devices")
+Signed-off-by: Dan Moulding <dmoulding@me.com>
+---
+ drivers/net/wireless/intel/iwlwifi/mvm/nvm.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c b/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c
+index 46128a2a9c6e..e98ce380c7b9 100644
+--- a/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c
++++ b/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c
+@@ -308,7 +308,8 @@ iwl_parse_nvm_sections(struct iwl_mvm *mvm)
+ }
+
+ /* PHY_SKU section is mandatory in B0 */
+- if (!mvm->nvm_sections[NVM_SECTION_TYPE_PHY_SKU].data) {
++ if (mvm->trans->cfg->nvm_type == IWL_NVM_EXT &&
++ !mvm->nvm_sections[NVM_SECTION_TYPE_PHY_SKU].data) {
+ IWL_ERR(mvm,
+ "Can't parse phy_sku in B0, empty sections\n");
+ return NULL;
+--
+2.25.0
+
diff --git a/0004-bootsplash.patch b/0004-bootsplash.patch
deleted file mode 100644
index 92d62caa7031..000000000000
--- a/0004-bootsplash.patch
+++ /dev/null
@@ -1,669 +0,0 @@
-diff --git a/MAINTAINERS b/MAINTAINERS
-index b5633b56391e..5c237445761e 100644
---- a/MAINTAINERS
-+++ b/MAINTAINERS
-@@ -2712,6 +2712,7 @@ S: Maintained
- F: drivers/video/fbdev/core/bootsplash*.*
- F: drivers/video/fbdev/core/dummycon.c
- F: include/linux/bootsplash.h
-+F: include/uapi/linux/bootsplash_file.h
-
- BPF (Safe dynamic programs and tools)
- M: Alexei Starovoitov <ast@kernel.org>
-diff --git a/drivers/video/fbdev/core/Makefile b/drivers/video/fbdev/core/Makefile
-index 66895321928e..6a8d1bab8a01 100644
---- a/drivers/video/fbdev/core/Makefile
-+++ b/drivers/video/fbdev/core/Makefile
-@@ -31,4 +31,4 @@ obj-$(CONFIG_FB_SVGALIB) += svgalib.o
- obj-$(CONFIG_FB_DDC) += fb_ddc.o
-
- obj-$(CONFIG_BOOTSPLASH) += bootsplash.o bootsplash_render.o \
-- dummyblit.o
-+ bootsplash_load.o dummyblit.o
-diff --git a/drivers/video/fbdev/core/bootsplash.c b/drivers/video/fbdev/core/bootsplash.c
-index e449755af268..843c5400fefc 100644
---- a/drivers/video/fbdev/core/bootsplash.c
-+++ b/drivers/video/fbdev/core/bootsplash.c
-@@ -32,6 +32,7 @@
- #include <linux/workqueue.h>
-
- #include "bootsplash_internal.h"
-+#include "uapi/linux/bootsplash_file.h"
-
-
- /*
-@@ -102,10 +103,17 @@ static bool is_fb_compatible(const struct fb_info *info)
- */
- void bootsplash_render_full(struct fb_info *info)
- {
-+ mutex_lock(&splash_state.data_lock);
-+
- if (!is_fb_compatible(info))
-- return;
-+ goto out;
-+
-+ bootsplash_do_render_background(info, splash_state.file);
-+
-+ bootsplash_do_render_pictures(info, splash_state.file);
-
-- bootsplash_do_render_background(info);
-+out:
-+ mutex_unlock(&splash_state.data_lock);
- }
-
-
-@@ -116,6 +124,7 @@ bool bootsplash_would_render_now(void)
- {
- return !oops_in_progress
- && !console_blanked
-+ && splash_state.file
- && bootsplash_is_enabled();
- }
-
-@@ -252,6 +261,7 @@ static struct platform_driver splash_driver = {
- void bootsplash_init(void)
- {
- int ret;
-+ struct splash_file_priv *fp;
-
- /* Initialized already? */
- if (splash_state.splash_device)
-@@ -280,8 +290,26 @@ void bootsplash_init(void)
- }
-
-
-+ mutex_init(&splash_state.data_lock);
-+ set_bit(0, &splash_state.enabled);
-+
- INIT_WORK(&splash_state.work_redraw_vc, splash_callback_redraw_vc);
-
-+
-+ if (!splash_state.bootfile || !strlen(splash_state.bootfile))
-+ return;
-+
-+ fp = bootsplash_load_firmware(&splash_state.splash_device->dev,
-+ splash_state.bootfile);
-+
-+ if (!fp)
-+ goto err;
-+
-+ mutex_lock(&splash_state.data_lock);
-+ splash_state.splash_fb = NULL;
-+ splash_state.file = fp;
-+ mutex_unlock(&splash_state.data_lock);
-+
- return;
-
- err_device:
-@@ -292,3 +320,7 @@ void bootsplash_init(void)
- err:
- pr_err("Failed to initialize.\n");
- }
-+
-+
-+module_param_named(bootfile, splash_state.bootfile, charp, 0444);
-+MODULE_PARM_DESC(bootfile, "Bootsplash file to load on boot");
-diff --git a/drivers/video/fbdev/core/bootsplash_internal.h b/drivers/video/fbdev/core/bootsplash_internal.h
-index b11da5cb90bf..71e2a27ac0b8 100644
---- a/drivers/video/fbdev/core/bootsplash_internal.h
-+++ b/drivers/video/fbdev/core/bootsplash_internal.h
-@@ -15,15 +15,43 @@
-
- #include <linux/types.h>
- #include <linux/fb.h>
-+#include <linux/firmware.h>
- #include <linux/kernel.h>
- #include <linux/mutex.h>
- #include <linux/spinlock.h>
-
-+#include "uapi/linux/bootsplash_file.h"
-+
-
- /*
- * Runtime types
- */
-+struct splash_blob_priv {
-+ struct splash_blob_header *blob_header;
-+ const void *data;
-+};
-+
-+
-+struct splash_pic_priv {
-+ const struct splash_pic_header *pic_header;
-+
-+ struct splash_blob_priv *blobs;
-+ u16 blobs_loaded;
-+};
-+
-+
-+struct splash_file_priv {
-+ const struct firmware *fw;
-+ const struct splash_file_header *header;
-+
-+ struct splash_pic_priv *pics;
-+};
-+
-+
- struct splash_priv {
-+ /* Bootup and runtime state */
-+ char *bootfile;
-+
- /*
- * Enabled/disabled state, to be used with atomic bit operations.
- * Bit 0: 0 = Splash hidden
-@@ -43,6 +71,13 @@ struct splash_priv {
- struct platform_device *splash_device;
-
- struct work_struct work_redraw_vc;
-+
-+ /* Splash data structures including lock for everything below */
-+ struct mutex data_lock;
-+
-+ struct fb_info *splash_fb;
-+
-+ struct splash_file_priv *file;
- };
-
-
-@@ -50,6 +85,14 @@ struct splash_priv {
- /*
- * Rendering functions
- */
--void bootsplash_do_render_background(struct fb_info *info);
-+void bootsplash_do_render_background(struct fb_info *info,
-+ const struct splash_file_priv *fp);
-+void bootsplash_do_render_pictures(struct fb_info *info,
-+ const struct splash_file_priv *fp);
-+
-+
-+void bootsplash_free_file(struct splash_file_priv *fp);
-+struct splash_file_priv *bootsplash_load_firmware(struct device *device,
-+ const char *path);
-
- #endif
-diff --git a/drivers/video/fbdev/core/bootsplash_load.c b/drivers/video/fbdev/core/bootsplash_load.c
-new file mode 100644
-index 000000000000..fd807571ab7d
---- /dev/null
-+++ b/drivers/video/fbdev/core/bootsplash_load.c
-@@ -0,0 +1,225 @@
-+/*
-+ * Kernel based bootsplash.
-+ *
-+ * (Loading and freeing functions)
-+ *
-+ * Authors:
-+ * Max Staudt <mstaudt@suse.de>
-+ *
-+ * SPDX-License-Identifier: GPL-2.0
-+ */
-+
-+#define pr_fmt(fmt) "bootsplash: " fmt
-+
-+
-+#include <linux/bootsplash.h>
-+#include <linux/fb.h>
-+#include <linux/firmware.h>
-+#include <linux/kernel.h>
-+#include <linux/mutex.h>
-+#include <linux/printk.h>
-+#include <linux/types.h>
-+#include <linux/vmalloc.h>
-+
-+#include "bootsplash_internal.h"
-+#include "uapi/linux/bootsplash_file.h"
-+
-+
-+
-+
-+/*
-+ * Free all vmalloc()'d resources describing a splash file.
-+ */
-+void bootsplash_free_file(struct splash_file_priv *fp)
-+{
-+ if (!fp)
-+ return;
-+
-+ if (fp->pics) {
-+ unsigned int i;
-+
-+ for (i = 0; i < fp->header->num_pics; i++) {
-+ struct splash_pic_priv *pp = &fp->pics[i];
-+
-+ if (pp->blobs)
-+ vfree(pp->blobs);
-+ }
-+
-+ vfree(fp->pics);
-+ }
-+
-+ release_firmware(fp->fw);
-+ vfree(fp);
-+}
-+
-+
-+
-+
-+/*
-+ * Load a splash screen from a "firmware" file.
-+ *
-+ * Parsing, and sanity checks.
-+ */
-+#ifdef __BIG_ENDIAN
-+ #define BOOTSPLASH_MAGIC BOOTSPLASH_MAGIC_BE
-+#else
-+ #define BOOTSPLASH_MAGIC BOOTSPLASH_MAGIC_LE
-+#endif
-+
-+struct splash_file_priv *bootsplash_load_firmware(struct device *device,
-+ const char *path)
-+{
-+ const struct firmware *fw;
-+ struct splash_file_priv *fp;
-+ unsigned int i;
-+ const u8 *walker;
-+
-+ if (request_firmware(&fw, path, device))
-+ return NULL;
-+
-+ if (fw->size < sizeof(struct splash_file_header)
-+ || memcmp(fw->data, BOOTSPLASH_MAGIC, sizeof(fp->header->id))) {
-+ pr_err("Not a bootsplash file.\n");
-+
-+ release_firmware(fw);
-+ return NULL;
-+ }
-+
-+ fp = vzalloc(sizeof(struct splash_file_priv));
-+ if (!fp) {
-+ release_firmware(fw);
-+ return NULL;
-+ }
-+
-+ pr_info("Loading splash file (%li bytes)\n", fw->size);
-+
-+ fp->fw = fw;
-+ fp->header = (struct splash_file_header *)fw->data;
-+
-+ /* Sanity checks */
-+ if (fp->header->version != BOOTSPLASH_VERSION) {
-+ pr_err("Loaded v%d file, but we only support version %d\n",
-+ fp->header->version,
-+ BOOTSPLASH_VERSION);
-+
-+ goto err;
-+ }
-+
-+ if (fw->size < sizeof(struct splash_file_header)
-+ + fp->header->num_pics
-+ * sizeof(struct splash_pic_header)
-+ + fp->header->num_blobs
-+ * sizeof(struct splash_blob_header)) {
-+ pr_err("File incomplete.\n");
-+
-+ goto err;
-+ }
-+
-+ /* Read picture headers */
-+ if (fp->header->num_pics) {
-+ fp->pics = vzalloc(fp->header->num_pics
-+ * sizeof(struct splash_pic_priv));
-+ if (!fp->pics)
-+ goto err;
-+ }
-+
-+ walker = fw->data + sizeof(struct splash_file_header);
-+ for (i = 0; i < fp->header->num_pics; i++) {
-+ struct splash_pic_priv *pp = &fp->pics[i];
-+ struct splash_pic_header *ph = (void *)walker;
-+
-+ pr_debug("Picture %u: Size %ux%u\n", i, ph->width, ph->height);
-+
-+ if (ph->num_blobs < 1) {
-+ pr_err("Picture %u: Zero blobs? Aborting load.\n", i);
-+ goto err;
-+ }
-+
-+ pp->pic_header = ph;
-+ pp->blobs = vzalloc(ph->num_blobs
-+ * sizeof(struct splash_blob_priv));
-+ if (!pp->blobs)
-+ goto err;
-+
-+ walker += sizeof(struct splash_pic_header);
-+ }
-+
-+ /* Read blob headers */
-+ for (i = 0; i < fp->header->num_blobs; i++) {
-+ struct splash_blob_header *bh = (void *)walker;
-+ struct splash_pic_priv *pp;
-+
-+ if (walker + sizeof(struct splash_blob_header)
-+ > fw->data + fw->size)
-+ goto err;
-+
-+ walker += sizeof(struct splash_blob_header);
-+
-+ if (walker + bh->length > fw->data + fw->size)
-+ goto err;
-+
-+ if (bh->picture_id >= fp->header->num_pics)
-+ goto nextblob;
-+
-+ pp = &fp->pics[bh->picture_id];
-+
-+ pr_debug("Blob %u, pic %u, blobs_loaded %u, num_blobs %u.\n",
-+ i, bh->picture_id,
-+ pp->blobs_loaded, pp->pic_header->num_blobs);
-+
-+ if (pp->blobs_loaded >= pp->pic_header->num_blobs)
-+ goto nextblob;
-+
-+ switch (bh->type) {
-+ case 0:
-+ /* Raw 24-bit packed pixels */
-+ if (bh->length != pp->pic_header->width
-+ * pp->pic_header->height * 3) {
-+ pr_err("Blob %u, type 1: Length doesn't match picture.\n",
-+ i);
-+
-+ goto err;
-+ }
-+ break;
-+ default:
-+ pr_warn("Blob %u, unknown type %u.\n", i, bh->type);
-+ goto nextblob;
-+ }
-+
-+ pp->blobs[pp->blobs_loaded].blob_header = bh;
-+ pp->blobs[pp->blobs_loaded].data = walker;
-+ pp->blobs_loaded++;
-+
-+nextblob:
-+ walker += bh->length;
-+ if (bh->length % 16)
-+ walker += 16 - (bh->length % 16);
-+ }
-+
-+ if (walker != fw->data + fw->size)
-+ pr_warn("Trailing data in splash file.\n");
-+
-+ /* Walk over pictures and ensure all blob slots are filled */
-+ for (i = 0; i < fp->header->num_pics; i++) {
-+ struct splash_pic_priv *pp = &fp->pics[i];
-+
-+ if (pp->blobs_loaded != pp->pic_header->num_blobs) {
-+ pr_err("Picture %u doesn't have all blob slots filled.\n",
-+ i);
-+
-+ goto err;
-+ }
-+ }
-+
-+ pr_info("Loaded (%ld bytes, %u pics, %u blobs).\n",
-+ fw->size,
-+ fp->header->num_pics,
-+ fp->header->num_blobs);
-+
-+ return fp;
-+
-+
-+err:
-+ bootsplash_free_file(fp);
-+ return NULL;
-+}
-diff --git a/drivers/video/fbdev/core/bootsplash_render.c b/drivers/video/fbdev/core/bootsplash_render.c
-index 4d7e0117f653..2ae36949d0e3 100644
---- a/drivers/video/fbdev/core/bootsplash_render.c
-+++ b/drivers/video/fbdev/core/bootsplash_render.c
-@@ -19,6 +19,7 @@
- #include <linux/types.h>
-
- #include "bootsplash_internal.h"
-+#include "uapi/linux/bootsplash_file.h"
-
-
-
-@@ -70,16 +71,69 @@ static inline u32 pack_pixel(const struct fb_var_screeninfo *dst_var,
- }
-
-
--void bootsplash_do_render_background(struct fb_info *info)
-+/*
-+ * Copy from source and blend into the destination picture.
-+ * Currently assumes that the source picture is 24bpp.
-+ * Currently assumes that the destination is <= 32bpp.
-+ */
-+static int splash_convert_to_fb(u8 *dst,
-+ const struct fb_var_screeninfo *dst_var,
-+ unsigned int dst_stride,
-+ unsigned int dst_xoff,
-+ unsigned int dst_yoff,
-+ const u8 *src,
-+ unsigned int src_width,
-+ unsigned int src_height)
-+{
-+ unsigned int x, y;
-+ unsigned int src_stride = 3 * src_width; /* Assume 24bpp packed */
-+ u32 dst_octpp = dst_var->bits_per_pixel / 8;
-+
-+ dst_xoff += dst_var->xoffset;
-+ dst_yoff += dst_var->yoffset;
-+
-+ /* Copy with stride and pixel size adjustment */
-+ for (y = 0;
-+ y < src_height && y + dst_yoff < dst_var->yres_virtual;
-+ y++) {
-+ const u8 *srcline = src + (y * src_stride);
-+ u8 *dstline = dst + ((y + dst_yoff) * dst_stride)
-+ + (dst_xoff * dst_octpp);
-+
-+ for (x = 0;
-+ x < src_width && x + dst_xoff < dst_var->xres_virtual;
-+ x++) {
-+ u8 red, green, blue;
-+ u32 dstpix;
-+
-+ /* Read pixel */
-+ red = *srcline++;
-+ green = *srcline++;
-+ blue = *srcline++;
-+
-+ /* Write pixel */
-+ dstpix = pack_pixel(dst_var, red, green, blue);
-+ memcpy(dstline, &dstpix, dst_octpp);
-+
-+ dstline += dst_octpp;
-+ }
-+ }
-+
-+ return 0;
-+}
-+
-+
-+void bootsplash_do_render_background(struct fb_info *info,
-+ const struct splash_file_priv *fp)
- {
- unsigned int x, y;
- u32 dstpix;
- u32 dst_octpp = info->var.bits_per_pixel / 8;
-
- dstpix = pack_pixel(&info->var,
-- 0,
-- 0,
-- 0);
-+ fp->header->bg_red,
-+ fp->header->bg_green,
-+ fp->header->bg_blue);
-
- for (y = 0; y < info->var.yres_virtual; y++) {
- u8 *dstline = info->screen_buffer + (y * info->fix.line_length);
-@@ -91,3 +145,44 @@ void bootsplash_do_render_background(struct fb_info *info)
- }
- }
- }
-+
-+
-+void bootsplash_do_render_pictures(struct fb_info *info,
-+ const struct splash_file_priv *fp)
-+{
-+ unsigned int i;
-+
-+ for (i = 0; i < fp->header->num_pics; i++) {
-+ struct splash_blob_priv *bp;
-+ struct splash_pic_priv *pp = &fp->pics[i];
-+ long dst_xoff, dst_yoff;
-+
-+ if (pp->blobs_loaded < 1)
-+ continue;
-+
-+ bp = &pp->blobs[0];
-+
-+ if (!bp || bp->blob_header->type != 0)
-+ continue;
-+
-+ dst_xoff = (info->var.xres - pp->pic_header->width) / 2;
-+ dst_yoff = (info->var.yres - pp->pic_header->height) / 2;
-+
-+ if (dst_xoff < 0
-+ || dst_yoff < 0
-+ || dst_xoff + pp->pic_header->width > info->var.xres
-+ || dst_yoff + pp->pic_header->height > info->var.yres) {
-+ pr_info_once("Picture %u is out of bounds at current resolution: %dx%d\n"
-+ "(this will only be printed once every reboot)\n",
-+ i, info->var.xres, info->var.yres);
-+
-+ continue;
-+ }
-+
-+ /* Draw next splash frame */
-+ splash_convert_to_fb(info->screen_buffer, &info->var,
-+ info->fix.line_length, dst_xoff, dst_yoff,
-+ bp->data,
-+ pp->pic_header->width, pp->pic_header->height);
-+ }
-+}
-diff --git a/include/uapi/linux/bootsplash_file.h b/include/uapi/linux/bootsplash_file.h
-new file mode 100644
-index 000000000000..89dc9cca8f0c
---- /dev/null
-+++ b/include/uapi/linux/bootsplash_file.h
-@@ -0,0 +1,118 @@
-+/*
-+ * Kernel based bootsplash.
-+ *
-+ * (File format)
-+ *
-+ * Authors:
-+ * Max Staudt <mstaudt@suse.de>
-+ *
-+ * SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
-+ */
-+
-+#ifndef __BOOTSPLASH_FILE_H
-+#define __BOOTSPLASH_FILE_H
-+
-+
-+#define BOOTSPLASH_VERSION 55561
-+
-+
-+#include <linux/kernel.h>
-+#include <linux/types.h>
-+
-+
-+/*
-+ * On-disk types
-+ *
-+ * A splash file consists of:
-+ * - One single 'struct splash_file_header'
-+ * - An array of 'struct splash_pic_header'
-+ * - An array of raw data blocks, each padded to 16 bytes and
-+ * preceded by a 'struct splash_blob_header'
-+ *
-+ * A single-frame splash may look like this:
-+ *
-+ * +--------------------+
-+ * | |
-+ * | splash_file_header |
-+ * | -> num_blobs = 1 |
-+ * | -> num_pics = 1 |
-+ * | |
-+ * +--------------------+
-+ * | |
-+ * | splash_pic_header |
-+ * | |
-+ * +--------------------+
-+ * | |
-+ * | splash_blob_header |
-+ * | -> type = 0 |
-+ * | -> picture_id = 0 |
-+ * | |
-+ * | (raw RGB data) |
-+ * | (pad to 16 bytes) |
-+ * | |
-+ * +--------------------+
-+ *
-+ * All multi-byte values are stored on disk in the native format
-+ * expected by the system the file will be used on.
-+ */
-+#define BOOTSPLASH_MAGIC_BE "Linux bootsplash"
-+#define BOOTSPLASH_MAGIC_LE "hsalpstoob xuniL"
-+
-+struct splash_file_header {
-+ uint8_t id[16]; /* "Linux bootsplash" (no trailing NUL) */
-+
-+ /* Splash file format version to avoid clashes */
-+ uint16_t version;
-+
-+ /* The background color */
-+ uint8_t bg_red;
-+ uint8_t bg_green;
-+ uint8_t bg_blue;
-+ uint8_t bg_reserved;
-+
-+ /*
-+ * Number of pic/blobs so we can allocate memory for internal
-+ * structures ahead of time when reading the file
-+ */
-+ uint16_t num_blobs;
-+ uint8_t num_pics;
-+
-+ uint8_t padding[103];
-+} __attribute__((__packed__));
-+
-+
-+struct splash_pic_header {
-+ uint16_t width;
-+ uint16_t height;
-+
-+ /*
-+ * Number of data packages associated with this picture.
-+ * Currently, the only use for more than 1 is for animations.
-+ */
-+ uint8_t num_blobs;
-+
-+ uint8_t padding[27];
-+} __attribute__((__packed__));
-+
-+
-+struct splash_blob_header {
-+ /* Length of the data block in bytes. */
-+ uint32_t length;
-+
-+ /*
-+ * Type of the contents.
-+ * 0 - Raw RGB data.
-+ */
-+ uint16_t type;
-+
-+ /*
-+ * Picture this blob is associated with.
-+ * Blobs will be added to a picture in the order they are
-+ * found in the file.
-+ */
-+ uint8_t picture_id;
-+
-+ uint8_t padding[9];
-+} __attribute__((__packed__));
-+
-+#endif
diff --git a/0004-drm-i915-Wean-off-drm_pci_alloc-drm_pci_free.patch b/0004-drm-i915-Wean-off-drm_pci_alloc-drm_pci_free.patch
new file mode 100755
index 000000000000..8be0a16bcd17
--- /dev/null
+++ b/0004-drm-i915-Wean-off-drm_pci_alloc-drm_pci_free.patch
@@ -0,0 +1,260 @@
+From 7af5e53f87d728579cba99568717a6af3625184b Mon Sep 17 00:00:00 2001
+From: Chris Wilson <chris@chris-wilson.co.uk>
+Date: Sun, 2 Feb 2020 15:39:34 +0000
+Subject: [PATCH 4/7] drm/i915: Wean off drm_pci_alloc/drm_pci_free
+
+drm_pci_alloc and drm_pci_free are just very thin wrappers around
+dma_alloc_coherent, with a note that we should be removing them.
+Furthermore since
+
+commit de09d31dd38a50fdce106c15abd68432eebbd014
+Author: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
+Date: Fri Jan 15 16:51:42 2016 -0800
+
+ page-flags: define PG_reserved behavior on compound pages
+
+ As far as I can see there's no users of PG_reserved on compound pages.
+ Let's use PF_NO_COMPOUND here.
+
+drm_pci_alloc has been declared broken since it mixes GFP_COMP and
+SetPageReserved. Avoid this conflict by weaning ourselves off using the
+abstraction and using the dma functions directly.
+
+Reported-by: Taketo Kabe
+Closes: https://gitlab.freedesktop.org/drm/intel/issues/1027
+Fixes: de09d31dd38a ("page-flags: define PG_reserved behavior on compound pages")
+Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+Cc: <stable@vger.kernel.org> # v4.5+
+Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
+Link: https://patchwork.freedesktop.org/patch/msgid/20200202153934.3899472-1-chris@chris-wilson.co.uk
+---
+ drivers/gpu/drm/i915/display/intel_display.c | 2 +-
+ .../gpu/drm/i915/gem/i915_gem_object_types.h | 3 -
+ drivers/gpu/drm/i915/gem/i915_gem_phys.c | 98 ++++++++++---------
+ drivers/gpu/drm/i915/i915_gem.c | 8 +-
+ 4 files changed, 55 insertions(+), 56 deletions(-)
+
+diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
+index 301897791627..b670239a293b 100644
+--- a/drivers/gpu/drm/i915/display/intel_display.c
++++ b/drivers/gpu/drm/i915/display/intel_display.c
+@@ -10731,7 +10731,7 @@ static u32 intel_cursor_base(const struct intel_plane_state *plane_state)
+ u32 base;
+
+ if (INTEL_INFO(dev_priv)->display.cursor_needs_physical)
+- base = obj->phys_handle->busaddr;
++ base = sg_dma_address(obj->mm.pages->sgl);
+ else
+ base = intel_plane_ggtt_offset(plane_state);
+
+diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
+index e3f3944fbd90..1078a76d6d84 100644
+--- a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
++++ b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
+@@ -260,9 +260,6 @@ struct drm_i915_gem_object {
+
+ void *gvt_info;
+ };
+-
+- /** for phys allocated objects */
+- struct drm_dma_handle *phys_handle;
+ };
+
+ static inline struct drm_i915_gem_object *
+diff --git a/drivers/gpu/drm/i915/gem/i915_gem_phys.c b/drivers/gpu/drm/i915/gem/i915_gem_phys.c
+index 8043ff63d73f..5e2e0109c9ba 100644
+--- a/drivers/gpu/drm/i915/gem/i915_gem_phys.c
++++ b/drivers/gpu/drm/i915/gem/i915_gem_phys.c
+@@ -22,88 +22,87 @@
+ static int i915_gem_object_get_pages_phys(struct drm_i915_gem_object *obj)
+ {
+ struct address_space *mapping = obj->base.filp->f_mapping;
+- struct drm_dma_handle *phys;
+- struct sg_table *st;
+ struct scatterlist *sg;
+- char *vaddr;
++ struct sg_table *st;
++ dma_addr_t dma;
++ void *vaddr;
++ void *dst;
+ int i;
+- int err;
+
+ if (WARN_ON(i915_gem_object_needs_bit17_swizzle(obj)))
+ return -EINVAL;
+
+- /* Always aligning to the object size, allows a single allocation
++ /*
++ * Always aligning to the object size, allows a single allocation
+ * to handle all possible callers, and given typical object sizes,
+ * the alignment of the buddy allocation will naturally match.
+ */
+- phys = drm_pci_alloc(obj->base.dev,
+- roundup_pow_of_two(obj->base.size),
+- roundup_pow_of_two(obj->base.size));
+- if (!phys)
++ vaddr = dma_alloc_coherent(&obj->base.dev->pdev->dev,
++ roundup_pow_of_two(obj->base.size),
++ &dma, GFP_KERNEL);
++ if (!vaddr)
+ return -ENOMEM;
+
+- vaddr = phys->vaddr;
++ st = kmalloc(sizeof(*st), GFP_KERNEL);
++ if (!st)
++ goto err_pci;
++
++ if (sg_alloc_table(st, 1, GFP_KERNEL))
++ goto err_st;
++
++ sg = st->sgl;
++ sg->offset = 0;
++ sg->length = obj->base.size;
++
++ sg_assign_page(sg, (struct page *)vaddr);
++ sg_dma_address(sg) = dma;
++ sg_dma_len(sg) = obj->base.size;
++
++ dst = vaddr;
+ for (i = 0; i < obj->base.size / PAGE_SIZE; i++) {
+ struct page *page;
+- char *src;
++ void *src;
+
+ page = shmem_read_mapping_page(mapping, i);
+- if (IS_ERR(page)) {
+- err = PTR_ERR(page);
+- goto err_phys;
+- }
++ if (IS_ERR(page))
++ goto err_st;
+
+ src = kmap_atomic(page);
+- memcpy(vaddr, src, PAGE_SIZE);
+- drm_clflush_virt_range(vaddr, PAGE_SIZE);
++ memcpy(dst, src, PAGE_SIZE);
++ drm_clflush_virt_range(dst, PAGE_SIZE);
+ kunmap_atomic(src);
+
+ put_page(page);
+- vaddr += PAGE_SIZE;
++ dst += PAGE_SIZE;
+ }
+
+ intel_gt_chipset_flush(&to_i915(obj->base.dev)->gt);
+
+- st = kmalloc(sizeof(*st), GFP_KERNEL);
+- if (!st) {
+- err = -ENOMEM;
+- goto err_phys;
+- }
+-
+- if (sg_alloc_table(st, 1, GFP_KERNEL)) {
+- kfree(st);
+- err = -ENOMEM;
+- goto err_phys;
+- }
+-
+- sg = st->sgl;
+- sg->offset = 0;
+- sg->length = obj->base.size;
+-
+- sg_dma_address(sg) = phys->busaddr;
+- sg_dma_len(sg) = obj->base.size;
+-
+- obj->phys_handle = phys;
+-
+ __i915_gem_object_set_pages(obj, st, sg->length);
+
+ return 0;
+
+-err_phys:
+- drm_pci_free(obj->base.dev, phys);
+-
+- return err;
++err_st:
++ kfree(st);
++err_pci:
++ dma_free_coherent(&obj->base.dev->pdev->dev,
++ roundup_pow_of_two(obj->base.size),
++ vaddr, dma);
++ return -ENOMEM;
+ }
+
+ static void
+ i915_gem_object_put_pages_phys(struct drm_i915_gem_object *obj,
+ struct sg_table *pages)
+ {
++ dma_addr_t dma = sg_dma_address(pages->sgl);
++ void *vaddr = sg_page(pages->sgl);
++
+ __i915_gem_object_release_shmem(obj, pages, false);
+
+ if (obj->mm.dirty) {
+ struct address_space *mapping = obj->base.filp->f_mapping;
+- char *vaddr = obj->phys_handle->vaddr;
++ void *src = vaddr;
+ int i;
+
+ for (i = 0; i < obj->base.size / PAGE_SIZE; i++) {
+@@ -115,15 +114,16 @@ i915_gem_object_put_pages_phys(struct drm_i915_gem_object *obj,
+ continue;
+
+ dst = kmap_atomic(page);
+- drm_clflush_virt_range(vaddr, PAGE_SIZE);
+- memcpy(dst, vaddr, PAGE_SIZE);
++ drm_clflush_virt_range(src, PAGE_SIZE);
++ memcpy(dst, src, PAGE_SIZE);
+ kunmap_atomic(dst);
+
+ set_page_dirty(page);
+ if (obj->mm.madv == I915_MADV_WILLNEED)
+ mark_page_accessed(page);
+ put_page(page);
+- vaddr += PAGE_SIZE;
++
++ src += PAGE_SIZE;
+ }
+ obj->mm.dirty = false;
+ }
+@@ -131,7 +131,9 @@ i915_gem_object_put_pages_phys(struct drm_i915_gem_object *obj,
+ sg_free_table(pages);
+ kfree(pages);
+
+- drm_pci_free(obj->base.dev, obj->phys_handle);
++ dma_free_coherent(&obj->base.dev->pdev->dev,
++ roundup_pow_of_two(obj->base.size),
++ vaddr, dma);
+ }
+
+ static void phys_release(struct drm_i915_gem_object *obj)
+diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
+index 905890e3ac24..3f07948ea4da 100644
+--- a/drivers/gpu/drm/i915/i915_gem.c
++++ b/drivers/gpu/drm/i915/i915_gem.c
+@@ -154,7 +154,7 @@ i915_gem_phys_pwrite(struct drm_i915_gem_object *obj,
+ struct drm_i915_gem_pwrite *args,
+ struct drm_file *file)
+ {
+- void *vaddr = obj->phys_handle->vaddr + args->offset;
++ void *vaddr = sg_page(obj->mm.pages->sgl) + args->offset;
+ char __user *user_data = u64_to_user_ptr(args->data_ptr);
+
+ /*
+@@ -800,10 +800,10 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
+ ret = i915_gem_gtt_pwrite_fast(obj, args);
+
+ if (ret == -EFAULT || ret == -ENOSPC) {
+- if (obj->phys_handle)
+- ret = i915_gem_phys_pwrite(obj, args, file);
+- else
++ if (i915_gem_object_has_struct_page(obj))
+ ret = i915_gem_shmem_pwrite(obj, args);
++ else
++ ret = i915_gem_phys_pwrite(obj, args, file);
+ }
+
+ i915_gem_object_unpin_pages(obj);
+--
+2.25.0
+
diff --git a/0005-bootsplash.patch b/0005-bootsplash.patch
deleted file mode 100644
index 216953762e2e..000000000000
--- a/0005-bootsplash.patch
+++ /dev/null
@@ -1,66 +0,0 @@
-diff --git a/drivers/video/fbdev/core/bootsplash.c b/drivers/video/fbdev/core/bootsplash.c
-index 843c5400fefc..815b007f81ca 100644
---- a/drivers/video/fbdev/core/bootsplash.c
-+++ b/drivers/video/fbdev/core/bootsplash.c
-@@ -112,6 +112,8 @@ void bootsplash_render_full(struct fb_info *info)
-
- bootsplash_do_render_pictures(info, splash_state.file);
-
-+ bootsplash_do_render_flush(info);
-+
- out:
- mutex_unlock(&splash_state.data_lock);
- }
-diff --git a/drivers/video/fbdev/core/bootsplash_internal.h b/drivers/video/fbdev/core/bootsplash_internal.h
-index 71e2a27ac0b8..0acb383aa4e3 100644
---- a/drivers/video/fbdev/core/bootsplash_internal.h
-+++ b/drivers/video/fbdev/core/bootsplash_internal.h
-@@ -89,6 +89,7 @@ void bootsplash_do_render_background(struct fb_info *info,
- const struct splash_file_priv *fp);
- void bootsplash_do_render_pictures(struct fb_info *info,
- const struct splash_file_priv *fp);
-+void bootsplash_do_render_flush(struct fb_info *info);
-
-
- void bootsplash_free_file(struct splash_file_priv *fp);
-diff --git a/drivers/video/fbdev/core/bootsplash_render.c b/drivers/video/fbdev/core/bootsplash_render.c
-index 2ae36949d0e3..8c09c306ff67 100644
---- a/drivers/video/fbdev/core/bootsplash_render.c
-+++ b/drivers/video/fbdev/core/bootsplash_render.c
-@@ -186,3 +186,36 @@ void bootsplash_do_render_pictures(struct fb_info *info,
- pp->pic_header->width, pp->pic_header->height);
- }
- }
-+
-+
-+void bootsplash_do_render_flush(struct fb_info *info)
-+{
-+ /*
-+ * FB drivers using deferred_io (such as Xen) need to sync the
-+ * screen after modifying its contents. When the FB is mmap()ed
-+ * from userspace, this happens via a dirty pages callback, but
-+ * when modifying the FB from the kernel, there is no such thing.
-+ *
-+ * So let's issue a fake fb_copyarea (copying the FB onto itself)
-+ * to trick the FB driver into syncing the screen.
-+ *
-+ * A few DRM drivers' FB implementations are broken by not using
-+ * deferred_io when they really should - we match on the known
-+ * bad ones manually for now.
-+ */
-+ if (info->fbdefio
-+ || !strcmp(info->fix.id, "astdrmfb")
-+ || !strcmp(info->fix.id, "cirrusdrmfb")
-+ || !strcmp(info->fix.id, "mgadrmfb")) {
-+ struct fb_copyarea area;
-+
-+ area.dx = 0;
-+ area.dy = 0;
-+ area.width = info->var.xres;
-+ area.height = info->var.yres;
-+ area.sx = 0;
-+ area.sy = 0;
-+
-+ info->fbops->fb_copyarea(info, &area);
-+ }
-+}
diff --git a/0005-drm-Remove-PageReserved-manipulation-from-drm_pci_al.patch b/0005-drm-Remove-PageReserved-manipulation-from-drm_pci_al.patch
new file mode 100755
index 000000000000..bbe4432aaaf8
--- /dev/null
+++ b/0005-drm-Remove-PageReserved-manipulation-from-drm_pci_al.patch
@@ -0,0 +1,91 @@
+From c40f78c76b2f3ae55c348e8b206b0b283f01549c Mon Sep 17 00:00:00 2001
+From: Chris Wilson <chris@chris-wilson.co.uk>
+Date: Sun, 2 Feb 2020 17:16:31 +0000
+Subject: [PATCH 5/7] drm: Remove PageReserved manipulation from drm_pci_alloc
+
+drm_pci_alloc/drm_pci_free are very thin wrappers around the core dma
+facilities, and we have no special reason within the drm layer to behave
+differently. In particular, since
+
+commit de09d31dd38a50fdce106c15abd68432eebbd014
+Author: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
+Date: Fri Jan 15 16:51:42 2016 -0800
+
+ page-flags: define PG_reserved behavior on compound pages
+
+ As far as I can see there's no users of PG_reserved on compound pages.
+ Let's use PF_NO_COMPOUND here.
+
+it has been illegal to combine GFP_COMP with SetPageReserved, so lets
+stop doing both and leave the dma layer to its own devices.
+
+Reported-by: Taketo Kabe
+Bug: https://gitlab.freedesktop.org/drm/intel/issues/1027
+Fixes: de09d31dd38a ("page-flags: define PG_reserved behavior on compound pages")
+Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+Cc: <stable@vger.kernel.org> # v4.5+
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+Link: https://patchwork.freedesktop.org/patch/msgid/20200202171635.4039044-1-chris@chris-wilson.co.uk
+---
+ drivers/gpu/drm/drm_pci.c | 23 ++---------------------
+ 1 file changed, 2 insertions(+), 21 deletions(-)
+
+diff --git a/drivers/gpu/drm/drm_pci.c b/drivers/gpu/drm/drm_pci.c
+index a86a3ab2771c..235729f4aadb 100644
+--- a/drivers/gpu/drm/drm_pci.c
++++ b/drivers/gpu/drm/drm_pci.c
+@@ -51,8 +51,6 @@
+ drm_dma_handle_t *drm_pci_alloc(struct drm_device * dev, size_t size, size_t align)
+ {
+ drm_dma_handle_t *dmah;
+- unsigned long addr;
+- size_t sz;
+
+ /* pci_alloc_consistent only guarantees alignment to the smallest
+ * PAGE_SIZE order which is greater than or equal to the requested size.
+@@ -68,20 +66,13 @@ drm_dma_handle_t *drm_pci_alloc(struct drm_device * dev, size_t size, size_t ali
+ dmah->size = size;
+ dmah->vaddr = dma_alloc_coherent(&dev->pdev->dev, size,
+ &dmah->busaddr,
+- GFP_KERNEL | __GFP_COMP);
++ GFP_KERNEL);
+
+ if (dmah->vaddr == NULL) {
+ kfree(dmah);
+ return NULL;
+ }
+
+- /* XXX - Is virt_to_page() legal for consistent mem? */
+- /* Reserve */
+- for (addr = (unsigned long)dmah->vaddr, sz = size;
+- sz > 0; addr += PAGE_SIZE, sz -= PAGE_SIZE) {
+- SetPageReserved(virt_to_page((void *)addr));
+- }
+-
+ return dmah;
+ }
+
+@@ -94,19 +85,9 @@ EXPORT_SYMBOL(drm_pci_alloc);
+ */
+ void __drm_legacy_pci_free(struct drm_device * dev, drm_dma_handle_t * dmah)
+ {
+- unsigned long addr;
+- size_t sz;
+-
+- if (dmah->vaddr) {
+- /* XXX - Is virt_to_page() legal for consistent mem? */
+- /* Unreserve */
+- for (addr = (unsigned long)dmah->vaddr, sz = dmah->size;
+- sz > 0; addr += PAGE_SIZE, sz -= PAGE_SIZE) {
+- ClearPageReserved(virt_to_page((void *)addr));
+- }
++ if (dmah->vaddr)
+ dma_free_coherent(&dev->pdev->dev, dmah->size, dmah->vaddr,
+ dmah->busaddr);
+- }
+ }
+
+ /**
+--
+2.25.0
+
diff --git a/0006-bootsplash.patch b/0006-bootsplash.patch
deleted file mode 100644
index 7eb54aff7e00..000000000000
--- a/0006-bootsplash.patch
+++ /dev/null
@@ -1,215 +0,0 @@
-diff --git a/drivers/video/fbdev/core/bootsplash_render.c b/drivers/video/fbdev/core/bootsplash_render.c
-index 8c09c306ff67..07e3a4eab811 100644
---- a/drivers/video/fbdev/core/bootsplash_render.c
-+++ b/drivers/video/fbdev/core/bootsplash_render.c
-@@ -155,6 +155,7 @@ void bootsplash_do_render_pictures(struct fb_info *info,
- for (i = 0; i < fp->header->num_pics; i++) {
- struct splash_blob_priv *bp;
- struct splash_pic_priv *pp = &fp->pics[i];
-+ const struct splash_pic_header *ph = pp->pic_header;
- long dst_xoff, dst_yoff;
-
- if (pp->blobs_loaded < 1)
-@@ -165,8 +166,139 @@ void bootsplash_do_render_pictures(struct fb_info *info,
- if (!bp || bp->blob_header->type != 0)
- continue;
-
-- dst_xoff = (info->var.xres - pp->pic_header->width) / 2;
-- dst_yoff = (info->var.yres - pp->pic_header->height) / 2;
-+ switch (ph->position) {
-+ case SPLASH_POS_FLAG_CORNER | SPLASH_CORNER_TOP_LEFT:
-+ dst_xoff = 0;
-+ dst_yoff = 0;
-+
-+ dst_xoff += ph->position_offset;
-+ dst_yoff += ph->position_offset;
-+ break;
-+ case SPLASH_POS_FLAG_CORNER | SPLASH_CORNER_TOP:
-+ dst_xoff = info->var.xres - pp->pic_header->width;
-+ dst_xoff /= 2;
-+ dst_yoff = 0;
-+
-+ dst_yoff += ph->position_offset;
-+ break;
-+ case SPLASH_POS_FLAG_CORNER | SPLASH_CORNER_TOP_RIGHT:
-+ dst_xoff = info->var.xres - pp->pic_header->width;
-+ dst_yoff = 0;
-+
-+ dst_xoff -= ph->position_offset;
-+ dst_yoff += ph->position_offset;
-+ break;
-+ case SPLASH_POS_FLAG_CORNER | SPLASH_CORNER_RIGHT:
-+ dst_xoff = info->var.xres - pp->pic_header->width;
-+ dst_yoff = info->var.yres - pp->pic_header->height;
-+ dst_yoff /= 2;
-+
-+ dst_xoff -= ph->position_offset;
-+ break;
-+ case SPLASH_POS_FLAG_CORNER | SPLASH_CORNER_BOTTOM_RIGHT:
-+ dst_xoff = info->var.xres - pp->pic_header->width;
-+ dst_yoff = info->var.yres - pp->pic_header->height;
-+
-+ dst_xoff -= ph->position_offset;
-+ dst_yoff -= ph->position_offset;
-+ break;
-+ case SPLASH_POS_FLAG_CORNER | SPLASH_CORNER_BOTTOM:
-+ dst_xoff = info->var.xres - pp->pic_header->width;
-+ dst_xoff /= 2;
-+ dst_yoff = info->var.yres - pp->pic_header->height;
-+
-+ dst_yoff -= ph->position_offset;
-+ break;
-+ case SPLASH_POS_FLAG_CORNER | SPLASH_CORNER_BOTTOM_LEFT:
-+ dst_xoff = 0 + ph->position_offset;
-+ dst_yoff = info->var.yres - pp->pic_header->height
-+ - ph->position_offset;
-+ break;
-+ case SPLASH_POS_FLAG_CORNER | SPLASH_CORNER_LEFT:
-+ dst_xoff = 0;
-+ dst_yoff = info->var.yres - pp->pic_header->height;
-+ dst_yoff /= 2;
-+
-+ dst_xoff += ph->position_offset;
-+ break;
-+
-+ case SPLASH_CORNER_TOP_LEFT:
-+ dst_xoff = info->var.xres - pp->pic_header->width;
-+ dst_xoff /= 2;
-+ dst_yoff = info->var.yres - pp->pic_header->height;
-+ dst_yoff /= 2;
-+
-+ dst_xoff -= ph->position_offset;
-+ dst_yoff -= ph->position_offset;
-+ break;
-+ case SPLASH_CORNER_TOP:
-+ dst_xoff = info->var.xres - pp->pic_header->width;
-+ dst_xoff /= 2;
-+ dst_yoff = info->var.yres - pp->pic_header->height;
-+ dst_yoff /= 2;
-+
-+ dst_yoff -= ph->position_offset;
-+ break;
-+ case SPLASH_CORNER_TOP_RIGHT:
-+ dst_xoff = info->var.xres - pp->pic_header->width;
-+ dst_xoff /= 2;
-+ dst_yoff = info->var.yres - pp->pic_header->height;
-+ dst_yoff /= 2;
-+
-+ dst_xoff += ph->position_offset;
-+ dst_yoff -= ph->position_offset;
-+ break;
-+ case SPLASH_CORNER_RIGHT:
-+ dst_xoff = info->var.xres - pp->pic_header->width;
-+ dst_xoff /= 2;
-+ dst_yoff = info->var.yres - pp->pic_header->height;
-+ dst_yoff /= 2;
-+
-+ dst_xoff += ph->position_offset;
-+ break;
-+ case SPLASH_CORNER_BOTTOM_RIGHT:
-+ dst_xoff = info->var.xres - pp->pic_header->width;
-+ dst_xoff /= 2;
-+ dst_yoff = info->var.yres - pp->pic_header->height;
-+ dst_yoff /= 2;
-+
-+ dst_xoff += ph->position_offset;
-+ dst_yoff += ph->position_offset;
-+ break;
-+ case SPLASH_CORNER_BOTTOM:
-+ dst_xoff = info->var.xres - pp->pic_header->width;
-+ dst_xoff /= 2;
-+ dst_yoff = info->var.yres - pp->pic_header->height;
-+ dst_yoff /= 2;
-+
-+ dst_yoff += ph->position_offset;
-+ break;
-+ case SPLASH_CORNER_BOTTOM_LEFT:
-+ dst_xoff = info->var.xres - pp->pic_header->width;
-+ dst_xoff /= 2;
-+ dst_yoff = info->var.yres - pp->pic_header->height;
-+ dst_yoff /= 2;
-+
-+ dst_xoff -= ph->position_offset;
-+ dst_yoff += ph->position_offset;
-+ break;
-+ case SPLASH_CORNER_LEFT:
-+ dst_xoff = info->var.xres - pp->pic_header->width;
-+ dst_xoff /= 2;
-+ dst_yoff = info->var.yres - pp->pic_header->height;
-+ dst_yoff /= 2;
-+
-+ dst_xoff -= ph->position_offset;
-+ break;
-+
-+ default:
-+ /* As a fallback, center the picture. */
-+ dst_xoff = info->var.xres - pp->pic_header->width;
-+ dst_xoff /= 2;
-+ dst_yoff = info->var.yres - pp->pic_header->height;
-+ dst_yoff /= 2;
-+ break;
-+ }
-
- if (dst_xoff < 0
- || dst_yoff < 0
-diff --git a/include/uapi/linux/bootsplash_file.h b/include/uapi/linux/bootsplash_file.h
-index 89dc9cca8f0c..71cedcc68933 100644
---- a/include/uapi/linux/bootsplash_file.h
-+++ b/include/uapi/linux/bootsplash_file.h
-@@ -91,7 +91,32 @@ struct splash_pic_header {
- */
- uint8_t num_blobs;
-
-- uint8_t padding[27];
-+ /*
-+ * Corner to move the picture to / from.
-+ * 0x00 - Top left
-+ * 0x01 - Top
-+ * 0x02 - Top right
-+ * 0x03 - Right
-+ * 0x04 - Bottom right
-+ * 0x05 - Bottom
-+ * 0x06 - Bottom left
-+ * 0x07 - Left
-+ *
-+ * Flags:
-+ * 0x10 - Calculate offset from the corner towards the center,
-+ * rather than from the center towards the corner
-+ */
-+ uint8_t position;
-+
-+ /*
-+ * Pixel offset from the selected position.
-+ * Example: If the picture is in the top right corner, it will
-+ * be placed position_offset pixels from the top and
-+ * position_offset pixels from the right margin.
-+ */
-+ uint16_t position_offset;
-+
-+ uint8_t padding[24];
- } __attribute__((__packed__));
-
-
-@@ -115,4 +140,22 @@ struct splash_blob_header {
- uint8_t padding[9];
- } __attribute__((__packed__));
-
-+
-+
-+
-+/*
-+ * Enums for on-disk types
-+ */
-+enum splash_position {
-+ SPLASH_CORNER_TOP_LEFT = 0,
-+ SPLASH_CORNER_TOP = 1,
-+ SPLASH_CORNER_TOP_RIGHT = 2,
-+ SPLASH_CORNER_RIGHT = 3,
-+ SPLASH_CORNER_BOTTOM_RIGHT = 4,
-+ SPLASH_CORNER_BOTTOM = 5,
-+ SPLASH_CORNER_BOTTOM_LEFT = 6,
-+ SPLASH_CORNER_LEFT = 7,
-+ SPLASH_POS_FLAG_CORNER = 0x10,
-+};
-+
- #endif
diff --git a/0006-drm-i915-execlists-Always-force-a-context-reload-whe.patch b/0006-drm-i915-execlists-Always-force-a-context-reload-whe.patch
new file mode 100755
index 000000000000..8f7938320cd1
--- /dev/null
+++ b/0006-drm-i915-execlists-Always-force-a-context-reload-whe.patch
@@ -0,0 +1,145 @@
+From 6ffd5925e2659e589d48b8dcaf06e0b3cc0f4d52 Mon Sep 17 00:00:00 2001
+From: Chris Wilson <chris@chris-wilson.co.uk>
+Date: Fri, 7 Feb 2020 21:14:52 +0000
+Subject: [PATCH 6/7] drm/i915/execlists: Always force a context reload when
+ rewinding RING_TAIL
+
+If we rewind the RING_TAIL on a context, due to a preemption event, we
+must force the context restore for the RING_TAIL update to be properly
+handled. Rather than note which preemption events may cause us to rewind
+the tail, compare the new request's tail with the previously submitted
+RING_TAIL, as it turns out that timeslicing was causing unexpected
+rewinds.
+
+ <idle>-0 0d.s2 1280851190us : __execlists_submission_tasklet: 0000:00:02.0 rcs0: expired last=130:4698, prio=3, hint=3
+ <idle>-0 0d.s2 1280851192us : __i915_request_unsubmit: 0000:00:02.0 rcs0: fence 66:119966, current 119964
+ <idle>-0 0d.s2 1280851195us : __i915_request_unsubmit: 0000:00:02.0 rcs0: fence 130:4698, current 4695
+ <idle>-0 0d.s2 1280851198us : __i915_request_unsubmit: 0000:00:02.0 rcs0: fence 130:4696, current 4695
+^---- Note we unwind 2 requests from the same context
+
+ <idle>-0 0d.s2 1280851208us : __i915_request_submit: 0000:00:02.0 rcs0: fence 130:4696, current 4695
+ <idle>-0 0d.s2 1280851213us : __i915_request_submit: 0000:00:02.0 rcs0: fence 134:1508, current 1506
+^---- But to apply the new timeslice, we have to replay the first request
+ before the new client can start -- the unexpected RING_TAIL rewind
+
+ <idle>-0 0d.s2 1280851219us : trace_ports: 0000:00:02.0 rcs0: submit { 130:4696*, 134:1508 }
+ synmark2-5425 2..s. 1280851239us : process_csb: 0000:00:02.0 rcs0: cs-irq head=5, tail=0
+ synmark2-5425 2..s. 1280851240us : process_csb: 0000:00:02.0 rcs0: csb[0]: status=0x00008002:0x00000000
+^---- Preemption event for the ELSP update; note the lite-restore
+
+ synmark2-5425 2..s. 1280851243us : trace_ports: 0000:00:02.0 rcs0: preempted { 130:4698, 66:119966 }
+ synmark2-5425 2..s. 1280851246us : trace_ports: 0000:00:02.0 rcs0: promote { 130:4696*, 134:1508 }
+ synmark2-5425 2.... 1280851462us : __i915_request_commit: 0000:00:02.0 rcs0: fence 130:4700, current 4695
+ synmark2-5425 2.... 1280852111us : __i915_request_commit: 0000:00:02.0 rcs0: fence 130:4702, current 4695
+ synmark2-5425 2.Ns1 1280852296us : process_csb: 0000:00:02.0 rcs0: cs-irq head=0, tail=2
+ synmark2-5425 2.Ns1 1280852297us : process_csb: 0000:00:02.0 rcs0: csb[1]: status=0x00000814:0x00000000
+ synmark2-5425 2.Ns1 1280852299us : trace_ports: 0000:00:02.0 rcs0: completed { 130:4696!, 134:1508 }
+ synmark2-5425 2.Ns1 1280852301us : process_csb: 0000:00:02.0 rcs0: csb[2]: status=0x00000818:0x00000040
+ synmark2-5425 2.Ns1 1280852302us : trace_ports: 0000:00:02.0 rcs0: completed { 134:1508, 0:0 }
+ synmark2-5425 2.Ns1 1280852313us : process_csb: process_csb:2336 GEM_BUG_ON(!i915_request_completed(*execlists->active) && !reset_in_progress(execlists))
+
+Fixes: 8ee36e048c98 ("drm/i915/execlists: Minimalistic timeslicing")
+Referenecs: 82c69bf58650 ("drm/i915/gt: Detect if we miss WaIdleLiteRestore")
+Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
+Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
+Cc: <stable@vger.kernel.org> # v5.4+
+Link: https://patchwork.freedesktop.org/patch/msgid/20200207211452.2860634-1-chris@chris-wilson.co.uk
+---
+ drivers/gpu/drm/i915/gt/intel_lrc.c | 18 ++++++++----------
+ drivers/gpu/drm/i915/gt/intel_ring.c | 1 +
+ drivers/gpu/drm/i915/gt/intel_ring.h | 8 ++++++++
+ drivers/gpu/drm/i915/gt/intel_ring_types.h | 1 +
+ 4 files changed, 18 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
+index d925a1035c9d..1b4784bfa7e5 100644
+--- a/drivers/gpu/drm/i915/gt/intel_lrc.c
++++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
+@@ -1157,7 +1157,7 @@ static u64 execlists_update_context(struct i915_request *rq)
+ {
+ struct intel_context *ce = rq->hw_context;
+ u64 desc = ce->lrc_desc;
+- u32 tail;
++ u32 tail, prev;
+
+ /*
+ * WaIdleLiteRestore:bdw,skl
+@@ -1170,9 +1170,15 @@ static u64 execlists_update_context(struct i915_request *rq)
+ * subsequent resubmissions (for lite restore). Should that fail us,
+ * and we try and submit the same tail again, force the context
+ * reload.
++ *
++ * If we need to return to a preempted context, we need to skip the
++ * lite-restore and force it to reload the RING_TAIL. Otherwise, the
++ * HW has a tendency to ignore us rewinding the TAIL to the end of
++ * an earlier request.
+ */
+ tail = intel_ring_set_tail(rq->ring, rq->tail);
+- if (unlikely(ce->lrc_reg_state[CTX_RING_TAIL] == tail))
++ prev = ce->lrc_reg_state[CTX_RING_TAIL];
++ if (unlikely(intel_ring_direction(rq->ring, tail, prev) <= 0))
+ desc |= CTX_DESC_FORCE_RESTORE;
+ ce->lrc_reg_state[CTX_RING_TAIL] = tail;
+ rq->tail = rq->wa_tail;
+@@ -1651,14 +1657,6 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
+ */
+ __unwind_incomplete_requests(engine);
+
+- /*
+- * If we need to return to the preempted context, we
+- * need to skip the lite-restore and force it to
+- * reload the RING_TAIL. Otherwise, the HW has a
+- * tendency to ignore us rewinding the TAIL to the
+- * end of an earlier request.
+- */
+- last->hw_context->lrc_desc |= CTX_DESC_FORCE_RESTORE;
+ last = NULL;
+ } else if (need_timeslice(engine, last) &&
+ timer_expired(&engine->execlists.timer)) {
+diff --git a/drivers/gpu/drm/i915/gt/intel_ring.c b/drivers/gpu/drm/i915/gt/intel_ring.c
+index 374b28f13ca0..6ff803f397c4 100644
+--- a/drivers/gpu/drm/i915/gt/intel_ring.c
++++ b/drivers/gpu/drm/i915/gt/intel_ring.c
+@@ -145,6 +145,7 @@ intel_engine_create_ring(struct intel_engine_cs *engine, int size)
+
+ kref_init(&ring->ref);
+ ring->size = size;
++ ring->wrap = BITS_PER_TYPE(ring->size) - ilog2(size);
+
+ /*
+ * Workaround an erratum on the i830 which causes a hang if
+diff --git a/drivers/gpu/drm/i915/gt/intel_ring.h b/drivers/gpu/drm/i915/gt/intel_ring.h
+index ea2839d9e044..5bdce24994aa 100644
+--- a/drivers/gpu/drm/i915/gt/intel_ring.h
++++ b/drivers/gpu/drm/i915/gt/intel_ring.h
+@@ -56,6 +56,14 @@ static inline u32 intel_ring_wrap(const struct intel_ring *ring, u32 pos)
+ return pos & (ring->size - 1);
+ }
+
++static inline int intel_ring_direction(const struct intel_ring *ring,
++ u32 next, u32 prev)
++{
++ typecheck(typeof(ring->size), next);
++ typecheck(typeof(ring->size), prev);
++ return (next - prev) << ring->wrap;
++}
++
+ static inline bool
+ intel_ring_offset_valid(const struct intel_ring *ring,
+ unsigned int pos)
+diff --git a/drivers/gpu/drm/i915/gt/intel_ring_types.h b/drivers/gpu/drm/i915/gt/intel_ring_types.h
+index d9f17f38e0cc..3cd7fec7fd8d 100644
+--- a/drivers/gpu/drm/i915/gt/intel_ring_types.h
++++ b/drivers/gpu/drm/i915/gt/intel_ring_types.h
+@@ -45,6 +45,7 @@ struct intel_ring {
+
+ u32 space;
+ u32 size;
++ u32 wrap;
+ u32 effective_size;
+ };
+
+--
+2.25.0
+
diff --git a/0007-bootsplash.patch b/0007-bootsplash.patch
index 2785c5e65277..924f23f33ce9 100644..100755
--- a/0007-bootsplash.patch
+++ b/0007-bootsplash.patch
@@ -1,327 +1,746 @@
+diff --git a/MAINTAINERS b/MAINTAINERS
+index a74227ad082e..b5633b56391e 100644
+--- a/MAINTAINERS
++++ b/MAINTAINERS
+@@ -2705,6 +2705,14 @@ S: Supported
+ F: drivers/net/bonding/
+ F: include/uapi/linux/if_bonding.h
+
++BOOTSPLASH
++M: Max Staudt <mstaudt@suse.de>
++L: linux-fbdev@vger.kernel.org
++S: Maintained
++F: drivers/video/fbdev/core/bootsplash*.*
++F: drivers/video/fbdev/core/dummycon.c
++F: include/linux/bootsplash.h
++
+ BPF (Safe dynamic programs and tools)
+ M: Alexei Starovoitov <ast@kernel.org>
+ M: Daniel Borkmann <daniel@iogearbox.net>
+diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig
+index 7f1f1fbcef9e..f3ff976266fe 100644
+--- a/drivers/video/console/Kconfig
++++ b/drivers/video/console/Kconfig
+@@ -151,6 +151,30 @@ config FRAMEBUFFER_CONSOLE_ROTATION
+ such that other users of the framebuffer will remain normally
+ oriented.
+
++config BOOTSPLASH
++ bool "Bootup splash screen"
++ depends on FRAMEBUFFER_CONSOLE
++ ---help---
++ This option enables the Linux bootsplash screen.
++
++ The bootsplash is a full-screen logo or animation indicating a
++ booting system. It replaces the classic scrolling text with a
++ graphical alternative, similar to other systems.
++
++ Since this is technically implemented as a hook on top of fbcon,
++ it can only work if the FRAMEBUFFER_CONSOLE is enabled and a
++ framebuffer driver is active. Thus, to get a text-free boot,
++ the system needs to boot with vesafb, efifb, or similar.
++
++ Once built into the kernel, the bootsplash needs to be enabled
++ with bootsplash.enabled=1 and a splash file needs to be supplied.
++
++ Further documentation can be found in:
++ Documentation/fb/bootsplash.txt
++
++ If unsure, say N.
++ This is typically used by distributors and system integrators.
++
+ config STI_CONSOLE
+ bool "STI text console"
+ depends on PARISC
+diff --git a/drivers/video/fbdev/core/Makefile b/drivers/video/fbdev/core/Makefile
+index 73493bbd7a15..66895321928e 100644
+--- a/drivers/video/fbdev/core/Makefile
++++ b/drivers/video/fbdev/core/Makefile
+@@ -29,3 +29,6 @@ obj-$(CONFIG_FB_SYS_IMAGEBLIT) += sysimgblt.o
+ obj-$(CONFIG_FB_SYS_FOPS) += fb_sys_fops.o
+ obj-$(CONFIG_FB_SVGALIB) += svgalib.o
+ obj-$(CONFIG_FB_DDC) += fb_ddc.o
++
++obj-$(CONFIG_BOOTSPLASH) += bootsplash.o bootsplash_render.o \
++ dummyblit.o
diff --git a/drivers/video/fbdev/core/bootsplash.c b/drivers/video/fbdev/core/bootsplash.c
-index 815b007f81ca..c8642142cfea 100644
---- a/drivers/video/fbdev/core/bootsplash.c
+new file mode 100644
+index 000000000000..e449755af268
+--- /dev/null
+++ b/drivers/video/fbdev/core/bootsplash.c
-@@ -53,6 +53,14 @@ static void splash_callback_redraw_vc(struct work_struct *ignored)
- console_unlock();
- }
-
-+static void splash_callback_animation(struct work_struct *ignored)
+@@ -0,0 +1,294 @@
++/*
++ * Kernel based bootsplash.
++ *
++ * (Main file: Glue code, workers, timer, PM, kernel and userland API)
++ *
++ * Authors:
++ * Max Staudt <mstaudt@suse.de>
++ *
++ * SPDX-License-Identifier: GPL-2.0
++ */
++
++#define pr_fmt(fmt) "bootsplash: " fmt
++
++
++#include <linux/atomic.h>
++#include <linux/bootsplash.h>
++#include <linux/console.h>
++#include <linux/device.h> /* dev_warn() */
++#include <linux/fb.h>
++#include <linux/fs.h>
++#include <linux/kernel.h>
++#include <linux/jiffies.h>
++#include <linux/module.h>
++#include <linux/mutex.h>
++#include <linux/platform_device.h>
++#include <linux/printk.h>
++#include <linux/selection.h> /* console_blanked */
++#include <linux/stringify.h>
++#include <linux/types.h>
++#include <linux/vmalloc.h>
++#include <linux/vt_kern.h>
++#include <linux/workqueue.h>
++
++#include "bootsplash_internal.h"
++
++
++/*
++ * We only have one splash screen, so let's keep a single
++ * instance of the internal state.
++ */
++static struct splash_priv splash_state;
++
++
++static void splash_callback_redraw_vc(struct work_struct *ignored)
++{
++ if (console_blanked)
++ return;
++
++ console_lock();
++ if (vc_cons[fg_console].d)
++ update_screen(vc_cons[fg_console].d);
++ console_unlock();
++}
++
++
++static bool is_fb_compatible(const struct fb_info *info)
+{
-+ if (bootsplash_would_render_now()) {
-+ /* This will also re-schedule this delayed worker */
-+ splash_callback_redraw_vc(ignored);
++ if (!(info->flags & FBINFO_BE_MATH)
++ != !fb_be_math((struct fb_info *)info)) {
++ dev_warn(info->device,
++ "Can't draw on foreign endianness framebuffer.\n");
++
++ return false;
+ }
++
++ if (info->flags & FBINFO_MISC_TILEBLITTING) {
++ dev_warn(info->device,
++ "Can't draw splash on tiling framebuffer.\n");
++
++ return false;
++ }
++
++ if (info->fix.type != FB_TYPE_PACKED_PIXELS
++ || (info->fix.visual != FB_VISUAL_TRUECOLOR
++ && info->fix.visual != FB_VISUAL_DIRECTCOLOR)) {
++ dev_warn(info->device,
++ "Can't draw splash on non-packed or non-truecolor framebuffer.\n");
++
++ dev_warn(info->device,
++ " type: %u visual: %u\n",
++ info->fix.type, info->fix.visual);
++
++ return false;
++ }
++
++ if (info->var.bits_per_pixel != 16
++ && info->var.bits_per_pixel != 24
++ && info->var.bits_per_pixel != 32) {
++ dev_warn(info->device,
++ "We only support drawing on framebuffers with 16, 24, or 32 bpp, not %d.\n",
++ info->var.bits_per_pixel);
++
++ return false;
++ }
++
++ return true;
+}
+
-
- static bool is_fb_compatible(const struct fb_info *info)
- {
-@@ -103,17 +111,44 @@ static bool is_fb_compatible(const struct fb_info *info)
- */
- void bootsplash_render_full(struct fb_info *info)
- {
-+ bool is_update = false;
-+
- mutex_lock(&splash_state.data_lock);
-
-- if (!is_fb_compatible(info))
-- goto out;
-+ /*
-+ * If we've painted on this FB recently, we don't have to do
-+ * the sanity checks and background drawing again.
-+ */
-+ if (splash_state.splash_fb == info)
-+ is_update = true;
+
++/*
++ * Called by fbcon_switch() when an instance is activated or refreshed.
++ */
++void bootsplash_render_full(struct fb_info *info)
++{
++ if (!is_fb_compatible(info))
++ return;
+
-+ if (!is_update) {
-+ /* Check whether we actually support this FB. */
-+ splash_state.splash_fb = NULL;
++ bootsplash_do_render_background(info);
++}
+
-+ if (!is_fb_compatible(info))
-+ goto out;
+
-+ /* Draw the background only once */
-+ bootsplash_do_render_background(info, splash_state.file);
-
-- bootsplash_do_render_background(info, splash_state.file);
-+ /* Mark this FB as last seen */
-+ splash_state.splash_fb = info;
++/*
++ * External status enquiry and on/off switch
++ */
++bool bootsplash_would_render_now(void)
++{
++ return !oops_in_progress
++ && !console_blanked
++ && bootsplash_is_enabled();
++}
++
++bool bootsplash_is_enabled(void)
++{
++ bool was_enabled;
++
++ /* Make sure we have the newest state */
++ smp_rmb();
++
++ was_enabled = test_bit(0, &splash_state.enabled);
++
++ return was_enabled;
++}
++
++void bootsplash_disable(void)
++{
++ int was_enabled;
++
++ was_enabled = test_and_clear_bit(0, &splash_state.enabled);
++
++ if (was_enabled) {
++ if (oops_in_progress) {
++ /* Redraw screen now so we can see a panic */
++ if (vc_cons[fg_console].d)
++ update_screen(vc_cons[fg_console].d);
++ } else {
++ /* No urgency, redraw at next opportunity */
++ schedule_work(&splash_state.work_redraw_vc);
++ }
+ }
-
-- bootsplash_do_render_pictures(info, splash_state.file);
-+ bootsplash_do_render_pictures(info, splash_state.file, is_update);
-
- bootsplash_do_render_flush(info);
-
-+ bootsplash_do_step_animations(splash_state.file);
++}
+
-+ /* Schedule update for animated splash screens */
-+ if (splash_state.file->frame_ms > 0)
-+ schedule_delayed_work(&splash_state.dwork_animation,
-+ msecs_to_jiffies(
-+ splash_state.file->frame_ms));
++void bootsplash_enable(void)
++{
++ bool was_enabled;
+
- out:
- mutex_unlock(&splash_state.data_lock);
- }
-@@ -169,8 +204,14 @@ void bootsplash_enable(void)
-
- was_enabled = test_and_set_bit(0, &splash_state.enabled);
-
-- if (!was_enabled)
-+ if (!was_enabled) {
-+ /* Force a full redraw when the splash is re-activated */
-+ mutex_lock(&splash_state.data_lock);
-+ splash_state.splash_fb = NULL;
-+ mutex_unlock(&splash_state.data_lock);
-+
- schedule_work(&splash_state.work_redraw_vc);
++ if (oops_in_progress)
++ return;
++
++ was_enabled = test_and_set_bit(0, &splash_state.enabled);
++
++ if (!was_enabled)
++ schedule_work(&splash_state.work_redraw_vc);
++}
++
++
++/*
++ * Userland API via platform device in sysfs
++ */
++static ssize_t splash_show_enabled(struct device *dev,
++ struct device_attribute *attr, char *buf)
++{
++ return sprintf(buf, "%d\n", bootsplash_is_enabled());
++}
++
++static ssize_t splash_store_enabled(struct device *device,
++ struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ bool enable;
++ int err;
++
++ if (!buf || !count)
++ return -EFAULT;
++
++ err = kstrtobool(buf, &enable);
++ if (err)
++ return err;
++
++ if (enable)
++ bootsplash_enable();
++ else
++ bootsplash_disable();
++
++ return count;
++}
++
++static DEVICE_ATTR(enabled, 0644, splash_show_enabled, splash_store_enabled);
++
++
++static struct attribute *splash_dev_attrs[] = {
++ &dev_attr_enabled.attr,
++ NULL
++};
++
++ATTRIBUTE_GROUPS(splash_dev);
++
++
++
++
++/*
++ * Power management fixup via platform device
++ *
++ * When the system is woken from sleep or restored after hibernating, we
++ * cannot expect the screen contents to still be present in video RAM.
++ * Thus, we have to redraw the splash if we're currently active.
++ */
++static int splash_resume(struct device *device)
++{
++ if (bootsplash_would_render_now())
++ schedule_work(&splash_state.work_redraw_vc);
++
++ return 0;
++}
++
++static int splash_suspend(struct device *device)
++{
++ cancel_work_sync(&splash_state.work_redraw_vc);
++
++ return 0;
++}
++
++
++static const struct dev_pm_ops splash_pm_ops = {
++ .thaw = splash_resume,
++ .restore = splash_resume,
++ .resume = splash_resume,
++ .suspend = splash_suspend,
++ .freeze = splash_suspend,
++};
++
++static struct platform_driver splash_driver = {
++ .driver = {
++ .name = "bootsplash",
++ .pm = &splash_pm_ops,
++ },
++};
++
++
++/*
++ * Main init
++ */
++void bootsplash_init(void)
++{
++ int ret;
++
++ /* Initialized already? */
++ if (splash_state.splash_device)
++ return;
++
++
++ /* Register platform device to export user API */
++ ret = platform_driver_register(&splash_driver);
++ if (ret) {
++ pr_err("platform_driver_register() failed: %d\n", ret);
++ goto err;
+ }
- }
-
-
-@@ -227,6 +268,14 @@ ATTRIBUTE_GROUPS(splash_dev);
- */
- static int splash_resume(struct device *device)
- {
-+ /*
-+ * Force full redraw on resume since we've probably lost the
-+ * framebuffer's contents meanwhile
-+ */
-+ mutex_lock(&splash_state.data_lock);
-+ splash_state.splash_fb = NULL;
-+ mutex_unlock(&splash_state.data_lock);
+
- if (bootsplash_would_render_now())
- schedule_work(&splash_state.work_redraw_vc);
-
-@@ -235,6 +284,7 @@ static int splash_resume(struct device *device)
-
- static int splash_suspend(struct device *device)
- {
-+ cancel_delayed_work_sync(&splash_state.dwork_animation);
- cancel_work_sync(&splash_state.work_redraw_vc);
-
- return 0;
-@@ -296,6 +346,8 @@ void bootsplash_init(void)
- set_bit(0, &splash_state.enabled);
-
- INIT_WORK(&splash_state.work_redraw_vc, splash_callback_redraw_vc);
-+ INIT_DELAYED_WORK(&splash_state.dwork_animation,
-+ splash_callback_animation);
-
-
- if (!splash_state.bootfile || !strlen(splash_state.bootfile))
++ splash_state.splash_device
++ = platform_device_alloc("bootsplash", 0);
++
++ if (!splash_state.splash_device)
++ goto err_driver;
++
++ splash_state.splash_device->dev.groups = splash_dev_groups;
++
++ ret = platform_device_add(splash_state.splash_device);
++ if (ret) {
++ pr_err("platform_device_add() failed: %d\n", ret);
++ goto err_device;
++ }
++
++
++ INIT_WORK(&splash_state.work_redraw_vc, splash_callback_redraw_vc);
++
++ return;
++
++err_device:
++ platform_device_put(splash_state.splash_device);
++ splash_state.splash_device = NULL;
++err_driver:
++ platform_driver_unregister(&splash_driver);
++err:
++ pr_err("Failed to initialize.\n");
++}
diff --git a/drivers/video/fbdev/core/bootsplash_internal.h b/drivers/video/fbdev/core/bootsplash_internal.h
-index 0acb383aa4e3..b3a74835d90f 100644
---- a/drivers/video/fbdev/core/bootsplash_internal.h
+new file mode 100644
+index 000000000000..b11da5cb90bf
+--- /dev/null
+++ b/drivers/video/fbdev/core/bootsplash_internal.h
-@@ -37,6 +37,8 @@ struct splash_pic_priv {
-
- struct splash_blob_priv *blobs;
- u16 blobs_loaded;
+@@ -0,0 +1,55 @@
++/*
++ * Kernel based bootsplash.
++ *
++ * (Internal data structures used at runtime)
++ *
++ * Authors:
++ * Max Staudt <mstaudt@suse.de>
++ *
++ * SPDX-License-Identifier: GPL-2.0
++ */
+
-+ u16 anim_nextframe;
- };
-
-
-@@ -45,6 +47,12 @@ struct splash_file_priv {
- const struct splash_file_header *header;
-
- struct splash_pic_priv *pics;
++#ifndef __BOOTSPLASH_INTERNAL_H
++#define __BOOTSPLASH_INTERNAL_H
++
++
++#include <linux/types.h>
++#include <linux/fb.h>
++#include <linux/kernel.h>
++#include <linux/mutex.h>
++#include <linux/spinlock.h>
+
++
++/*
++ * Runtime types
++ */
++struct splash_priv {
+ /*
-+ * A local copy of the frame delay in the header.
-+ * We modify it to keep the code simple.
++ * Enabled/disabled state, to be used with atomic bit operations.
++ * Bit 0: 0 = Splash hidden
++ * 1 = Splash shown
++ *
++ * Note: fbcon.c uses this twice, by calling
++ * bootsplash_would_render_now() in set_blitting_type() and
++ * in fbcon_switch().
++ * This is racy, but eventually consistent: Turning the
++ * splash on/off will cause a redraw, which calls
++ * fbcon_switch(), which calls set_blitting_type().
++ * So the last on/off toggle will make things consistent.
+ */
-+ u16 frame_ms;
- };
-
-
-@@ -71,6 +79,7 @@ struct splash_priv {
- struct platform_device *splash_device;
-
- struct work_struct work_redraw_vc;
-+ struct delayed_work dwork_animation;
-
- /* Splash data structures including lock for everything below */
- struct mutex data_lock;
-@@ -88,8 +97,10 @@ struct splash_priv {
- void bootsplash_do_render_background(struct fb_info *info,
- const struct splash_file_priv *fp);
- void bootsplash_do_render_pictures(struct fb_info *info,
-- const struct splash_file_priv *fp);
-+ const struct splash_file_priv *fp,
-+ bool is_update);
- void bootsplash_do_render_flush(struct fb_info *info);
-+void bootsplash_do_step_animations(struct splash_file_priv *fp);
-
-
- void bootsplash_free_file(struct splash_file_priv *fp);
-diff --git a/drivers/video/fbdev/core/bootsplash_load.c b/drivers/video/fbdev/core/bootsplash_load.c
-index fd807571ab7d..1f661b2d4cc9 100644
---- a/drivers/video/fbdev/core/bootsplash_load.c
-+++ b/drivers/video/fbdev/core/bootsplash_load.c
-@@ -71,6 +71,7 @@ struct splash_file_priv *bootsplash_load_firmware(struct device *device,
- {
- const struct firmware *fw;
- struct splash_file_priv *fp;
-+ bool have_anim = false;
- unsigned int i;
- const u8 *walker;
-
-@@ -135,6 +136,13 @@ struct splash_file_priv *bootsplash_load_firmware(struct device *device,
- goto err;
- }
-
-+ if (ph->anim_type > SPLASH_ANIM_LOOP_FORWARD) {
-+ pr_warn("Picture %u: Unsupported animation type %u.\n",
-+ i, ph->anim_type);
++ unsigned long enabled;
+
-+ ph->anim_type = SPLASH_ANIM_NONE;
-+ }
++ /* Our gateway to userland via sysfs */
++ struct platform_device *splash_device;
++
++ struct work_struct work_redraw_vc;
++};
+
- pp->pic_header = ph;
- pp->blobs = vzalloc(ph->num_blobs
- * sizeof(struct splash_blob_priv));
-@@ -202,6 +210,7 @@ struct splash_file_priv *bootsplash_load_firmware(struct device *device,
- /* Walk over pictures and ensure all blob slots are filled */
- for (i = 0; i < fp->header->num_pics; i++) {
- struct splash_pic_priv *pp = &fp->pics[i];
-+ const struct splash_pic_header *ph = pp->pic_header;
-
- if (pp->blobs_loaded != pp->pic_header->num_blobs) {
- pr_err("Picture %u doesn't have all blob slots filled.\n",
-@@ -209,8 +218,20 @@ struct splash_file_priv *bootsplash_load_firmware(struct device *device,
-
- goto err;
- }
+
-+ if (ph->anim_type
-+ && ph->num_blobs > 1
-+ && ph->anim_loop < pp->blobs_loaded)
-+ have_anim = true;
- }
-
-+ if (!have_anim)
-+ /* Disable animation timer if there is nothing to animate */
-+ fp->frame_ms = 0;
-+ else
-+ /* Enforce minimum delay between frames */
-+ fp->frame_ms = max((u16)20, fp->header->frame_ms);
+
- pr_info("Loaded (%ld bytes, %u pics, %u blobs).\n",
- fw->size,
- fp->header->num_pics,
++/*
++ * Rendering functions
++ */
++void bootsplash_do_render_background(struct fb_info *info);
++
++#endif
diff --git a/drivers/video/fbdev/core/bootsplash_render.c b/drivers/video/fbdev/core/bootsplash_render.c
-index 07e3a4eab811..76033606ca8a 100644
---- a/drivers/video/fbdev/core/bootsplash_render.c
+new file mode 100644
+index 000000000000..4d7e0117f653
+--- /dev/null
+++ b/drivers/video/fbdev/core/bootsplash_render.c
-@@ -148,7 +148,8 @@ void bootsplash_do_render_background(struct fb_info *info,
-
-
- void bootsplash_do_render_pictures(struct fb_info *info,
-- const struct splash_file_priv *fp)
-+ const struct splash_file_priv *fp,
-+ bool is_update)
- {
- unsigned int i;
-
-@@ -161,7 +162,11 @@ void bootsplash_do_render_pictures(struct fb_info *info,
- if (pp->blobs_loaded < 1)
- continue;
-
-- bp = &pp->blobs[0];
-+ /* Skip static pictures when refreshing animations */
-+ if (ph->anim_type == SPLASH_ANIM_NONE && is_update)
-+ continue;
+@@ -0,0 +1,93 @@
++/*
++ * Kernel based bootsplash.
++ *
++ * (Rendering functions)
++ *
++ * Authors:
++ * Max Staudt <mstaudt@suse.de>
++ *
++ * SPDX-License-Identifier: GPL-2.0
++ */
+
-+ bp = &pp->blobs[pp->anim_nextframe];
-
- if (!bp || bp->blob_header->type != 0)
- continue;
-@@ -351,3 +356,24 @@ void bootsplash_do_render_flush(struct fb_info *info)
- info->fbops->fb_copyarea(info, &area);
- }
- }
++#define pr_fmt(fmt) "bootsplash: " fmt
++
++
++#include <linux/bootsplash.h>
++#include <linux/fb.h>
++#include <linux/kernel.h>
++#include <linux/printk.h>
++#include <linux/types.h>
++
++#include "bootsplash_internal.h"
++
++
++
++
++/*
++ * Rendering: Internal drawing routines
++ */
++
++
++/*
++ * Pack pixel into target format and do Big/Little Endian handling.
++ * This would be a good place to handle endianness conversion if necessary.
++ */
++static inline u32 pack_pixel(const struct fb_var_screeninfo *dst_var,
++ u8 red, u8 green, u8 blue)
++{
++ u32 dstpix;
++
++ /* Quantize pixel */
++ red = red >> (8 - dst_var->red.length);
++ green = green >> (8 - dst_var->green.length);
++ blue = blue >> (8 - dst_var->blue.length);
++
++ /* Pack pixel */
++ dstpix = red << (dst_var->red.offset)
++ | green << (dst_var->green.offset)
++ | blue << (dst_var->blue.offset);
++
++ /*
++ * Move packed pixel to the beginning of the memory cell,
++ * so we can memcpy() it out easily
++ */
++#ifdef __BIG_ENDIAN
++ switch (dst_var->bits_per_pixel) {
++ case 16:
++ dstpix <<= 16;
++ break;
++ case 24:
++ dstpix <<= 8;
++ break;
++ case 32:
++ break;
++ }
++#else
++ /* This is intrinsically unnecessary on Little Endian */
++#endif
+
++ return dstpix;
++}
+
-+void bootsplash_do_step_animations(struct splash_file_priv *fp)
++
++void bootsplash_do_render_background(struct fb_info *info)
+{
-+ unsigned int i;
++ unsigned int x, y;
++ u32 dstpix;
++ u32 dst_octpp = info->var.bits_per_pixel / 8;
++
++ dstpix = pack_pixel(&info->var,
++ 0,
++ 0,
++ 0);
+
-+ /* Step every animation once */
-+ for (i = 0; i < fp->header->num_pics; i++) {
-+ struct splash_pic_priv *pp = &fp->pics[i];
++ for (y = 0; y < info->var.yres_virtual; y++) {
++ u8 *dstline = info->screen_buffer + (y * info->fix.line_length);
+
-+ if (pp->blobs_loaded < 2
-+ || pp->pic_header->anim_loop > pp->blobs_loaded)
-+ continue;
++ for (x = 0; x < info->var.xres_virtual; x++) {
++ memcpy(dstline, &dstpix, dst_octpp);
+
-+ if (pp->pic_header->anim_type == SPLASH_ANIM_LOOP_FORWARD) {
-+ pp->anim_nextframe++;
-+ if (pp->anim_nextframe >= pp->pic_header->num_blobs)
-+ pp->anim_nextframe = pp->pic_header->anim_loop;
++ dstline += dst_octpp;
+ }
+ }
+}
-diff --git a/include/uapi/linux/bootsplash_file.h b/include/uapi/linux/bootsplash_file.h
-index 71cedcc68933..b3af0a3c6487 100644
---- a/include/uapi/linux/bootsplash_file.h
-+++ b/include/uapi/linux/bootsplash_file.h
-@@ -77,7 +77,17 @@ struct splash_file_header {
- uint16_t num_blobs;
- uint8_t num_pics;
-
-- uint8_t padding[103];
-+ uint8_t unused_1;
+diff --git a/drivers/video/fbdev/core/dummyblit.c b/drivers/video/fbdev/core/dummyblit.c
+new file mode 100644
+index 000000000000..8c22ff92ce24
+--- /dev/null
++++ b/drivers/video/fbdev/core/dummyblit.c
+@@ -0,0 +1,89 @@
++/*
++ * linux/drivers/video/fbdev/core/dummyblit.c -- Dummy Blitting Operation
++ *
++ * Authors:
++ * Max Staudt <mstaudt@suse.de>
++ *
++ * These functions are used in place of blitblit/tileblit to suppress
++ * fbcon's text output while a splash is shown.
++ *
++ * Only suppressing actual rendering keeps the text buffer in the VC layer
++ * intact and makes it easy to switch back from the bootsplash to a full
++ * text console with a simple redraw (with the original functions in place).
++ *
++ * Based on linux/drivers/video/fbdev/core/bitblit.c
++ * and linux/drivers/video/fbdev/core/tileblit.c
++ *
++ * SPDX-License-Identifier: GPL-2.0
++ */
++
++#include <linux/module.h>
++#include <linux/fb.h>
++#include <linux/vt_kern.h>
++#include <linux/console.h>
++#include <asm/types.h>
++#include "fbcon.h"
++
++static void dummy_bmove(struct vc_data *vc, struct fb_info *info, int sy,
++ int sx, int dy, int dx, int height, int width)
++{
++ ;
++}
++
++static void dummy_clear(struct vc_data *vc, struct fb_info *info, int sy,
++ int sx, int height, int width)
++{
++ ;
++}
+
++static void dummy_putcs(struct vc_data *vc, struct fb_info *info,
++ const unsigned short *s, int count, int yy, int xx,
++ int fg, int bg)
++{
++ ;
++}
++
++static void dummy_clear_margins(struct vc_data *vc, struct fb_info *info,
++ int color, int bottom_only)
++{
++ ;
++}
++
++static void dummy_cursor(struct vc_data *vc, struct fb_info *info, int mode,
++ int softback_lines, int fg, int bg)
++{
++ ;
++}
++
++static int dummy_update_start(struct fb_info *info)
++{
+ /*
-+ * Milliseconds to wait before painting the next frame in
-+ * an animation.
-+ * This is actually a minimum, as the system is allowed to
-+ * stall for longer between frames.
++ * Copied from bitblit.c and tileblit.c
++ *
++ * As of Linux 4.12, nobody seems to care about our return value.
+ */
-+ uint16_t frame_ms;
++ struct fbcon_ops *ops = info->fbcon_par;
++ int err;
+
-+ uint8_t padding[100];
- } __attribute__((__packed__));
-
++ err = fb_pan_display(info, &ops->var);
++ ops->var.xoffset = info->var.xoffset;
++ ops->var.yoffset = info->var.yoffset;
++ ops->var.vmode = info->var.vmode;
++ return err;
++}
++
++void fbcon_set_dummyops(struct fbcon_ops *ops)
++{
++ ops->bmove = dummy_bmove;
++ ops->clear = dummy_clear;
++ ops->putcs = dummy_putcs;
++ ops->clear_margins = dummy_clear_margins;
++ ops->cursor = dummy_cursor;
++ ops->update_start = dummy_update_start;
++ ops->rotate_font = NULL;
++}
++EXPORT_SYMBOL_GPL(fbcon_set_dummyops);
++
++MODULE_AUTHOR("Max Staudt <mstaudt@suse.de>");
++MODULE_DESCRIPTION("Dummy Blitting Operation");
++MODULE_LICENSE("GPL");
+diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
+index 04612f938bab..9a39a6fcfe98 100644
+--- a/drivers/video/fbdev/core/fbcon.c
++++ b/drivers/video/fbdev/core/fbcon.c
+@@ -80,6 +80,7 @@
+ #include <asm/irq.h>
+
+ #include "fbcon.h"
++#include <linux/bootsplash.h>
+
+ #ifdef FBCONDEBUG
+ # define DPRINTK(fmt, args...) printk(KERN_DEBUG "%s: " fmt, __func__ , ## args)
+@@ -542,6 +543,8 @@ static int do_fbcon_takeover(int show_logo)
+ for (i = first_fb_vc; i <= last_fb_vc; i++)
+ con2fb_map[i] = info_idx;
+
++ bootsplash_init();
++
+ err = do_take_over_console(&fb_con, first_fb_vc, last_fb_vc,
+ fbcon_is_default);
-@@ -116,7 +126,23 @@ struct splash_pic_header {
- */
- uint16_t position_offset;
+@@ -661,6 +664,9 @@ static void set_blitting_type(struct vc_data *vc, struct fb_info *info)
+ else {
+ fbcon_set_rotation(info);
+ fbcon_set_bitops(ops);
++
++ if (bootsplash_would_render_now())
++ fbcon_set_dummyops(ops);
+ }
+ }
-- uint8_t padding[24];
-+ /*
-+ * Animation type.
-+ * 0 - off
-+ * 1 - forward loop
-+ */
-+ uint8_t anim_type;
+@@ -683,6 +689,19 @@ static void set_blitting_type(struct vc_data *vc, struct fb_info *info)
+ ops->p = &fb_display[vc->vc_num];
+ fbcon_set_rotation(info);
+ fbcon_set_bitops(ops);
+
+ /*
-+ * Animation loop point.
-+ * Actual meaning depends on animation type:
-+ * Type 0 - Unused
-+ * 1 - Frame at which to restart the forward loop
-+ * (allowing for "intro" frames)
++ * Note:
++ * This is *eventually correct*.
++ * Setting the fbcon operations and drawing the splash happen at
++ * different points in time. If the splash is enabled/disabled
++ * in between, then bootsplash_{en,dis}able will schedule a
++ * redraw, which will again render the splash (or not) and set
++ * the correct fbcon ops.
++ * The last run will then be the right one.
+ */
-+ uint8_t anim_loop;
-+
-+ uint8_t padding[22];
- } __attribute__((__packed__));
-
++ if (bootsplash_would_render_now())
++ fbcon_set_dummyops(ops);
+ }
-@@ -158,4 +184,9 @@ enum splash_position {
- SPLASH_POS_FLAG_CORNER = 0x10,
- };
+ static int fbcon_invalid_charcount(struct fb_info *info, unsigned charcount)
+@@ -2184,6 +2203,9 @@ static int fbcon_switch(struct vc_data *vc)
+ info = registered_fb[con2fb_map[vc->vc_num]];
+ ops = info->fbcon_par;
-+enum splash_anim_type {
-+ SPLASH_ANIM_NONE = 0,
-+ SPLASH_ANIM_LOOP_FORWARD = 1,
-+};
++ if (bootsplash_would_render_now())
++ bootsplash_render_full(info);
+
+ if (softback_top) {
+ if (softback_lines)
+ fbcon_set_origin(vc);
+diff --git a/drivers/video/fbdev/core/fbcon.h b/drivers/video/fbdev/core/fbcon.h
+index 18f3ac144237..45f94347fe5e 100644
+--- a/drivers/video/fbdev/core/fbcon.h
++++ b/drivers/video/fbdev/core/fbcon.h
+@@ -214,6 +214,11 @@ static inline int attr_col_ec(int shift, struct vc_data *vc,
+ #define SCROLL_REDRAW 0x004
+ #define SCROLL_PAN_REDRAW 0x005
+
++#ifdef CONFIG_BOOTSPLASH
++extern void fbcon_set_dummyops(struct fbcon_ops *ops);
++#else /* CONFIG_BOOTSPLASH */
++#define fbcon_set_dummyops(x)
++#endif /* CONFIG_BOOTSPLASH */
+ #ifdef CONFIG_FB_TILEBLITTING
+ extern void fbcon_set_tileops(struct vc_data *vc, struct fb_info *info);
#endif
+diff --git a/include/linux/bootsplash.h b/include/linux/bootsplash.h
+new file mode 100644
+index 000000000000..c6dd0b43180d
+--- /dev/null
++++ b/include/linux/bootsplash.h
+@@ -0,0 +1,43 @@
++/*
++ * Kernel based bootsplash.
++ *
++ * Authors:
++ * Max Staudt <mstaudt@suse.de>
++ *
++ * SPDX-License-Identifier: GPL-2.0
++ */
++
++#ifndef __LINUX_BOOTSPLASH_H
++#define __LINUX_BOOTSPLASH_H
++
++#include <linux/fb.h>
++
++
++#ifdef CONFIG_BOOTSPLASH
++
++extern void bootsplash_render_full(struct fb_info *info);
++
++extern bool bootsplash_would_render_now(void);
++
++extern bool bootsplash_is_enabled(void);
++extern void bootsplash_disable(void);
++extern void bootsplash_enable(void);
++
++extern void bootsplash_init(void);
++
++#else /* CONFIG_BOOTSPLASH */
++
++#define bootsplash_render_full(x)
++
++#define bootsplash_would_render_now() (false)
++
++#define bootsplash_is_enabled() (false)
++#define bootsplash_disable()
++#define bootsplash_enable()
++
++#define bootsplash_init()
++
++#endif /* CONFIG_BOOTSPLASH */
++
++
++#endif
diff --git a/0008-bootsplash.patch b/0008-bootsplash.patch
index d6c6db659c56..92d62caa7031 100644..100755
--- a/0008-bootsplash.patch
+++ b/0008-bootsplash.patch
@@ -1,82 +1,669 @@
-diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
-index 2ebaba16f785..416735ab6dc1 100644
---- a/drivers/tty/vt/vt.c
-+++ b/drivers/tty/vt/vt.c
-@@ -105,6 +105,7 @@
- #include <linux/ctype.h>
- #include <linux/bsearch.h>
- #include <linux/gcd.h>
-+#include <linux/bootsplash.h>
-
- #define MAX_NR_CON_DRIVER 16
+diff --git a/MAINTAINERS b/MAINTAINERS
+index b5633b56391e..5c237445761e 100644
+--- a/MAINTAINERS
++++ b/MAINTAINERS
+@@ -2712,6 +2712,7 @@ S: Maintained
+ F: drivers/video/fbdev/core/bootsplash*.*
+ F: drivers/video/fbdev/core/dummycon.c
+ F: include/linux/bootsplash.h
++F: include/uapi/linux/bootsplash_file.h
-@@ -4235,6 +4236,7 @@ void do_unblank_screen(int leaving_gfx)
- }
+ BPF (Safe dynamic programs and tools)
+ M: Alexei Starovoitov <ast@kernel.org>
+diff --git a/drivers/video/fbdev/core/Makefile b/drivers/video/fbdev/core/Makefile
+index 66895321928e..6a8d1bab8a01 100644
+--- a/drivers/video/fbdev/core/Makefile
++++ b/drivers/video/fbdev/core/Makefile
+@@ -31,4 +31,4 @@ obj-$(CONFIG_FB_SVGALIB) += svgalib.o
+ obj-$(CONFIG_FB_DDC) += fb_ddc.o
- console_blanked = 0;
-+ bootsplash_mark_dirty();
- if (vc->vc_sw->con_blank(vc, 0, leaving_gfx))
- /* Low-level driver cannot restore -> do it ourselves */
- update_screen(vc);
+ obj-$(CONFIG_BOOTSPLASH) += bootsplash.o bootsplash_render.o \
+- dummyblit.o
++ bootsplash_load.o dummyblit.o
diff --git a/drivers/video/fbdev/core/bootsplash.c b/drivers/video/fbdev/core/bootsplash.c
-index c8642142cfea..13fcaabbc2ca 100644
+index e449755af268..843c5400fefc 100644
--- a/drivers/video/fbdev/core/bootsplash.c
+++ b/drivers/video/fbdev/core/bootsplash.c
-@@ -165,6 +165,13 @@ bool bootsplash_would_render_now(void)
+@@ -32,6 +32,7 @@
+ #include <linux/workqueue.h>
+
+ #include "bootsplash_internal.h"
++#include "uapi/linux/bootsplash_file.h"
+
+
+ /*
+@@ -102,10 +103,17 @@ static bool is_fb_compatible(const struct fb_info *info)
+ */
+ void bootsplash_render_full(struct fb_info *info)
+ {
++ mutex_lock(&splash_state.data_lock);
++
+ if (!is_fb_compatible(info))
+- return;
++ goto out;
++
++ bootsplash_do_render_background(info, splash_state.file);
++
++ bootsplash_do_render_pictures(info, splash_state.file);
+
+- bootsplash_do_render_background(info);
++out:
++ mutex_unlock(&splash_state.data_lock);
+ }
+
+
+@@ -116,6 +124,7 @@ bool bootsplash_would_render_now(void)
+ {
+ return !oops_in_progress
+ && !console_blanked
++ && splash_state.file
&& bootsplash_is_enabled();
}
-+void bootsplash_mark_dirty(void)
-+{
+@@ -252,6 +261,7 @@ static struct platform_driver splash_driver = {
+ void bootsplash_init(void)
+ {
+ int ret;
++ struct splash_file_priv *fp;
+
+ /* Initialized already? */
+ if (splash_state.splash_device)
+@@ -280,8 +290,26 @@ void bootsplash_init(void)
+ }
+
+
++ mutex_init(&splash_state.data_lock);
++ set_bit(0, &splash_state.enabled);
++
+ INIT_WORK(&splash_state.work_redraw_vc, splash_callback_redraw_vc);
+
++
++ if (!splash_state.bootfile || !strlen(splash_state.bootfile))
++ return;
++
++ fp = bootsplash_load_firmware(&splash_state.splash_device->dev,
++ splash_state.bootfile);
++
++ if (!fp)
++ goto err;
++
+ mutex_lock(&splash_state.data_lock);
+ splash_state.splash_fb = NULL;
++ splash_state.file = fp;
+ mutex_unlock(&splash_state.data_lock);
++
+ return;
+
+ err_device:
+@@ -292,3 +320,7 @@ void bootsplash_init(void)
+ err:
+ pr_err("Failed to initialize.\n");
+ }
++
++
++module_param_named(bootfile, splash_state.bootfile, charp, 0444);
++MODULE_PARM_DESC(bootfile, "Bootsplash file to load on boot");
+diff --git a/drivers/video/fbdev/core/bootsplash_internal.h b/drivers/video/fbdev/core/bootsplash_internal.h
+index b11da5cb90bf..71e2a27ac0b8 100644
+--- a/drivers/video/fbdev/core/bootsplash_internal.h
++++ b/drivers/video/fbdev/core/bootsplash_internal.h
+@@ -15,15 +15,43 @@
+
+ #include <linux/types.h>
+ #include <linux/fb.h>
++#include <linux/firmware.h>
+ #include <linux/kernel.h>
+ #include <linux/mutex.h>
+ #include <linux/spinlock.h>
+
++#include "uapi/linux/bootsplash_file.h"
++
+
+ /*
+ * Runtime types
+ */
++struct splash_blob_priv {
++ struct splash_blob_header *blob_header;
++ const void *data;
++};
++
++
++struct splash_pic_priv {
++ const struct splash_pic_header *pic_header;
++
++ struct splash_blob_priv *blobs;
++ u16 blobs_loaded;
++};
++
++
++struct splash_file_priv {
++ const struct firmware *fw;
++ const struct splash_file_header *header;
++
++ struct splash_pic_priv *pics;
++};
++
++
+ struct splash_priv {
++ /* Bootup and runtime state */
++ char *bootfile;
++
+ /*
+ * Enabled/disabled state, to be used with atomic bit operations.
+ * Bit 0: 0 = Splash hidden
+@@ -43,6 +71,13 @@ struct splash_priv {
+ struct platform_device *splash_device;
+
+ struct work_struct work_redraw_vc;
++
++ /* Splash data structures including lock for everything below */
++ struct mutex data_lock;
++
++ struct fb_info *splash_fb;
++
++ struct splash_file_priv *file;
+ };
+
+
+@@ -50,6 +85,14 @@ struct splash_priv {
+ /*
+ * Rendering functions
+ */
+-void bootsplash_do_render_background(struct fb_info *info);
++void bootsplash_do_render_background(struct fb_info *info,
++ const struct splash_file_priv *fp);
++void bootsplash_do_render_pictures(struct fb_info *info,
++ const struct splash_file_priv *fp);
++
++
++void bootsplash_free_file(struct splash_file_priv *fp);
++struct splash_file_priv *bootsplash_load_firmware(struct device *device,
++ const char *path);
+
+ #endif
+diff --git a/drivers/video/fbdev/core/bootsplash_load.c b/drivers/video/fbdev/core/bootsplash_load.c
+new file mode 100644
+index 000000000000..fd807571ab7d
+--- /dev/null
++++ b/drivers/video/fbdev/core/bootsplash_load.c
+@@ -0,0 +1,225 @@
++/*
++ * Kernel based bootsplash.
++ *
++ * (Loading and freeing functions)
++ *
++ * Authors:
++ * Max Staudt <mstaudt@suse.de>
++ *
++ * SPDX-License-Identifier: GPL-2.0
++ */
++
++#define pr_fmt(fmt) "bootsplash: " fmt
++
++
++#include <linux/bootsplash.h>
++#include <linux/fb.h>
++#include <linux/firmware.h>
++#include <linux/kernel.h>
++#include <linux/mutex.h>
++#include <linux/printk.h>
++#include <linux/types.h>
++#include <linux/vmalloc.h>
++
++#include "bootsplash_internal.h"
++#include "uapi/linux/bootsplash_file.h"
++
++
++
++
++/*
++ * Free all vmalloc()'d resources describing a splash file.
++ */
++void bootsplash_free_file(struct splash_file_priv *fp)
++{
++ if (!fp)
++ return;
++
++ if (fp->pics) {
++ unsigned int i;
++
++ for (i = 0; i < fp->header->num_pics; i++) {
++ struct splash_pic_priv *pp = &fp->pics[i];
++
++ if (pp->blobs)
++ vfree(pp->blobs);
++ }
++
++ vfree(fp->pics);
++ }
++
++ release_firmware(fp->fw);
++ vfree(fp);
++}
++
++
++
++
++/*
++ * Load a splash screen from a "firmware" file.
++ *
++ * Parsing, and sanity checks.
++ */
++#ifdef __BIG_ENDIAN
++ #define BOOTSPLASH_MAGIC BOOTSPLASH_MAGIC_BE
++#else
++ #define BOOTSPLASH_MAGIC BOOTSPLASH_MAGIC_LE
++#endif
++
++struct splash_file_priv *bootsplash_load_firmware(struct device *device,
++ const char *path)
++{
++ const struct firmware *fw;
++ struct splash_file_priv *fp;
++ unsigned int i;
++ const u8 *walker;
++
++ if (request_firmware(&fw, path, device))
++ return NULL;
++
++ if (fw->size < sizeof(struct splash_file_header)
++ || memcmp(fw->data, BOOTSPLASH_MAGIC, sizeof(fp->header->id))) {
++ pr_err("Not a bootsplash file.\n");
++
++ release_firmware(fw);
++ return NULL;
++ }
++
++ fp = vzalloc(sizeof(struct splash_file_priv));
++ if (!fp) {
++ release_firmware(fw);
++ return NULL;
++ }
++
++ pr_info("Loading splash file (%li bytes)\n", fw->size);
++
++ fp->fw = fw;
++ fp->header = (struct splash_file_header *)fw->data;
++
++ /* Sanity checks */
++ if (fp->header->version != BOOTSPLASH_VERSION) {
++ pr_err("Loaded v%d file, but we only support version %d\n",
++ fp->header->version,
++ BOOTSPLASH_VERSION);
++
++ goto err;
++ }
++
++ if (fw->size < sizeof(struct splash_file_header)
++ + fp->header->num_pics
++ * sizeof(struct splash_pic_header)
++ + fp->header->num_blobs
++ * sizeof(struct splash_blob_header)) {
++ pr_err("File incomplete.\n");
++
++ goto err;
++ }
++
++ /* Read picture headers */
++ if (fp->header->num_pics) {
++ fp->pics = vzalloc(fp->header->num_pics
++ * sizeof(struct splash_pic_priv));
++ if (!fp->pics)
++ goto err;
++ }
++
++ walker = fw->data + sizeof(struct splash_file_header);
++ for (i = 0; i < fp->header->num_pics; i++) {
++ struct splash_pic_priv *pp = &fp->pics[i];
++ struct splash_pic_header *ph = (void *)walker;
++
++ pr_debug("Picture %u: Size %ux%u\n", i, ph->width, ph->height);
++
++ if (ph->num_blobs < 1) {
++ pr_err("Picture %u: Zero blobs? Aborting load.\n", i);
++ goto err;
++ }
++
++ pp->pic_header = ph;
++ pp->blobs = vzalloc(ph->num_blobs
++ * sizeof(struct splash_blob_priv));
++ if (!pp->blobs)
++ goto err;
++
++ walker += sizeof(struct splash_pic_header);
++ }
++
++ /* Read blob headers */
++ for (i = 0; i < fp->header->num_blobs; i++) {
++ struct splash_blob_header *bh = (void *)walker;
++ struct splash_pic_priv *pp;
++
++ if (walker + sizeof(struct splash_blob_header)
++ > fw->data + fw->size)
++ goto err;
++
++ walker += sizeof(struct splash_blob_header);
++
++ if (walker + bh->length > fw->data + fw->size)
++ goto err;
++
++ if (bh->picture_id >= fp->header->num_pics)
++ goto nextblob;
++
++ pp = &fp->pics[bh->picture_id];
++
++ pr_debug("Blob %u, pic %u, blobs_loaded %u, num_blobs %u.\n",
++ i, bh->picture_id,
++ pp->blobs_loaded, pp->pic_header->num_blobs);
++
++ if (pp->blobs_loaded >= pp->pic_header->num_blobs)
++ goto nextblob;
++
++ switch (bh->type) {
++ case 0:
++ /* Raw 24-bit packed pixels */
++ if (bh->length != pp->pic_header->width
++ * pp->pic_header->height * 3) {
++ pr_err("Blob %u, type 1: Length doesn't match picture.\n",
++ i);
++
++ goto err;
++ }
++ break;
++ default:
++ pr_warn("Blob %u, unknown type %u.\n", i, bh->type);
++ goto nextblob;
++ }
++
++ pp->blobs[pp->blobs_loaded].blob_header = bh;
++ pp->blobs[pp->blobs_loaded].data = walker;
++ pp->blobs_loaded++;
++
++nextblob:
++ walker += bh->length;
++ if (bh->length % 16)
++ walker += 16 - (bh->length % 16);
++ }
++
++ if (walker != fw->data + fw->size)
++ pr_warn("Trailing data in splash file.\n");
++
++ /* Walk over pictures and ensure all blob slots are filled */
++ for (i = 0; i < fp->header->num_pics; i++) {
++ struct splash_pic_priv *pp = &fp->pics[i];
++
++ if (pp->blobs_loaded != pp->pic_header->num_blobs) {
++ pr_err("Picture %u doesn't have all blob slots filled.\n",
++ i);
++
++ goto err;
++ }
++ }
++
++ pr_info("Loaded (%ld bytes, %u pics, %u blobs).\n",
++ fw->size,
++ fp->header->num_pics,
++ fp->header->num_blobs);
++
++ return fp;
++
++
++err:
++ bootsplash_free_file(fp);
++ return NULL;
+}
+diff --git a/drivers/video/fbdev/core/bootsplash_render.c b/drivers/video/fbdev/core/bootsplash_render.c
+index 4d7e0117f653..2ae36949d0e3 100644
+--- a/drivers/video/fbdev/core/bootsplash_render.c
++++ b/drivers/video/fbdev/core/bootsplash_render.c
+@@ -19,6 +19,7 @@
+ #include <linux/types.h>
+
+ #include "bootsplash_internal.h"
++#include "uapi/linux/bootsplash_file.h"
+
+
+
+@@ -70,16 +71,69 @@ static inline u32 pack_pixel(const struct fb_var_screeninfo *dst_var,
+ }
+
+
+-void bootsplash_do_render_background(struct fb_info *info)
++/*
++ * Copy from source and blend into the destination picture.
++ * Currently assumes that the source picture is 24bpp.
++ * Currently assumes that the destination is <= 32bpp.
++ */
++static int splash_convert_to_fb(u8 *dst,
++ const struct fb_var_screeninfo *dst_var,
++ unsigned int dst_stride,
++ unsigned int dst_xoff,
++ unsigned int dst_yoff,
++ const u8 *src,
++ unsigned int src_width,
++ unsigned int src_height)
++{
++ unsigned int x, y;
++ unsigned int src_stride = 3 * src_width; /* Assume 24bpp packed */
++ u32 dst_octpp = dst_var->bits_per_pixel / 8;
++
++ dst_xoff += dst_var->xoffset;
++ dst_yoff += dst_var->yoffset;
++
++ /* Copy with stride and pixel size adjustment */
++ for (y = 0;
++ y < src_height && y + dst_yoff < dst_var->yres_virtual;
++ y++) {
++ const u8 *srcline = src + (y * src_stride);
++ u8 *dstline = dst + ((y + dst_yoff) * dst_stride)
++ + (dst_xoff * dst_octpp);
++
++ for (x = 0;
++ x < src_width && x + dst_xoff < dst_var->xres_virtual;
++ x++) {
++ u8 red, green, blue;
++ u32 dstpix;
+
- bool bootsplash_is_enabled(void)
++ /* Read pixel */
++ red = *srcline++;
++ green = *srcline++;
++ blue = *srcline++;
++
++ /* Write pixel */
++ dstpix = pack_pixel(dst_var, red, green, blue);
++ memcpy(dstline, &dstpix, dst_octpp);
++
++ dstline += dst_octpp;
++ }
++ }
++
++ return 0;
++}
++
++
++void bootsplash_do_render_background(struct fb_info *info,
++ const struct splash_file_priv *fp)
{
- bool was_enabled;
-@@ -206,9 +213,7 @@ void bootsplash_enable(void)
+ unsigned int x, y;
+ u32 dstpix;
+ u32 dst_octpp = info->var.bits_per_pixel / 8;
- if (!was_enabled) {
- /* Force a full redraw when the splash is re-activated */
-- mutex_lock(&splash_state.data_lock);
-- splash_state.splash_fb = NULL;
-- mutex_unlock(&splash_state.data_lock);
-+ bootsplash_mark_dirty();
+ dstpix = pack_pixel(&info->var,
+- 0,
+- 0,
+- 0);
++ fp->header->bg_red,
++ fp->header->bg_green,
++ fp->header->bg_blue);
- schedule_work(&splash_state.work_redraw_vc);
+ for (y = 0; y < info->var.yres_virtual; y++) {
+ u8 *dstline = info->screen_buffer + (y * info->fix.line_length);
+@@ -91,3 +145,44 @@ void bootsplash_do_render_background(struct fb_info *info)
+ }
}
-@@ -272,9 +277,7 @@ static int splash_resume(struct device *device)
- * Force full redraw on resume since we've probably lost the
- * framebuffer's contents meanwhile
- */
-- mutex_lock(&splash_state.data_lock);
-- splash_state.splash_fb = NULL;
-- mutex_unlock(&splash_state.data_lock);
-+ bootsplash_mark_dirty();
-
- if (bootsplash_would_render_now())
- schedule_work(&splash_state.work_redraw_vc);
-diff --git a/include/linux/bootsplash.h b/include/linux/bootsplash.h
-index c6dd0b43180d..4075098aaadd 100644
---- a/include/linux/bootsplash.h
-+++ b/include/linux/bootsplash.h
-@@ -19,6 +19,8 @@ extern void bootsplash_render_full(struct fb_info *info);
-
- extern bool bootsplash_would_render_now(void);
-
-+extern void bootsplash_mark_dirty(void);
-+
- extern bool bootsplash_is_enabled(void);
- extern void bootsplash_disable(void);
- extern void bootsplash_enable(void);
-@@ -31,6 +33,8 @@ extern void bootsplash_init(void);
-
- #define bootsplash_would_render_now() (false)
-
-+#define bootsplash_mark_dirty()
-+
- #define bootsplash_is_enabled() (false)
- #define bootsplash_disable()
- #define bootsplash_enable()
+ }
++
++
++void bootsplash_do_render_pictures(struct fb_info *info,
++ const struct splash_file_priv *fp)
++{
++ unsigned int i;
++
++ for (i = 0; i < fp->header->num_pics; i++) {
++ struct splash_blob_priv *bp;
++ struct splash_pic_priv *pp = &fp->pics[i];
++ long dst_xoff, dst_yoff;
++
++ if (pp->blobs_loaded < 1)
++ continue;
++
++ bp = &pp->blobs[0];
++
++ if (!bp || bp->blob_header->type != 0)
++ continue;
++
++ dst_xoff = (info->var.xres - pp->pic_header->width) / 2;
++ dst_yoff = (info->var.yres - pp->pic_header->height) / 2;
++
++ if (dst_xoff < 0
++ || dst_yoff < 0
++ || dst_xoff + pp->pic_header->width > info->var.xres
++ || dst_yoff + pp->pic_header->height > info->var.yres) {
++ pr_info_once("Picture %u is out of bounds at current resolution: %dx%d\n"
++ "(this will only be printed once every reboot)\n",
++ i, info->var.xres, info->var.yres);
++
++ continue;
++ }
++
++ /* Draw next splash frame */
++ splash_convert_to_fb(info->screen_buffer, &info->var,
++ info->fix.line_length, dst_xoff, dst_yoff,
++ bp->data,
++ pp->pic_header->width, pp->pic_header->height);
++ }
++}
+diff --git a/include/uapi/linux/bootsplash_file.h b/include/uapi/linux/bootsplash_file.h
+new file mode 100644
+index 000000000000..89dc9cca8f0c
+--- /dev/null
++++ b/include/uapi/linux/bootsplash_file.h
+@@ -0,0 +1,118 @@
++/*
++ * Kernel based bootsplash.
++ *
++ * (File format)
++ *
++ * Authors:
++ * Max Staudt <mstaudt@suse.de>
++ *
++ * SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
++ */
++
++#ifndef __BOOTSPLASH_FILE_H
++#define __BOOTSPLASH_FILE_H
++
++
++#define BOOTSPLASH_VERSION 55561
++
++
++#include <linux/kernel.h>
++#include <linux/types.h>
++
++
++/*
++ * On-disk types
++ *
++ * A splash file consists of:
++ * - One single 'struct splash_file_header'
++ * - An array of 'struct splash_pic_header'
++ * - An array of raw data blocks, each padded to 16 bytes and
++ * preceded by a 'struct splash_blob_header'
++ *
++ * A single-frame splash may look like this:
++ *
++ * +--------------------+
++ * | |
++ * | splash_file_header |
++ * | -> num_blobs = 1 |
++ * | -> num_pics = 1 |
++ * | |
++ * +--------------------+
++ * | |
++ * | splash_pic_header |
++ * | |
++ * +--------------------+
++ * | |
++ * | splash_blob_header |
++ * | -> type = 0 |
++ * | -> picture_id = 0 |
++ * | |
++ * | (raw RGB data) |
++ * | (pad to 16 bytes) |
++ * | |
++ * +--------------------+
++ *
++ * All multi-byte values are stored on disk in the native format
++ * expected by the system the file will be used on.
++ */
++#define BOOTSPLASH_MAGIC_BE "Linux bootsplash"
++#define BOOTSPLASH_MAGIC_LE "hsalpstoob xuniL"
++
++struct splash_file_header {
++ uint8_t id[16]; /* "Linux bootsplash" (no trailing NUL) */
++
++ /* Splash file format version to avoid clashes */
++ uint16_t version;
++
++ /* The background color */
++ uint8_t bg_red;
++ uint8_t bg_green;
++ uint8_t bg_blue;
++ uint8_t bg_reserved;
++
++ /*
++ * Number of pic/blobs so we can allocate memory for internal
++ * structures ahead of time when reading the file
++ */
++ uint16_t num_blobs;
++ uint8_t num_pics;
++
++ uint8_t padding[103];
++} __attribute__((__packed__));
++
++
++struct splash_pic_header {
++ uint16_t width;
++ uint16_t height;
++
++ /*
++ * Number of data packages associated with this picture.
++ * Currently, the only use for more than 1 is for animations.
++ */
++ uint8_t num_blobs;
++
++ uint8_t padding[27];
++} __attribute__((__packed__));
++
++
++struct splash_blob_header {
++ /* Length of the data block in bytes. */
++ uint32_t length;
++
++ /*
++ * Type of the contents.
++ * 0 - Raw RGB data.
++ */
++ uint16_t type;
++
++ /*
++ * Picture this blob is associated with.
++ * Blobs will be added to a picture in the order they are
++ * found in the file.
++ */
++ uint8_t picture_id;
++
++ uint8_t padding[9];
++} __attribute__((__packed__));
++
++#endif
diff --git a/0009-bootsplash.patch b/0009-bootsplash.patch
index e8cd479312be..216953762e2e 100644..100755
--- a/0009-bootsplash.patch
+++ b/0009-bootsplash.patch
@@ -1,42 +1,66 @@
-diff --git a/drivers/tty/vt/keyboard.c b/drivers/tty/vt/keyboard.c
-index f4166263bb3a..a248429194bb 100644
---- a/drivers/tty/vt/keyboard.c
-+++ b/drivers/tty/vt/keyboard.c
-@@ -47,6 +47,8 @@
+diff --git a/drivers/video/fbdev/core/bootsplash.c b/drivers/video/fbdev/core/bootsplash.c
+index 843c5400fefc..815b007f81ca 100644
+--- a/drivers/video/fbdev/core/bootsplash.c
++++ b/drivers/video/fbdev/core/bootsplash.c
+@@ -112,6 +112,8 @@ void bootsplash_render_full(struct fb_info *info)
- #include <asm/irq_regs.h>
+ bootsplash_do_render_pictures(info, splash_state.file);
-+#include <linux/bootsplash.h>
++ bootsplash_do_render_flush(info);
+
- extern void ctrl_alt_del(void);
+ out:
+ mutex_unlock(&splash_state.data_lock);
+ }
+diff --git a/drivers/video/fbdev/core/bootsplash_internal.h b/drivers/video/fbdev/core/bootsplash_internal.h
+index 71e2a27ac0b8..0acb383aa4e3 100644
+--- a/drivers/video/fbdev/core/bootsplash_internal.h
++++ b/drivers/video/fbdev/core/bootsplash_internal.h
+@@ -89,6 +89,7 @@ void bootsplash_do_render_background(struct fb_info *info,
+ const struct splash_file_priv *fp);
+ void bootsplash_do_render_pictures(struct fb_info *info,
+ const struct splash_file_priv *fp);
++void bootsplash_do_render_flush(struct fb_info *info);
- /*
-@@ -1353,6 +1355,28 @@ static void kbd_keycode(unsigned int keycode, int down, int hw_raw)
- }
- #endif
-+ /* Trap keys when bootsplash is shown */
-+ if (bootsplash_would_render_now()) {
-+ /* Deactivate bootsplash on ESC or Alt+Fxx VT switch */
-+ if (keycode >= KEY_F1 && keycode <= KEY_F12) {
-+ bootsplash_disable();
+ void bootsplash_free_file(struct splash_file_priv *fp);
+diff --git a/drivers/video/fbdev/core/bootsplash_render.c b/drivers/video/fbdev/core/bootsplash_render.c
+index 2ae36949d0e3..8c09c306ff67 100644
+--- a/drivers/video/fbdev/core/bootsplash_render.c
++++ b/drivers/video/fbdev/core/bootsplash_render.c
+@@ -186,3 +186,36 @@ void bootsplash_do_render_pictures(struct fb_info *info,
+ pp->pic_header->width, pp->pic_header->height);
+ }
+ }
+
-+ /*
-+ * No return here since we want to actually
-+ * perform the VT switch.
-+ */
-+ } else {
-+ if (keycode == KEY_ESC)
-+ bootsplash_disable();
+
-+ /*
-+ * Just drop any other keys.
-+ * Their effect would be hidden by the splash.
-+ */
-+ return;
-+ }
-+ }
++void bootsplash_do_render_flush(struct fb_info *info)
++{
++ /*
++ * FB drivers using deferred_io (such as Xen) need to sync the
++ * screen after modifying its contents. When the FB is mmap()ed
++ * from userspace, this happens via a dirty pages callback, but
++ * when modifying the FB from the kernel, there is no such thing.
++ *
++ * So let's issue a fake fb_copyarea (copying the FB onto itself)
++ * to trick the FB driver into syncing the screen.
++ *
++ * A few DRM drivers' FB implementations are broken by not using
++ * deferred_io when they really should - we match on the known
++ * bad ones manually for now.
++ */
++ if (info->fbdefio
++ || !strcmp(info->fix.id, "astdrmfb")
++ || !strcmp(info->fix.id, "cirrusdrmfb")
++ || !strcmp(info->fix.id, "mgadrmfb")) {
++ struct fb_copyarea area;
+
- if (kbd->kbdmode == VC_MEDIUMRAW) {
- /*
- * This is extended medium raw mode, with keys above 127
++ area.dx = 0;
++ area.dy = 0;
++ area.width = info->var.xres;
++ area.height = info->var.yres;
++ area.sx = 0;
++ area.sy = 0;
++
++ info->fbops->fb_copyarea(info, &area);
++ }
++}
diff --git a/0010-bootsplash.patch b/0010-bootsplash.patch
index 8a3b715ce46a..7eb54aff7e00 100644..100755
--- a/0010-bootsplash.patch
+++ b/0010-bootsplash.patch
@@ -1,21 +1,215 @@
-diff --git a/drivers/tty/sysrq.c b/drivers/tty/sysrq.c
-index 3ffc1ce29023..bc6a24c9dfa8 100644
---- a/drivers/tty/sysrq.c
-+++ b/drivers/tty/sysrq.c
-@@ -49,6 +49,7 @@
- #include <linux/syscalls.h>
- #include <linux/of.h>
- #include <linux/rcupdate.h>
-+#include <linux/bootsplash.h>
+diff --git a/drivers/video/fbdev/core/bootsplash_render.c b/drivers/video/fbdev/core/bootsplash_render.c
+index 8c09c306ff67..07e3a4eab811 100644
+--- a/drivers/video/fbdev/core/bootsplash_render.c
++++ b/drivers/video/fbdev/core/bootsplash_render.c
+@@ -155,6 +155,7 @@ void bootsplash_do_render_pictures(struct fb_info *info,
+ for (i = 0; i < fp->header->num_pics; i++) {
+ struct splash_blob_priv *bp;
+ struct splash_pic_priv *pp = &fp->pics[i];
++ const struct splash_pic_header *ph = pp->pic_header;
+ long dst_xoff, dst_yoff;
- #include <asm/ptrace.h>
- #include <asm/irq_regs.h>
-@@ -104,6 +105,8 @@ static void sysrq_handle_SAK(int key)
- {
- struct work_struct *SAK_work = &vc_cons[fg_console].SAK_work;
- schedule_work(SAK_work);
-+
-+ bootsplash_disable();
- }
- static struct sysrq_key_op sysrq_SAK_op = {
- .handler = sysrq_handle_SAK,
+ if (pp->blobs_loaded < 1)
+@@ -165,8 +166,139 @@ void bootsplash_do_render_pictures(struct fb_info *info,
+ if (!bp || bp->blob_header->type != 0)
+ continue;
+
+- dst_xoff = (info->var.xres - pp->pic_header->width) / 2;
+- dst_yoff = (info->var.yres - pp->pic_header->height) / 2;
++ switch (ph->position) {
++ case SPLASH_POS_FLAG_CORNER | SPLASH_CORNER_TOP_LEFT:
++ dst_xoff = 0;
++ dst_yoff = 0;
++
++ dst_xoff += ph->position_offset;
++ dst_yoff += ph->position_offset;
++ break;
++ case SPLASH_POS_FLAG_CORNER | SPLASH_CORNER_TOP:
++ dst_xoff = info->var.xres - pp->pic_header->width;
++ dst_xoff /= 2;
++ dst_yoff = 0;
++
++ dst_yoff += ph->position_offset;
++ break;
++ case SPLASH_POS_FLAG_CORNER | SPLASH_CORNER_TOP_RIGHT:
++ dst_xoff = info->var.xres - pp->pic_header->width;
++ dst_yoff = 0;
++
++ dst_xoff -= ph->position_offset;
++ dst_yoff += ph->position_offset;
++ break;
++ case SPLASH_POS_FLAG_CORNER | SPLASH_CORNER_RIGHT:
++ dst_xoff = info->var.xres - pp->pic_header->width;
++ dst_yoff = info->var.yres - pp->pic_header->height;
++ dst_yoff /= 2;
++
++ dst_xoff -= ph->position_offset;
++ break;
++ case SPLASH_POS_FLAG_CORNER | SPLASH_CORNER_BOTTOM_RIGHT:
++ dst_xoff = info->var.xres - pp->pic_header->width;
++ dst_yoff = info->var.yres - pp->pic_header->height;
++
++ dst_xoff -= ph->position_offset;
++ dst_yoff -= ph->position_offset;
++ break;
++ case SPLASH_POS_FLAG_CORNER | SPLASH_CORNER_BOTTOM:
++ dst_xoff = info->var.xres - pp->pic_header->width;
++ dst_xoff /= 2;
++ dst_yoff = info->var.yres - pp->pic_header->height;
++
++ dst_yoff -= ph->position_offset;
++ break;
++ case SPLASH_POS_FLAG_CORNER | SPLASH_CORNER_BOTTOM_LEFT:
++ dst_xoff = 0 + ph->position_offset;
++ dst_yoff = info->var.yres - pp->pic_header->height
++ - ph->position_offset;
++ break;
++ case SPLASH_POS_FLAG_CORNER | SPLASH_CORNER_LEFT:
++ dst_xoff = 0;
++ dst_yoff = info->var.yres - pp->pic_header->height;
++ dst_yoff /= 2;
++
++ dst_xoff += ph->position_offset;
++ break;
++
++ case SPLASH_CORNER_TOP_LEFT:
++ dst_xoff = info->var.xres - pp->pic_header->width;
++ dst_xoff /= 2;
++ dst_yoff = info->var.yres - pp->pic_header->height;
++ dst_yoff /= 2;
++
++ dst_xoff -= ph->position_offset;
++ dst_yoff -= ph->position_offset;
++ break;
++ case SPLASH_CORNER_TOP:
++ dst_xoff = info->var.xres - pp->pic_header->width;
++ dst_xoff /= 2;
++ dst_yoff = info->var.yres - pp->pic_header->height;
++ dst_yoff /= 2;
++
++ dst_yoff -= ph->position_offset;
++ break;
++ case SPLASH_CORNER_TOP_RIGHT:
++ dst_xoff = info->var.xres - pp->pic_header->width;
++ dst_xoff /= 2;
++ dst_yoff = info->var.yres - pp->pic_header->height;
++ dst_yoff /= 2;
++
++ dst_xoff += ph->position_offset;
++ dst_yoff -= ph->position_offset;
++ break;
++ case SPLASH_CORNER_RIGHT:
++ dst_xoff = info->var.xres - pp->pic_header->width;
++ dst_xoff /= 2;
++ dst_yoff = info->var.yres - pp->pic_header->height;
++ dst_yoff /= 2;
++
++ dst_xoff += ph->position_offset;
++ break;
++ case SPLASH_CORNER_BOTTOM_RIGHT:
++ dst_xoff = info->var.xres - pp->pic_header->width;
++ dst_xoff /= 2;
++ dst_yoff = info->var.yres - pp->pic_header->height;
++ dst_yoff /= 2;
++
++ dst_xoff += ph->position_offset;
++ dst_yoff += ph->position_offset;
++ break;
++ case SPLASH_CORNER_BOTTOM:
++ dst_xoff = info->var.xres - pp->pic_header->width;
++ dst_xoff /= 2;
++ dst_yoff = info->var.yres - pp->pic_header->height;
++ dst_yoff /= 2;
++
++ dst_yoff += ph->position_offset;
++ break;
++ case SPLASH_CORNER_BOTTOM_LEFT:
++ dst_xoff = info->var.xres - pp->pic_header->width;
++ dst_xoff /= 2;
++ dst_yoff = info->var.yres - pp->pic_header->height;
++ dst_yoff /= 2;
++
++ dst_xoff -= ph->position_offset;
++ dst_yoff += ph->position_offset;
++ break;
++ case SPLASH_CORNER_LEFT:
++ dst_xoff = info->var.xres - pp->pic_header->width;
++ dst_xoff /= 2;
++ dst_yoff = info->var.yres - pp->pic_header->height;
++ dst_yoff /= 2;
++
++ dst_xoff -= ph->position_offset;
++ break;
++
++ default:
++ /* As a fallback, center the picture. */
++ dst_xoff = info->var.xres - pp->pic_header->width;
++ dst_xoff /= 2;
++ dst_yoff = info->var.yres - pp->pic_header->height;
++ dst_yoff /= 2;
++ break;
++ }
+
+ if (dst_xoff < 0
+ || dst_yoff < 0
+diff --git a/include/uapi/linux/bootsplash_file.h b/include/uapi/linux/bootsplash_file.h
+index 89dc9cca8f0c..71cedcc68933 100644
+--- a/include/uapi/linux/bootsplash_file.h
++++ b/include/uapi/linux/bootsplash_file.h
+@@ -91,7 +91,32 @@ struct splash_pic_header {
+ */
+ uint8_t num_blobs;
+
+- uint8_t padding[27];
++ /*
++ * Corner to move the picture to / from.
++ * 0x00 - Top left
++ * 0x01 - Top
++ * 0x02 - Top right
++ * 0x03 - Right
++ * 0x04 - Bottom right
++ * 0x05 - Bottom
++ * 0x06 - Bottom left
++ * 0x07 - Left
++ *
++ * Flags:
++ * 0x10 - Calculate offset from the corner towards the center,
++ * rather than from the center towards the corner
++ */
++ uint8_t position;
++
++ /*
++ * Pixel offset from the selected position.
++ * Example: If the picture is in the top right corner, it will
++ * be placed position_offset pixels from the top and
++ * position_offset pixels from the right margin.
++ */
++ uint16_t position_offset;
++
++ uint8_t padding[24];
+ } __attribute__((__packed__));
+
+
+@@ -115,4 +140,22 @@ struct splash_blob_header {
+ uint8_t padding[9];
+ } __attribute__((__packed__));
+
++
++
++
++/*
++ * Enums for on-disk types
++ */
++enum splash_position {
++ SPLASH_CORNER_TOP_LEFT = 0,
++ SPLASH_CORNER_TOP = 1,
++ SPLASH_CORNER_TOP_RIGHT = 2,
++ SPLASH_CORNER_RIGHT = 3,
++ SPLASH_CORNER_BOTTOM_RIGHT = 4,
++ SPLASH_CORNER_BOTTOM = 5,
++ SPLASH_CORNER_BOTTOM_LEFT = 6,
++ SPLASH_CORNER_LEFT = 7,
++ SPLASH_POS_FLAG_CORNER = 0x10,
++};
++
+ #endif
diff --git a/0011-bootsplash.patch b/0011-bootsplash.patch
index add68e7b275c..2785c5e65277 100644..100755
--- a/0011-bootsplash.patch
+++ b/0011-bootsplash.patch
@@ -1,21 +1,327 @@
-diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
-index 9a39a6fcfe98..8a9c67e1c5d8 100644
---- a/drivers/video/fbdev/core/fbcon.c
-+++ b/drivers/video/fbdev/core/fbcon.c
-@@ -1343,6 +1343,16 @@ static void fbcon_cursor(struct vc_data *vc, int mode)
- int y;
- int c = scr_readw((u16 *) vc->vc_pos);
+diff --git a/drivers/video/fbdev/core/bootsplash.c b/drivers/video/fbdev/core/bootsplash.c
+index 815b007f81ca..c8642142cfea 100644
+--- a/drivers/video/fbdev/core/bootsplash.c
++++ b/drivers/video/fbdev/core/bootsplash.c
+@@ -53,6 +53,14 @@ static void splash_callback_redraw_vc(struct work_struct *ignored)
+ console_unlock();
+ }
++static void splash_callback_animation(struct work_struct *ignored)
++{
++ if (bootsplash_would_render_now()) {
++ /* This will also re-schedule this delayed worker */
++ splash_callback_redraw_vc(ignored);
++ }
++}
++
+
+ static bool is_fb_compatible(const struct fb_info *info)
+ {
+@@ -103,17 +111,44 @@ static bool is_fb_compatible(const struct fb_info *info)
+ */
+ void bootsplash_render_full(struct fb_info *info)
+ {
++ bool is_update = false;
++
+ mutex_lock(&splash_state.data_lock);
+
+- if (!is_fb_compatible(info))
+- goto out;
++ /*
++ * If we've painted on this FB recently, we don't have to do
++ * the sanity checks and background drawing again.
++ */
++ if (splash_state.splash_fb == info)
++ is_update = true;
++
++
++ if (!is_update) {
++ /* Check whether we actually support this FB. */
++ splash_state.splash_fb = NULL;
++
++ if (!is_fb_compatible(info))
++ goto out;
++
++ /* Draw the background only once */
++ bootsplash_do_render_background(info, splash_state.file);
+
+- bootsplash_do_render_background(info, splash_state.file);
++ /* Mark this FB as last seen */
++ splash_state.splash_fb = info;
++ }
+
+- bootsplash_do_render_pictures(info, splash_state.file);
++ bootsplash_do_render_pictures(info, splash_state.file, is_update);
+
+ bootsplash_do_render_flush(info);
+
++ bootsplash_do_step_animations(splash_state.file);
++
++ /* Schedule update for animated splash screens */
++ if (splash_state.file->frame_ms > 0)
++ schedule_delayed_work(&splash_state.dwork_animation,
++ msecs_to_jiffies(
++ splash_state.file->frame_ms));
++
+ out:
+ mutex_unlock(&splash_state.data_lock);
+ }
+@@ -169,8 +204,14 @@ void bootsplash_enable(void)
+
+ was_enabled = test_and_set_bit(0, &splash_state.enabled);
+
+- if (!was_enabled)
++ if (!was_enabled) {
++ /* Force a full redraw when the splash is re-activated */
++ mutex_lock(&splash_state.data_lock);
++ splash_state.splash_fb = NULL;
++ mutex_unlock(&splash_state.data_lock);
++
+ schedule_work(&splash_state.work_redraw_vc);
++ }
+ }
+
+
+@@ -227,6 +268,14 @@ ATTRIBUTE_GROUPS(splash_dev);
+ */
+ static int splash_resume(struct device *device)
+ {
++ /*
++ * Force full redraw on resume since we've probably lost the
++ * framebuffer's contents meanwhile
++ */
++ mutex_lock(&splash_state.data_lock);
++ splash_state.splash_fb = NULL;
++ mutex_unlock(&splash_state.data_lock);
++
+ if (bootsplash_would_render_now())
+ schedule_work(&splash_state.work_redraw_vc);
+
+@@ -235,6 +284,7 @@ static int splash_resume(struct device *device)
+
+ static int splash_suspend(struct device *device)
+ {
++ cancel_delayed_work_sync(&splash_state.dwork_animation);
+ cancel_work_sync(&splash_state.work_redraw_vc);
+
+ return 0;
+@@ -296,6 +346,8 @@ void bootsplash_init(void)
+ set_bit(0, &splash_state.enabled);
+
+ INIT_WORK(&splash_state.work_redraw_vc, splash_callback_redraw_vc);
++ INIT_DELAYED_WORK(&splash_state.dwork_animation,
++ splash_callback_animation);
+
+
+ if (!splash_state.bootfile || !strlen(splash_state.bootfile))
+diff --git a/drivers/video/fbdev/core/bootsplash_internal.h b/drivers/video/fbdev/core/bootsplash_internal.h
+index 0acb383aa4e3..b3a74835d90f 100644
+--- a/drivers/video/fbdev/core/bootsplash_internal.h
++++ b/drivers/video/fbdev/core/bootsplash_internal.h
+@@ -37,6 +37,8 @@ struct splash_pic_priv {
+
+ struct splash_blob_priv *blobs;
+ u16 blobs_loaded;
++
++ u16 anim_nextframe;
+ };
+
+
+@@ -45,6 +47,12 @@ struct splash_file_priv {
+ const struct splash_file_header *header;
+
+ struct splash_pic_priv *pics;
++
++ /*
++ * A local copy of the frame delay in the header.
++ * We modify it to keep the code simple.
++ */
++ u16 frame_ms;
+ };
+
+
+@@ -71,6 +79,7 @@ struct splash_priv {
+ struct platform_device *splash_device;
+
+ struct work_struct work_redraw_vc;
++ struct delayed_work dwork_animation;
+
+ /* Splash data structures including lock for everything below */
+ struct mutex data_lock;
+@@ -88,8 +97,10 @@ struct splash_priv {
+ void bootsplash_do_render_background(struct fb_info *info,
+ const struct splash_file_priv *fp);
+ void bootsplash_do_render_pictures(struct fb_info *info,
+- const struct splash_file_priv *fp);
++ const struct splash_file_priv *fp,
++ bool is_update);
+ void bootsplash_do_render_flush(struct fb_info *info);
++void bootsplash_do_step_animations(struct splash_file_priv *fp);
+
+
+ void bootsplash_free_file(struct splash_file_priv *fp);
+diff --git a/drivers/video/fbdev/core/bootsplash_load.c b/drivers/video/fbdev/core/bootsplash_load.c
+index fd807571ab7d..1f661b2d4cc9 100644
+--- a/drivers/video/fbdev/core/bootsplash_load.c
++++ b/drivers/video/fbdev/core/bootsplash_load.c
+@@ -71,6 +71,7 @@ struct splash_file_priv *bootsplash_load_firmware(struct device *device,
+ {
+ const struct firmware *fw;
+ struct splash_file_priv *fp;
++ bool have_anim = false;
+ unsigned int i;
+ const u8 *walker;
+
+@@ -135,6 +136,13 @@ struct splash_file_priv *bootsplash_load_firmware(struct device *device,
+ goto err;
+ }
+
++ if (ph->anim_type > SPLASH_ANIM_LOOP_FORWARD) {
++ pr_warn("Picture %u: Unsupported animation type %u.\n",
++ i, ph->anim_type);
++
++ ph->anim_type = SPLASH_ANIM_NONE;
++ }
++
+ pp->pic_header = ph;
+ pp->blobs = vzalloc(ph->num_blobs
+ * sizeof(struct splash_blob_priv));
+@@ -202,6 +210,7 @@ struct splash_file_priv *bootsplash_load_firmware(struct device *device,
+ /* Walk over pictures and ensure all blob slots are filled */
+ for (i = 0; i < fp->header->num_pics; i++) {
+ struct splash_pic_priv *pp = &fp->pics[i];
++ const struct splash_pic_header *ph = pp->pic_header;
+
+ if (pp->blobs_loaded != pp->pic_header->num_blobs) {
+ pr_err("Picture %u doesn't have all blob slots filled.\n",
+@@ -209,8 +218,20 @@ struct splash_file_priv *bootsplash_load_firmware(struct device *device,
+
+ goto err;
+ }
++
++ if (ph->anim_type
++ && ph->num_blobs > 1
++ && ph->anim_loop < pp->blobs_loaded)
++ have_anim = true;
+ }
+
++ if (!have_anim)
++ /* Disable animation timer if there is nothing to animate */
++ fp->frame_ms = 0;
++ else
++ /* Enforce minimum delay between frames */
++ fp->frame_ms = max((u16)20, fp->header->frame_ms);
++
+ pr_info("Loaded (%ld bytes, %u pics, %u blobs).\n",
+ fw->size,
+ fp->header->num_pics,
+diff --git a/drivers/video/fbdev/core/bootsplash_render.c b/drivers/video/fbdev/core/bootsplash_render.c
+index 07e3a4eab811..76033606ca8a 100644
+--- a/drivers/video/fbdev/core/bootsplash_render.c
++++ b/drivers/video/fbdev/core/bootsplash_render.c
+@@ -148,7 +148,8 @@ void bootsplash_do_render_background(struct fb_info *info,
+
+
+ void bootsplash_do_render_pictures(struct fb_info *info,
+- const struct splash_file_priv *fp)
++ const struct splash_file_priv *fp,
++ bool is_update)
+ {
+ unsigned int i;
+
+@@ -161,7 +162,11 @@ void bootsplash_do_render_pictures(struct fb_info *info,
+ if (pp->blobs_loaded < 1)
+ continue;
+
+- bp = &pp->blobs[0];
++ /* Skip static pictures when refreshing animations */
++ if (ph->anim_type == SPLASH_ANIM_NONE && is_update)
++ continue;
++
++ bp = &pp->blobs[pp->anim_nextframe];
+
+ if (!bp || bp->blob_header->type != 0)
+ continue;
+@@ -351,3 +356,24 @@ void bootsplash_do_render_flush(struct fb_info *info)
+ info->fbops->fb_copyarea(info, &area);
+ }
+ }
++
++
++void bootsplash_do_step_animations(struct splash_file_priv *fp)
++{
++ unsigned int i;
++
++ /* Step every animation once */
++ for (i = 0; i < fp->header->num_pics; i++) {
++ struct splash_pic_priv *pp = &fp->pics[i];
++
++ if (pp->blobs_loaded < 2
++ || pp->pic_header->anim_loop > pp->blobs_loaded)
++ continue;
++
++ if (pp->pic_header->anim_type == SPLASH_ANIM_LOOP_FORWARD) {
++ pp->anim_nextframe++;
++ if (pp->anim_nextframe >= pp->pic_header->num_blobs)
++ pp->anim_nextframe = pp->pic_header->anim_loop;
++ }
++ }
++}
+diff --git a/include/uapi/linux/bootsplash_file.h b/include/uapi/linux/bootsplash_file.h
+index 71cedcc68933..b3af0a3c6487 100644
+--- a/include/uapi/linux/bootsplash_file.h
++++ b/include/uapi/linux/bootsplash_file.h
+@@ -77,7 +77,17 @@ struct splash_file_header {
+ uint16_t num_blobs;
+ uint8_t num_pics;
+
+- uint8_t padding[103];
++ uint8_t unused_1;
++
+ /*
-+ * Disable the splash here so we don't have to hook into
-+ * vt_console_print() in drivers/tty/vt/vt.c
-+ *
-+ * We'd disable the splash just before the call to
-+ * hide_cursor() anyway, so this spot is just fine.
++ * Milliseconds to wait before painting the next frame in
++ * an animation.
++ * This is actually a minimum, as the system is allowed to
++ * stall for longer between frames.
+ */
-+ if (oops_in_progress)
-+ bootsplash_disable();
++ uint16_t frame_ms;
+
- ops->cur_blink_jiffies = msecs_to_jiffies(vc->vc_cur_blink_ms);
++ uint8_t padding[100];
+ } __attribute__((__packed__));
+
- if (fbcon_is_inactive(vc, info) || vc->vc_deccm != 1)
+@@ -116,7 +126,23 @@ struct splash_pic_header {
+ */
+ uint16_t position_offset;
+
+- uint8_t padding[24];
++ /*
++ * Animation type.
++ * 0 - off
++ * 1 - forward loop
++ */
++ uint8_t anim_type;
++
++ /*
++ * Animation loop point.
++ * Actual meaning depends on animation type:
++ * Type 0 - Unused
++ * 1 - Frame at which to restart the forward loop
++ * (allowing for "intro" frames)
++ */
++ uint8_t anim_loop;
++
++ uint8_t padding[22];
+ } __attribute__((__packed__));
+
+
+@@ -158,4 +184,9 @@ enum splash_position {
+ SPLASH_POS_FLAG_CORNER = 0x10,
+ };
+
++enum splash_anim_type {
++ SPLASH_ANIM_NONE = 0,
++ SPLASH_ANIM_LOOP_FORWARD = 1,
++};
++
+ #endif
diff --git a/0012-bootsplash.patch b/0012-bootsplash.patch
index e5c1fd0c8604..d6c6db659c56 100644..100755
--- a/0012-bootsplash.patch
+++ b/0012-bootsplash.patch
@@ -1,321 +1,82 @@
-diff --git a/Documentation/ABI/testing/sysfs-platform-bootsplash b/Documentation/ABI/testing/sysfs-platform-bootsplash
-new file mode 100644
-index 000000000000..742c7b035ded
---- /dev/null
-+++ b/Documentation/ABI/testing/sysfs-platform-bootsplash
-@@ -0,0 +1,11 @@
-+What: /sys/devices/platform/bootsplash.0/enabled
-+Date: Oct 2017
-+KernelVersion: 4.14
-+Contact: Max Staudt <mstaudt@suse.de>
-+Description:
-+ Can be set and read.
-+
-+ 0: Splash is disabled.
-+ 1: Splash is shown whenever fbcon would show a text console
-+ (i.e. no graphical application is running), and a splash
-+ file is loaded.
-diff --git a/Documentation/bootsplash.rst b/Documentation/bootsplash.rst
-new file mode 100644
-index 000000000000..611f0c558925
---- /dev/null
-+++ b/Documentation/bootsplash.rst
-@@ -0,0 +1,285 @@
-+====================
-+The Linux bootsplash
-+====================
-+
-+:Date: November, 2017
-+:Author: Max Staudt <mstaudt@suse.de>
-+
-+
-+The Linux bootsplash is a graphical replacement for the '``quiet``' boot
-+option, typically showing a logo and a spinner animation as the system starts.
-+
-+Currently, it is a part of the Framebuffer Console support, and can be found
-+as ``CONFIG_BOOTSPLASH`` in the kernel configuration. This means that as long
-+as it is enabled, it hijacks fbcon's output and draws a splash screen instead.
-+
-+Purely compiling in the bootsplash will not render it functional - to actually
-+render a splash, you will also need a splash theme file. See the example
-+utility and script in ``tools/bootsplash`` for a live demo.
-+
-+
-+
-+Motivation
-+==========
-+
-+- The '``quiet``' boot option only suppresses most messages during boot, but
-+ errors are still shown.
-+
-+- A user space implementation can only show a logo once user space has been
-+ initialized far enough to allow this. A kernel splash can display a splash
-+ immediately as soon as fbcon can be displayed.
-+
-+- Implementing a splash screen in user space (e.g. Plymouth) is problematic
-+ due to resource conflicts.
-+
-+ For example, if Plymouth is keeping ``/dev/fb0`` (provided via vesafb/efifb)
-+ open, then most DRM drivers can't replace it because the address space is
-+ still busy - thus leading to a VRAM reservation error.
-+
-+ See: https://bugzilla.opensuse.org/show_bug.cgi?id=980750
-+
-+
-+
-+Command line arguments
-+======================
-+
-+``bootsplash.bootfile``
-+ Which file in the initramfs to load.
-+
-+ The splash theme is loaded via request_firmware(), thus to load
-+ ``/lib/firmware/bootsplash/mytheme`` pass the command line:
-+
-+ ``bootsplash.bootfile=bootsplash/mytheme``
-+
-+ Note: The splash file *has to be* in the initramfs, as it needs to be
-+ available when the splash is initialized early on.
-+
-+ Default: none, i.e. a non-functional splash, falling back to showing text.
-+
-+
-+
-+sysfs run-time configuration
-+============================
-+
-+``/sys/devices/platform/bootsplash.0/enabled``
-+ Enable/disable the bootsplash.
-+ The system boots with this set to 1, but will not show a splash unless
-+ a splash theme file is also loaded.
-+
-+
-+
-+Kconfig
-+=======
-+
-+``BOOTSPLASH``
-+ Whether to compile in bootsplash support
-+ (depends on fbcon compiled in, i.e. ``FRAMEBUFFER_CONSOLE=y``)
-+
-+
-+
-+Bootsplash file format
-+======================
-+
-+A file specified in the kernel configuration as ``CONFIG_BOOTSPLASH_FILE``
-+or specified on the command line as ``bootsplash.bootfile`` will be loaded
-+and displayed as soon as fbcon is initialized.
-+
-+
-+Main blocks
-+-----------
-+
-+There are 3 main blocks in each file:
-+
-+ - one File header
-+ - n Picture headers
-+ - m (Blob header + payload) blocks
-+
-+
-+Structures
-+----------
-+
-+The on-disk structures are defined in
-+``drivers/video/fbdev/core/bootsplash_file.h`` and represent these blocks:
-+
-+ - ``struct splash_file_header``
-+
-+ Represents the file header, with splash-wide information including:
-+
-+ - The magic string "``Linux bootsplash``" on big-endian platforms
-+ (the reverse on little endian)
-+ - The file format version (for incompatible updates, hopefully never)
-+ - The background color
-+ - Number of picture and blob blocks
-+ - Animation speed (we only allow one delay for all animations)
-+
-+ The file header is followed by the first picture header.
-+
-+
-+ - ``struct splash_picture_header``
-+
-+ Represents an object (picture) drawn on screen, including its immutable
-+ properties:
-+ - Width, height
-+ - Positioning relative to screen corners or in the center
-+ - Animation, if any
-+ - Animation type
-+ - Number of blobs
-+
-+ The picture header is followed by another picture header, up until n
-+ picture headers (as defined in the file header) have been read. Then,
-+ the (blob header, payload) pairs follow.
-+
-+
-+ - ``struct splash_blob_header``
-+ (followed by payload)
-+
-+ Represents one raw data stream. So far, only picture data is defined.
-+
-+ The blob header is followed by a payload, then padding to n*16 bytes,
-+ then (if further blobs are defined in the file header) a further blob
-+ header.
-+
-+
-+Alignment
-+---------
-+
-+The bootsplash file is designed to be loaded into memory as-is.
-+
-+All structures are a multiple of 16 bytes long, all elements therein are
-+aligned to multiples of their length, and the payloads are always padded
-+up to multiples of 16 bytes. This is to allow aligned accesses in all
-+cases while still simply mapping the structures over an in-memory copy of
-+the bootsplash file.
-+
-+
-+Further information
-+-------------------
-+
-+Please see ``drivers/video/fbdev/core/bootsplash_file.h`` for further
-+details and possible values in the file.
-+
-+
-+
-+Hooks - how the bootsplash is integrated
-+========================================
-+
-+``drivers/video/fbdev/core/fbcon.c``
-+ ``fbcon_init()`` calls ``bootsplash_init()``, which loads the default
-+ bootsplash file or the one specified on the kernel command line.
-+
-+ ``fbcon_switch()`` draws the bootsplash when it's active, and is also
-+ one of the callers of ``set_blitting_type()``.
-+
-+ ``set_blitting_type()`` calls ``fbcon_set_dummyops()`` when the
-+ bootsplash is active, overriding the text rendering functions.
-+
-+ ``fbcon_cursor()`` will call ``bootsplash_disable()`` when an oops is
-+ being printed in order to make a kernel panic visible.
-+
-+``drivers/video/fbdev/core/dummyblit.c``
-+ This contains the dummy text rendering functions used to suppress text
-+ output while the bootsplash is shown.
-+
-+``drivers/tty/vt/keyboard.c``
-+ ``kbd_keycode()`` can call ``bootsplash_disable()`` when the user
-+ presses ESC or F1-F12 (changing VT). This is to provide a built-in way
-+ of disabling the splash manually at any time.
-+
-+
-+
-+FAQ: Frequently Asked Questions
-+===============================
-+
-+I want to see the log! How do I show the log?
-+---------------------------------------------
-+
-+Press ESC while the splash is shown, or remove the ``bootsplash.bootfile``
-+parameter from the kernel cmdline. Without that parameter, the bootsplash
-+will boot disabled.
-+
-+
-+Why use FB instead of modern DRM/KMS?
-+-------------------------------------
-+
-+This is a semantic problem:
-+ - What memory to draw the splash to?
-+ - And what mode will the screen be set to?
-+
-+Using the fbdev emulation solves these issues.
-+
-+Let's start from a bare KMS system, without fbcon, and without fbdev
-+emulation. In this case, as long as userspace doesn't open the KMS
-+device, the state of the screen is undefined. No framebuffer is
-+allocated in video RAM, and no particular mode is set.
-+
-+In this case, we'd have to allocate a framebuffer to show the splash,
-+and set our mode ourselves. This either wastes a screenful of video RAM
-+if the splash is to co-exist with the userspace program's own allocated
-+framebuffer, or there is a flicker as we deactivate and delete the
-+bootsplash's framebuffer and hand control over to userspace. Since we
-+may set a different mode than userspace, we'd also have flicker due
-+to mode switching.
-+
-+This logic is already contained in every KMS driver that performs fbdev
-+emulation. So we might as well use that. And the correct API to do so is
-+fbdev. Plus, we get compatibility with old, pure fbdev drivers for free.
-+With the fbdev emulation, there is *always* a well-defined framebuffer
-+to draw on. And the selection of mode has already been done by the
-+graphics driver, so we don't need to reinvent that wheel, either.
-+Finally, if userspace decides to use /dev/fbX, we don't have to worry
-+about wasting video RAM, either.
-+
-+
-+Why is the bootsplash integrated in fbcon?
-+------------------------------------------
-+
-+Right now, the bootsplash is drawn from within fbcon, as this allows us
-+to easily know *when* to draw - i.e. when we're safe from fbcon and
-+userspace drawing all over our beautiful splash logo.
-+
-+Separating them is not easy - see the to-do list below.
-+
-+
-+
-+TO DO list for future development
-+=================================
-+
-+Second enable/disable switch for the system
-+-------------------------------------------
-+
-+It may be helpful to differentiate between the system and the user
-+switching off the bootsplash. Thus, the system may make it disappear and
-+reappear e.g. for a password prompt, yet once the user has pressed ESC,
-+it could stay gone.
-+
-+
-+Fix buggy DRM/KMS drivers
-+-------------------------
-+
-+Currently, the splash code manually checks for fbdev emulation provided by
-+the ast, cirrus, and mgag200 DRM/KMS drivers.
-+These drivers use a manual mechanism similar to deferred I/O for their FB
-+emulation, and thus need to be manually flushed onto the screen in the same
-+way.
-+
-+This may be improved upon in several ways:
-+
-+1. Changing these drivers to expose the fbdev BO's memory directly, like
-+ bochsdrmfb does.
-+2. Creating a new fb_ops->fb_flush() API to allow the kernel to flush the
-+ framebuffer once the bootsplash has been drawn into it.
-+
-+
-+Separating from fbcon
-+---------------------
-+
-+Separating these two components would yield independence from fbcon being
-+compiled into the kernel, and thus lowering code size in embedded
-+applications.
-+
-+To do this cleanly will involve a clean separation of users of an FB device
-+within the kernel, i.e. fbcon, bootsplash, and userspace. Right now, the
-+legacy fbcon code and VT code co-operate to switch between fbcon and
-+userspace (by setting the VT into KD_GRAPHICS mode). Installing a muxer
-+between these components ensues refactoring of old code and checking for
-+correct locking.
-diff --git a/MAINTAINERS b/MAINTAINERS
-index 5c237445761e..7ffac272434e 100644
---- a/MAINTAINERS
-+++ b/MAINTAINERS
-@@ -2709,6 +2709,8 @@ BOOTSPLASH
- M: Max Staudt <mstaudt@suse.de>
- L: linux-fbdev@vger.kernel.org
- S: Maintained
-+F: Documentation/ABI/testing/sysfs-platform-bootsplash
-+F: Documentation/bootsplash.rst
- F: drivers/video/fbdev/core/bootsplash*.*
- F: drivers/video/fbdev/core/dummycon.c
- F: include/linux/bootsplash.h
+diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
+index 2ebaba16f785..416735ab6dc1 100644
+--- a/drivers/tty/vt/vt.c
++++ b/drivers/tty/vt/vt.c
+@@ -105,6 +105,7 @@
+ #include <linux/ctype.h>
+ #include <linux/bsearch.h>
+ #include <linux/gcd.h>
++#include <linux/bootsplash.h>
+
+ #define MAX_NR_CON_DRIVER 16
+
+@@ -4235,6 +4236,7 @@ void do_unblank_screen(int leaving_gfx)
+ }
+
+ console_blanked = 0;
++ bootsplash_mark_dirty();
+ if (vc->vc_sw->con_blank(vc, 0, leaving_gfx))
+ /* Low-level driver cannot restore -> do it ourselves */
+ update_screen(vc);
+diff --git a/drivers/video/fbdev/core/bootsplash.c b/drivers/video/fbdev/core/bootsplash.c
+index c8642142cfea..13fcaabbc2ca 100644
+--- a/drivers/video/fbdev/core/bootsplash.c
++++ b/drivers/video/fbdev/core/bootsplash.c
+@@ -165,6 +165,13 @@ bool bootsplash_would_render_now(void)
+ && bootsplash_is_enabled();
+ }
+
++void bootsplash_mark_dirty(void)
++{
++ mutex_lock(&splash_state.data_lock);
++ splash_state.splash_fb = NULL;
++ mutex_unlock(&splash_state.data_lock);
++}
++
+ bool bootsplash_is_enabled(void)
+ {
+ bool was_enabled;
+@@ -206,9 +213,7 @@ void bootsplash_enable(void)
+
+ if (!was_enabled) {
+ /* Force a full redraw when the splash is re-activated */
+- mutex_lock(&splash_state.data_lock);
+- splash_state.splash_fb = NULL;
+- mutex_unlock(&splash_state.data_lock);
++ bootsplash_mark_dirty();
+
+ schedule_work(&splash_state.work_redraw_vc);
+ }
+@@ -272,9 +277,7 @@ static int splash_resume(struct device *device)
+ * Force full redraw on resume since we've probably lost the
+ * framebuffer's contents meanwhile
+ */
+- mutex_lock(&splash_state.data_lock);
+- splash_state.splash_fb = NULL;
+- mutex_unlock(&splash_state.data_lock);
++ bootsplash_mark_dirty();
+
+ if (bootsplash_would_render_now())
+ schedule_work(&splash_state.work_redraw_vc);
+diff --git a/include/linux/bootsplash.h b/include/linux/bootsplash.h
+index c6dd0b43180d..4075098aaadd 100644
+--- a/include/linux/bootsplash.h
++++ b/include/linux/bootsplash.h
+@@ -19,6 +19,8 @@ extern void bootsplash_render_full(struct fb_info *info);
+
+ extern bool bootsplash_would_render_now(void);
+
++extern void bootsplash_mark_dirty(void);
++
+ extern bool bootsplash_is_enabled(void);
+ extern void bootsplash_disable(void);
+ extern void bootsplash_enable(void);
+@@ -31,6 +33,8 @@ extern void bootsplash_init(void);
+
+ #define bootsplash_would_render_now() (false)
+
++#define bootsplash_mark_dirty()
++
+ #define bootsplash_is_enabled() (false)
+ #define bootsplash_disable()
+ #define bootsplash_enable()
diff --git a/0013-bootsplash.patch b/0013-bootsplash.patch
index 8e87eb463187..e8cd479312be 100644..100755
--- a/0013-bootsplash.patch
+++ b/0013-bootsplash.patch
@@ -1,129 +1,42 @@
-diff --git a/Documentation/ABI/testing/sysfs-platform-bootsplash b/Documentation/ABI/testing/sysfs-platform-bootsplash
-index 742c7b035ded..f8f4b259220e 100644
---- a/Documentation/ABI/testing/sysfs-platform-bootsplash
-+++ b/Documentation/ABI/testing/sysfs-platform-bootsplash
-@@ -9,3 +9,35 @@ Description:
- 1: Splash is shown whenever fbcon would show a text console
- (i.e. no graphical application is running), and a splash
- file is loaded.
-+
-+What: /sys/devices/platform/bootsplash.0/drop_splash
-+Date: Oct 2017
-+KernelVersion: 4.14
-+Contact: Max Staudt <mstaudt@suse.de>
-+Description:
-+ Can only be set.
-+
-+ Any value written will cause the current splash theme file
-+ to be unloaded and the text console to be redrawn.
-+
-+What: /sys/devices/platform/bootsplash.0/load_file
-+Date: Oct 2017
-+KernelVersion: 4.14
-+Contact: Max Staudt <mstaudt@suse.de>
-+Description:
-+ Can only be set.
-+
-+ Any value written will cause the splash to be disabled and
-+ internal memory structures to be freed.
-+
-+ A firmware path written will cause a new theme file to be
-+ loaded and the current bootsplash to be replaced.
-+ The current enabled/disabled status is not touched.
-+ If the splash is already active, it will be redrawn.
-+
-+ The path has to be a path in /lib/firmware since
-+ request_firmware() is used to fetch the data.
-+
-+ When setting the splash from the shell, echo -n has to be
-+ used as any trailing '\n' newline will be interpreted as
-+ part of the path.
-diff --git a/Documentation/bootsplash.rst b/Documentation/bootsplash.rst
-index 611f0c558925..b35aba5093e8 100644
---- a/Documentation/bootsplash.rst
-+++ b/Documentation/bootsplash.rst
-@@ -67,6 +67,14 @@ sysfs run-time configuration
- a splash theme file is also loaded.
+diff --git a/drivers/tty/vt/keyboard.c b/drivers/tty/vt/keyboard.c
+index f4166263bb3a..a248429194bb 100644
+--- a/drivers/tty/vt/keyboard.c
++++ b/drivers/tty/vt/keyboard.c
+@@ -47,6 +47,8 @@
+ #include <asm/irq_regs.h>
-+``/sys/devices/platform/bootsplash.0/drop_splash``
-+ Unload splash data and free memory.
-+
-+``/sys/devices/platform/bootsplash.0/load_file``
-+ Load a splash file from ``/lib/firmware/``.
-+ Note that trailing newlines will be interpreted as part of the file name.
-+
-+
-
- Kconfig
- =======
-diff --git a/drivers/video/fbdev/core/bootsplash.c b/drivers/video/fbdev/core/bootsplash.c
-index 13fcaabbc2ca..16cb0493629d 100644
---- a/drivers/video/fbdev/core/bootsplash.c
-+++ b/drivers/video/fbdev/core/bootsplash.c
-@@ -251,11 +251,65 @@ static ssize_t splash_store_enabled(struct device *device,
- return count;
- }
-
-+static ssize_t splash_store_drop_splash(struct device *device,
-+ struct device_attribute *attr,
-+ const char *buf, size_t count)
-+{
-+ struct splash_file_priv *fp;
-+
-+ if (!buf || !count || !splash_state.file)
-+ return count;
++#include <linux/bootsplash.h>
+
-+ mutex_lock(&splash_state.data_lock);
-+ fp = splash_state.file;
-+ splash_state.file = NULL;
-+ mutex_unlock(&splash_state.data_lock);
-+
-+ /* Redraw the text console */
-+ schedule_work(&splash_state.work_redraw_vc);
-+
-+ bootsplash_free_file(fp);
-+
-+ return count;
-+}
-+
-+static ssize_t splash_store_load_file(struct device *device,
-+ struct device_attribute *attr,
-+ const char *buf, size_t count)
-+{
-+ struct splash_file_priv *fp, *fp_old;
-+
-+ if (!count)
-+ return 0;
-+
-+ fp = bootsplash_load_firmware(&splash_state.splash_device->dev,
-+ buf);
-+
-+ if (!fp)
-+ return -ENXIO;
-+
-+ mutex_lock(&splash_state.data_lock);
-+ fp_old = splash_state.file;
-+ splash_state.splash_fb = NULL;
-+ splash_state.file = fp;
-+ mutex_unlock(&splash_state.data_lock);
-+
-+ /* Update the splash or text console */
-+ schedule_work(&splash_state.work_redraw_vc);
-+
-+ bootsplash_free_file(fp_old);
-+ return count;
-+}
-+
- static DEVICE_ATTR(enabled, 0644, splash_show_enabled, splash_store_enabled);
-+static DEVICE_ATTR(drop_splash, 0200, NULL, splash_store_drop_splash);
-+static DEVICE_ATTR(load_file, 0200, NULL, splash_store_load_file);
-
+ extern void ctrl_alt_del(void);
- static struct attribute *splash_dev_attrs[] = {
- &dev_attr_enabled.attr,
-+ &dev_attr_drop_splash.attr,
-+ &dev_attr_load_file.attr,
- NULL
- };
+ /*
+@@ -1353,6 +1355,28 @@ static void kbd_keycode(unsigned int keycode, int down, int hw_raw)
+ }
+ #endif
++ /* Trap keys when bootsplash is shown */
++ if (bootsplash_would_render_now()) {
++ /* Deactivate bootsplash on ESC or Alt+Fxx VT switch */
++ if (keycode >= KEY_F1 && keycode <= KEY_F12) {
++ bootsplash_disable();
++
++ /*
++ * No return here since we want to actually
++ * perform the VT switch.
++ */
++ } else {
++ if (keycode == KEY_ESC)
++ bootsplash_disable();
++
++ /*
++ * Just drop any other keys.
++ * Their effect would be hidden by the splash.
++ */
++ return;
++ }
++ }
++
+ if (kbd->kbdmode == VC_MEDIUMRAW) {
+ /*
+ * This is extended medium raw mode, with keys above 127
diff --git a/0014-bootsplash.patch b/0014-bootsplash.patch
index 5d8ea1fe295c..8a3b715ce46a 100644..100755
--- a/0014-bootsplash.patch
+++ b/0014-bootsplash.patch
@@ -1,511 +1,21 @@
-diff --git a/MAINTAINERS b/MAINTAINERS
-index 7ffac272434e..ddff07cd794c 100644
---- a/MAINTAINERS
-+++ b/MAINTAINERS
-@@ -2715,6 +2715,7 @@ F: drivers/video/fbdev/core/bootsplash*.*
- F: drivers/video/fbdev/core/dummycon.c
- F: include/linux/bootsplash.h
- F: include/uapi/linux/bootsplash_file.h
-+F: tools/bootsplash/*
+diff --git a/drivers/tty/sysrq.c b/drivers/tty/sysrq.c
+index 3ffc1ce29023..bc6a24c9dfa8 100644
+--- a/drivers/tty/sysrq.c
++++ b/drivers/tty/sysrq.c
+@@ -49,6 +49,7 @@
+ #include <linux/syscalls.h>
+ #include <linux/of.h>
+ #include <linux/rcupdate.h>
++#include <linux/bootsplash.h>
- BPF (Safe dynamic programs and tools)
- M: Alexei Starovoitov <ast@kernel.org>
-diff --git a/tools/bootsplash/.gitignore b/tools/bootsplash/.gitignore
-new file mode 100644
-index 000000000000..091b99a17567
---- /dev/null
-+++ b/tools/bootsplash/.gitignore
-@@ -0,0 +1 @@
-+bootsplash-packer
-diff --git a/tools/bootsplash/Makefile b/tools/bootsplash/Makefile
-new file mode 100644
-index 000000000000..0ad8e8a84942
---- /dev/null
-+++ b/tools/bootsplash/Makefile
-@@ -0,0 +1,9 @@
-+CC := $(CROSS_COMPILE)gcc
-+CFLAGS := -I../../usr/include
-+
-+PROGS := bootsplash-packer
-+
-+all: $(PROGS)
-+
-+clean:
-+ rm -fr $(PROGS)
-diff --git a/tools/bootsplash/bootsplash-packer.c b/tools/bootsplash/bootsplash-packer.c
-new file mode 100644
-index 000000000000..ffb6a8b69885
---- /dev/null
-+++ b/tools/bootsplash/bootsplash-packer.c
-@@ -0,0 +1,471 @@
-+/*
-+ * Kernel based bootsplash.
-+ *
-+ * (Splash file packer tool)
-+ *
-+ * Authors:
-+ * Max Staudt <mstaudt@suse.de>
-+ *
-+ * SPDX-License-Identifier: GPL-2.0
-+ */
-+
-+#include <endian.h>
-+#include <getopt.h>
-+#include <stdint.h>
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <string.h>
-+
-+#include <linux/bootsplash_file.h>
-+
-+
-+static void print_help(char *progname)
-+{
-+ printf("Usage: %s [OPTIONS] outfile\n", progname);
-+ printf("\n"
-+ "Options, executed in order given:\n"
-+ " -h, --help Print this help message\n"
-+ "\n"
-+ " --bg_red <u8> Background color (red part)\n"
-+ " --bg_green <u8> Background color (green part)\n"
-+ " --bg_blue <u8> Background color (blue part)\n"
-+ " --bg_reserved <u8> (do not use)\n"
-+ " --frame_ms <u16> Minimum milliseconds between animation steps\n"
-+ "\n"
-+ " --picture Start describing the next picture\n"
-+ " --pic_width <u16> Picture width in pixels\n"
-+ " --pic_height <u16> Picture height in pixels\n"
-+ " --pic_position <u8> Coarse picture placement:\n"
-+ " 0x00 - Top left\n"
-+ " 0x01 - Top\n"
-+ " 0x02 - Top right\n"
-+ " 0x03 - Right\n"
-+ " 0x04 - Bottom right\n"
-+ " 0x05 - Bottom\n"
-+ " 0x06 - Bottom left\n"
-+ " 0x07 - Left\n"
-+ "\n"
-+ " Flags:\n"
-+ " 0x10 - Calculate offset from corner towards center,\n"
-+ " rather than from center towards corner\n"
-+ " --pic_position_offset <u16> Distance from base position in pixels\n"
-+ " --pic_anim_type <u8> Animation type:\n"
-+ " 0 - None\n"
-+ " 1 - Forward loop\n"
-+ " --pic_anim_loop <u8> Loop point for animation\n"
-+ "\n"
-+ " --blob <filename> Include next data stream\n"
-+ " --blob_type <u16> Type of data\n"
-+ " --blob_picture_id <u8> Picture to associate this blob with, starting at 0\n"
-+ " (default: number of last --picture)\n"
-+ "\n");
-+ printf("This tool will write %s files.\n\n",
-+#if __BYTE_ORDER == __BIG_ENDIAN
-+ "Big Endian (BE)");
-+#elif __BYTE_ORDER == __LITTLE_ENDIAN
-+ "Little Endian (LE)");
-+#else
-+#error
-+#endif
-+}
-+
-+
-+struct blob_entry {
-+ struct blob_entry *next;
-+
-+ char *fn;
-+
-+ struct splash_blob_header header;
-+};
-+
-+
-+static void dump_file_header(struct splash_file_header *h)
-+{
-+ printf(" --- File header ---\n");
-+ printf("\n");
-+ printf(" version: %5u\n", h->version);
-+ printf("\n");
-+ printf(" bg_red: %5u\n", h->bg_red);
-+ printf(" bg_green: %5u\n", h->bg_green);
-+ printf(" bg_blue: %5u\n", h->bg_blue);
-+ printf(" bg_reserved: %5u\n", h->bg_reserved);
-+ printf("\n");
-+ printf(" num_blobs: %5u\n", h->num_blobs);
-+ printf(" num_pics: %5u\n", h->num_pics);
-+ printf("\n");
-+ printf(" frame_ms: %5u\n", h->frame_ms);
-+ printf("\n");
-+}
-+
-+static void dump_pic_header(struct splash_pic_header *ph)
-+{
-+ printf(" --- Picture header ---\n");
-+ printf("\n");
-+ printf(" width: %5u\n", ph->width);
-+ printf(" height: %5u\n", ph->height);
-+ printf("\n");
-+ printf(" num_blobs: %5u\n", ph->num_blobs);
-+ printf("\n");
-+ printf(" position: %0x3x\n", ph->position);
-+ printf(" position_offset: %5u\n", ph->position_offset);
-+ printf("\n");
-+ printf(" anim_type: %5u\n", ph->anim_type);
-+ printf(" anim_loop: %5u\n", ph->anim_loop);
-+ printf("\n");
-+}
-+
-+static void dump_blob(struct blob_entry *b)
-+{
-+ printf(" --- Blob header ---\n");
-+ printf("\n");
-+ printf(" length: %7u\n", b->header.length);
-+ printf(" type: %7u\n", b->header.type);
-+ printf("\n");
-+ printf(" picture_id: %7u\n", b->header.picture_id);
-+ printf("\n");
-+}
-+
-+
-+#define OPT_MAX(var, max) \
-+ do { \
-+ if ((var) > max) { \
-+ fprintf(stderr, "--%s: Invalid value\n", \
-+ long_options[option_index].name); \
-+ break; \
-+ } \
-+ } while (0)
-+
-+static struct option long_options[] = {
-+ {"help", 0, 0, 'h'},
-+ {"bg_red", 1, 0, 10001},
-+ {"bg_green", 1, 0, 10002},
-+ {"bg_blue", 1, 0, 10003},
-+ {"bg_reserved", 1, 0, 10004},
-+ {"frame_ms", 1, 0, 10005},
-+ {"picture", 0, 0, 20000},
-+ {"pic_width", 1, 0, 20001},
-+ {"pic_height", 1, 0, 20002},
-+ {"pic_position", 1, 0, 20003},
-+ {"pic_position_offset", 1, 0, 20004},
-+ {"pic_anim_type", 1, 0, 20005},
-+ {"pic_anim_loop", 1, 0, 20006},
-+ {"blob", 1, 0, 30000},
-+ {"blob_type", 1, 0, 30001},
-+ {"blob_picture_id", 1, 0, 30002},
-+ {NULL, 0, NULL, 0}
-+};
-+
-+
-+int main(int argc, char **argv)
-+{
-+ FILE *of;
-+ char *ofn;
-+ int c;
-+ int option_index = 0;
-+
-+ unsigned long ul;
-+ struct splash_file_header fh = {};
-+ struct splash_pic_header ph[255];
-+ struct blob_entry *blob_first = NULL;
-+ struct blob_entry *blob_last = NULL;
-+ struct blob_entry *blob_cur = NULL;
-+
-+ if (argc < 2) {
-+ print_help(argv[0]);
-+ return EXIT_FAILURE;
-+ }
-+
-+
-+ /* Parse and and execute user commands */
-+ while ((c = getopt_long(argc, argv, "h",
-+ long_options, &option_index)) != -1) {
-+ switch (c) {
-+ case 10001: /* bg_red */
-+ ul = strtoul(optarg, NULL, 0);
-+ OPT_MAX(ul, 255);
-+ fh.bg_red = ul;
-+ break;
-+ case 10002: /* bg_green */
-+ ul = strtoul(optarg, NULL, 0);
-+ OPT_MAX(ul, 255);
-+ fh.bg_green = ul;
-+ break;
-+ case 10003: /* bg_blue */
-+ ul = strtoul(optarg, NULL, 0);
-+ OPT_MAX(ul, 255);
-+ fh.bg_blue = ul;
-+ break;
-+ case 10004: /* bg_reserved */
-+ ul = strtoul(optarg, NULL, 0);
-+ OPT_MAX(ul, 255);
-+ fh.bg_reserved = ul;
-+ break;
-+ case 10005: /* frame_ms */
-+ ul = strtoul(optarg, NULL, 0);
-+ OPT_MAX(ul, 65535);
-+ fh.frame_ms = ul;
-+ break;
-+
-+
-+ case 20000: /* picture */
-+ if (fh.num_pics >= 255) {
-+ fprintf(stderr, "--%s: Picture array full\n",
-+ long_options[option_index].name);
-+ break;
-+ }
-+
-+ fh.num_pics++;
-+ break;
-+
-+ case 20001: /* pic_width */
-+ ul = strtoul(optarg, NULL, 0);
-+ OPT_MAX(ul, 65535);
-+ ph[fh.num_pics - 1].width = ul;
-+ break;
-+
-+ case 20002: /* pic_height */
-+ ul = strtoul(optarg, NULL, 0);
-+ OPT_MAX(ul, 65535);
-+ ph[fh.num_pics - 1].height = ul;
-+ break;
-+
-+ case 20003: /* pic_position */
-+ ul = strtoul(optarg, NULL, 0);
-+ OPT_MAX(ul, 255);
-+ ph[fh.num_pics - 1].position = ul;
-+ break;
-+
-+ case 20004: /* pic_position_offset */
-+ ul = strtoul(optarg, NULL, 0);
-+ OPT_MAX(ul, 255);
-+ ph[fh.num_pics - 1].position_offset = ul;
-+ break;
-+
-+ case 20005: /* pic_anim_type */
-+ ul = strtoul(optarg, NULL, 0);
-+ OPT_MAX(ul, 255);
-+ ph[fh.num_pics - 1].anim_type = ul;
-+ break;
-+
-+ case 20006: /* pic_anim_loop */
-+ ul = strtoul(optarg, NULL, 0);
-+ OPT_MAX(ul, 255);
-+ ph[fh.num_pics - 1].anim_loop = ul;
-+ break;
-+
-+
-+ case 30000: /* blob */
-+ if (fh.num_blobs >= 65535) {
-+ fprintf(stderr, "--%s: Blob array full\n",
-+ long_options[option_index].name);
-+ break;
-+ }
-+
-+ blob_cur = calloc(1, sizeof(struct blob_entry));
-+ if (!blob_cur) {
-+ fprintf(stderr, "--%s: Out of memory\n",
-+ long_options[option_index].name);
-+ break;
-+ }
-+
-+ blob_cur->fn = optarg;
-+ if (fh.num_pics)
-+ blob_cur->header.picture_id = fh.num_pics - 1;
-+
-+ if (!blob_first)
-+ blob_first = blob_cur;
-+ if (blob_last)
-+ blob_last->next = blob_cur;
-+ blob_last = blob_cur;
-+ fh.num_blobs++;
-+ break;
-+
-+ case 30001: /* blob_type */
-+ if (!blob_cur) {
-+ fprintf(stderr, "--%s: No blob selected\n",
-+ long_options[option_index].name);
-+ break;
-+ }
-+
-+ ul = strtoul(optarg, NULL, 0);
-+ OPT_MAX(ul, 255);
-+ blob_cur->header.type = ul;
-+ break;
-+
-+ case 30002: /* blob_picture_id */
-+ if (!blob_cur) {
-+ fprintf(stderr, "--%s: No blob selected\n",
-+ long_options[option_index].name);
-+ break;
-+ }
-+
-+ ul = strtoul(optarg, NULL, 0);
-+ OPT_MAX(ul, 255);
-+ blob_cur->header.picture_id = ul;
-+ break;
-+
-+
-+
-+ case 'h':
-+ case '?':
-+ default:
-+ print_help(argv[0]);
-+ goto EXIT;
-+ } /* switch (c) */
-+ } /* while ((c = getopt_long(...)) != -1) */
-+
-+ /* Consume and drop lone arguments */
-+ while (optind < argc) {
-+ ofn = argv[optind];
-+ optind++;
-+ }
-+
-+
-+ /* Read file lengths */
-+ for (blob_cur = blob_first; blob_cur; blob_cur = blob_cur->next) {
-+ FILE *f;
-+ long pos;
-+ int i;
-+
-+ if (!blob_cur->fn)
-+ continue;
-+
-+ f = fopen(blob_cur->fn, "rb");
-+ if (!f)
-+ goto ERR_FILE_LEN;
-+
-+ if (fseek(f, 0, SEEK_END))
-+ goto ERR_FILE_LEN;
-+
-+ pos = ftell(f);
-+ if (pos < 0 || pos > (1 << 30))
-+ goto ERR_FILE_LEN;
-+
-+ blob_cur->header.length = pos;
-+
-+ fclose(f);
-+ continue;
-+
-+ERR_FILE_LEN:
-+ fprintf(stderr, "Error getting file length (or too long): %s\n",
-+ blob_cur->fn);
-+ if (f)
-+ fclose(f);
-+ continue;
-+ }
-+
-+
-+ /* Set magic headers */
-+#if __BYTE_ORDER == __BIG_ENDIAN
-+ memcpy(&fh.id[0], BOOTSPLASH_MAGIC_BE, 16);
-+#elif __BYTE_ORDER == __LITTLE_ENDIAN
-+ memcpy(&fh.id[0], BOOTSPLASH_MAGIC_LE, 16);
-+#else
-+#error
-+#endif
-+ fh.version = BOOTSPLASH_VERSION;
-+
-+ /* Set blob counts */
-+ for (blob_cur = blob_first; blob_cur; blob_cur = blob_cur->next) {
-+ if (blob_cur->header.picture_id < fh.num_pics)
-+ ph[blob_cur->header.picture_id].num_blobs++;
-+ }
-+
-+
-+ /* Dump structs */
-+ dump_file_header(&fh);
-+
-+ for (ul = 0; ul < fh.num_pics; ul++)
-+ dump_pic_header(&ph[ul]);
-+
-+ for (blob_cur = blob_first; blob_cur; blob_cur = blob_cur->next)
-+ dump_blob(blob_cur);
-+
-+
-+ /* Write to file */
-+ printf("Writing splash to file: %s\n", ofn);
-+ of = fopen(ofn, "wb");
-+ if (!of)
-+ goto ERR_WRITING;
-+
-+ if (fwrite(&fh, sizeof(struct splash_file_header), 1, of) != 1)
-+ goto ERR_WRITING;
-+
-+ for (ul = 0; ul < fh.num_pics; ul++) {
-+ if (fwrite(&ph[ul], sizeof(struct splash_pic_header), 1, of)
-+ != 1)
-+ goto ERR_WRITING;
-+ }
-+
-+ blob_cur = blob_first;
-+ while (blob_cur) {
-+ struct blob_entry *blob_old = blob_cur;
-+ FILE *f;
-+ char *buf[256];
-+ uint32_t left;
-+
-+ if (fwrite(&blob_cur->header,
-+ sizeof(struct splash_blob_header), 1, of) != 1)
-+ goto ERR_WRITING;
-+
-+ if (!blob_cur->header.length || !blob_cur->fn)
-+ continue;
-+
-+ f = fopen(blob_cur->fn, "rb");
-+ if (!f)
-+ goto ERR_FILE_COPY;
-+
-+ left = blob_cur->header.length;
-+ while (left >= sizeof(buf)) {
-+ if (fread(buf, sizeof(buf), 1, f) != 1)
-+ goto ERR_FILE_COPY;
-+ if (fwrite(buf, sizeof(buf), 1, of) != 1)
-+ goto ERR_FILE_COPY;
-+ left -= sizeof(buf);
-+ }
-+ if (left) {
-+ if (fread(buf, left, 1, f) != 1)
-+ goto ERR_FILE_COPY;
-+ if (fwrite(buf, left, 1, of) != 1)
-+ goto ERR_FILE_COPY;
-+ }
-+
-+ /* Pad data stream to 16 bytes */
-+ if (left % 16) {
-+ if (fwrite("\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0",
-+ 16 - (left % 16), 1, of) != 1)
-+ goto ERR_FILE_COPY;
-+ }
-+
-+ fclose(f);
-+ blob_cur = blob_cur->next;
-+ free(blob_old);
-+ continue;
-+
-+ERR_FILE_COPY:
-+ if (f)
-+ fclose(f);
-+ goto ERR_WRITING;
-+ }
-+
-+ fclose(of);
-+
-+EXIT:
-+ return EXIT_SUCCESS;
-+
-+
-+ERR_WRITING:
-+ fprintf(stderr, "Error writing splash.\n");
-+ fprintf(stderr, "The output file is probably corrupt.\n");
-+ if (of)
-+ fclose(of);
-+
-+ while (blob_cur) {
-+ struct blob_entry *blob_old = blob_cur;
-+
-+ blob_cur = blob_cur->next;
-+ free(blob_old);
-+ }
-+
-+ return EXIT_FAILURE;
-+}
+ #include <asm/ptrace.h>
+ #include <asm/irq_regs.h>
+@@ -104,6 +105,8 @@ static void sysrq_handle_SAK(int key)
+ {
+ struct work_struct *SAK_work = &vc_cons[fg_console].SAK_work;
+ schedule_work(SAK_work);
++
++ bootsplash_disable();
+ }
+ static struct sysrq_key_op sysrq_SAK_op = {
+ .handler = sysrq_handle_SAK,
diff --git a/0015-bootsplash.patch b/0015-bootsplash.patch
index 0924d29e7d48..add68e7b275c 100644..100755
--- a/0015-bootsplash.patch
+++ b/0015-bootsplash.patch
@@ -1,102 +1,21 @@
-diff --git a/Documentation/bootsplash.rst b/Documentation/bootsplash.rst
-index b35aba5093e8..d4f132eca615 100644
---- a/Documentation/bootsplash.rst
-+++ b/Documentation/bootsplash.rst
-@@ -195,6 +195,16 @@ Hooks - how the bootsplash is integrated
+diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
+index 9a39a6fcfe98..8a9c67e1c5d8 100644
+--- a/drivers/video/fbdev/core/fbcon.c
++++ b/drivers/video/fbdev/core/fbcon.c
+@@ -1343,6 +1343,16 @@ static void fbcon_cursor(struct vc_data *vc, int mode)
+ int y;
+ int c = scr_readw((u16 *) vc->vc_pos);
++ /*
++ * Disable the splash here so we don't have to hook into
++ * vt_console_print() in drivers/tty/vt/vt.c
++ *
++ * We'd disable the splash just before the call to
++ * hide_cursor() anyway, so this spot is just fine.
++ */
++ if (oops_in_progress)
++ bootsplash_disable();
++
+ ops->cur_blink_jiffies = msecs_to_jiffies(vc->vc_cur_blink_ms);
-
-+Crating a bootsplash theme file
-+===============================
-+
-+A simple tool for theme file creation is included in ``tools/bootsplash``.
-+
-+There is also an example shell script, as an example on how to use the tool
-+and in order to generate a reference bootsplash file.
-+
-+
-+
- FAQ: Frequently Asked Questions
- ===============================
-
-diff --git a/tools/bootsplash/.gitignore b/tools/bootsplash/.gitignore
-index 091b99a17567..5dfced41ba82 100644
---- a/tools/bootsplash/.gitignore
-+++ b/tools/bootsplash/.gitignore
-@@ -1 +1,4 @@
- bootsplash-packer
-+bootsplash
-+logo.rgb
-+throbber*.rgb
-diff --git a/tools/bootsplash/bootsplash-tux.sh b/tools/bootsplash/bootsplash-tux.sh
-new file mode 100755
-index 000000000000..1078f87644b9
---- /dev/null
-+++ b/tools/bootsplash/bootsplash-tux.sh
-@@ -0,0 +1,66 @@
-+#!/bin/bash
-+#
-+# A simple script to show how to create a bootsplash.
-+# Do with it whatever you wish.
-+#
-+# This needs ImageMagick for the 'convert' and 'identify' tools.
-+#
-+
-+LOGO=../../Documentation/logo.gif
-+LOGO_WIDTH=$(identify $LOGO | cut -d " " -f 3 | cut -d x -f 1)
-+LOGO_HEIGHT=$(identify $LOGO | cut -d " " -f 3 | cut -d x -f 2)
-+
-+THROBBER=ajax-loader.gif
-+THROBBER_WIDTH=$(identify $THROBBER | head -1 | cut -d " " -f 3 | \
-+ cut -d x -f 1)
-+THROBBER_HEIGHT=$(identify $THROBBER | head -1 | cut -d " " -f 3 | \
-+ cut -d x -f 2)
-+
-+convert -alpha remove \
-+ -background "#ff3a40" \
-+ $LOGO \
-+ logo.rgb
-+
-+convert -alpha remove \
-+ -background "#ff3a40" \
-+ $THROBBER \
-+ throbber%02d.rgb
-+
-+
-+make clean
-+make bootsplash-packer
-+
-+
-+# Let's put Tux in the center of an orange background.
-+./bootsplash-packer \
-+ --bg_red 0xff \
-+ --bg_green 0x3a \
-+ --bg_blue 0x40 \
-+ --frame_ms 48 \
-+ --picture \
-+ --pic_width $LOGO_WIDTH \
-+ --pic_height $LOGO_HEIGHT \
-+ --pic_position 0 \
-+ --blob logo.rgb \
-+ --picture \
-+ --pic_width $THROBBER_WIDTH \
-+ --pic_height $THROBBER_HEIGHT \
-+ --pic_position 0x14 \
-+ --pic_position_offset 20 \
-+ --pic_anim_type 1 \
-+ --pic_anim_loop 0 \
-+ --blob throbber00.rgb \
-+ --blob throbber01.rgb \
-+ --blob throbber02.rgb \
-+ --blob throbber03.rgb \
-+ --blob throbber04.rgb \
-+ --blob throbber05.rgb \
-+ --blob throbber06.rgb \
-+ --blob throbber07.rgb \
-+ --blob throbber08.rgb \
-+ --blob throbber09.rgb \
-+ --blob throbber10.rgb \
-+ --blob throbber11.rgb \
-+ bootsplash
-+
-+rm *.rgb
+ if (fbcon_is_inactive(vc, info) || vc->vc_deccm != 1)
diff --git a/0016-bootsplash.patch b/0016-bootsplash.patch
new file mode 100755
index 000000000000..e5c1fd0c8604
--- /dev/null
+++ b/0016-bootsplash.patch
@@ -0,0 +1,321 @@
+diff --git a/Documentation/ABI/testing/sysfs-platform-bootsplash b/Documentation/ABI/testing/sysfs-platform-bootsplash
+new file mode 100644
+index 000000000000..742c7b035ded
+--- /dev/null
++++ b/Documentation/ABI/testing/sysfs-platform-bootsplash
+@@ -0,0 +1,11 @@
++What: /sys/devices/platform/bootsplash.0/enabled
++Date: Oct 2017
++KernelVersion: 4.14
++Contact: Max Staudt <mstaudt@suse.de>
++Description:
++ Can be set and read.
++
++ 0: Splash is disabled.
++ 1: Splash is shown whenever fbcon would show a text console
++ (i.e. no graphical application is running), and a splash
++ file is loaded.
+diff --git a/Documentation/bootsplash.rst b/Documentation/bootsplash.rst
+new file mode 100644
+index 000000000000..611f0c558925
+--- /dev/null
++++ b/Documentation/bootsplash.rst
+@@ -0,0 +1,285 @@
++====================
++The Linux bootsplash
++====================
++
++:Date: November, 2017
++:Author: Max Staudt <mstaudt@suse.de>
++
++
++The Linux bootsplash is a graphical replacement for the '``quiet``' boot
++option, typically showing a logo and a spinner animation as the system starts.
++
++Currently, it is a part of the Framebuffer Console support, and can be found
++as ``CONFIG_BOOTSPLASH`` in the kernel configuration. This means that as long
++as it is enabled, it hijacks fbcon's output and draws a splash screen instead.
++
++Purely compiling in the bootsplash will not render it functional - to actually
++render a splash, you will also need a splash theme file. See the example
++utility and script in ``tools/bootsplash`` for a live demo.
++
++
++
++Motivation
++==========
++
++- The '``quiet``' boot option only suppresses most messages during boot, but
++ errors are still shown.
++
++- A user space implementation can only show a logo once user space has been
++ initialized far enough to allow this. A kernel splash can display a splash
++ immediately as soon as fbcon can be displayed.
++
++- Implementing a splash screen in user space (e.g. Plymouth) is problematic
++ due to resource conflicts.
++
++ For example, if Plymouth is keeping ``/dev/fb0`` (provided via vesafb/efifb)
++ open, then most DRM drivers can't replace it because the address space is
++ still busy - thus leading to a VRAM reservation error.
++
++ See: https://bugzilla.opensuse.org/show_bug.cgi?id=980750
++
++
++
++Command line arguments
++======================
++
++``bootsplash.bootfile``
++ Which file in the initramfs to load.
++
++ The splash theme is loaded via request_firmware(), thus to load
++ ``/lib/firmware/bootsplash/mytheme`` pass the command line:
++
++ ``bootsplash.bootfile=bootsplash/mytheme``
++
++ Note: The splash file *has to be* in the initramfs, as it needs to be
++ available when the splash is initialized early on.
++
++ Default: none, i.e. a non-functional splash, falling back to showing text.
++
++
++
++sysfs run-time configuration
++============================
++
++``/sys/devices/platform/bootsplash.0/enabled``
++ Enable/disable the bootsplash.
++ The system boots with this set to 1, but will not show a splash unless
++ a splash theme file is also loaded.
++
++
++
++Kconfig
++=======
++
++``BOOTSPLASH``
++ Whether to compile in bootsplash support
++ (depends on fbcon compiled in, i.e. ``FRAMEBUFFER_CONSOLE=y``)
++
++
++
++Bootsplash file format
++======================
++
++A file specified in the kernel configuration as ``CONFIG_BOOTSPLASH_FILE``
++or specified on the command line as ``bootsplash.bootfile`` will be loaded
++and displayed as soon as fbcon is initialized.
++
++
++Main blocks
++-----------
++
++There are 3 main blocks in each file:
++
++ - one File header
++ - n Picture headers
++ - m (Blob header + payload) blocks
++
++
++Structures
++----------
++
++The on-disk structures are defined in
++``drivers/video/fbdev/core/bootsplash_file.h`` and represent these blocks:
++
++ - ``struct splash_file_header``
++
++ Represents the file header, with splash-wide information including:
++
++ - The magic string "``Linux bootsplash``" on big-endian platforms
++ (the reverse on little endian)
++ - The file format version (for incompatible updates, hopefully never)
++ - The background color
++ - Number of picture and blob blocks
++ - Animation speed (we only allow one delay for all animations)
++
++ The file header is followed by the first picture header.
++
++
++ - ``struct splash_picture_header``
++
++ Represents an object (picture) drawn on screen, including its immutable
++ properties:
++ - Width, height
++ - Positioning relative to screen corners or in the center
++ - Animation, if any
++ - Animation type
++ - Number of blobs
++
++ The picture header is followed by another picture header, up until n
++ picture headers (as defined in the file header) have been read. Then,
++ the (blob header, payload) pairs follow.
++
++
++ - ``struct splash_blob_header``
++ (followed by payload)
++
++ Represents one raw data stream. So far, only picture data is defined.
++
++ The blob header is followed by a payload, then padding to n*16 bytes,
++ then (if further blobs are defined in the file header) a further blob
++ header.
++
++
++Alignment
++---------
++
++The bootsplash file is designed to be loaded into memory as-is.
++
++All structures are a multiple of 16 bytes long, all elements therein are
++aligned to multiples of their length, and the payloads are always padded
++up to multiples of 16 bytes. This is to allow aligned accesses in all
++cases while still simply mapping the structures over an in-memory copy of
++the bootsplash file.
++
++
++Further information
++-------------------
++
++Please see ``drivers/video/fbdev/core/bootsplash_file.h`` for further
++details and possible values in the file.
++
++
++
++Hooks - how the bootsplash is integrated
++========================================
++
++``drivers/video/fbdev/core/fbcon.c``
++ ``fbcon_init()`` calls ``bootsplash_init()``, which loads the default
++ bootsplash file or the one specified on the kernel command line.
++
++ ``fbcon_switch()`` draws the bootsplash when it's active, and is also
++ one of the callers of ``set_blitting_type()``.
++
++ ``set_blitting_type()`` calls ``fbcon_set_dummyops()`` when the
++ bootsplash is active, overriding the text rendering functions.
++
++ ``fbcon_cursor()`` will call ``bootsplash_disable()`` when an oops is
++ being printed in order to make a kernel panic visible.
++
++``drivers/video/fbdev/core/dummyblit.c``
++ This contains the dummy text rendering functions used to suppress text
++ output while the bootsplash is shown.
++
++``drivers/tty/vt/keyboard.c``
++ ``kbd_keycode()`` can call ``bootsplash_disable()`` when the user
++ presses ESC or F1-F12 (changing VT). This is to provide a built-in way
++ of disabling the splash manually at any time.
++
++
++
++FAQ: Frequently Asked Questions
++===============================
++
++I want to see the log! How do I show the log?
++---------------------------------------------
++
++Press ESC while the splash is shown, or remove the ``bootsplash.bootfile``
++parameter from the kernel cmdline. Without that parameter, the bootsplash
++will boot disabled.
++
++
++Why use FB instead of modern DRM/KMS?
++-------------------------------------
++
++This is a semantic problem:
++ - What memory to draw the splash to?
++ - And what mode will the screen be set to?
++
++Using the fbdev emulation solves these issues.
++
++Let's start from a bare KMS system, without fbcon, and without fbdev
++emulation. In this case, as long as userspace doesn't open the KMS
++device, the state of the screen is undefined. No framebuffer is
++allocated in video RAM, and no particular mode is set.
++
++In this case, we'd have to allocate a framebuffer to show the splash,
++and set our mode ourselves. This either wastes a screenful of video RAM
++if the splash is to co-exist with the userspace program's own allocated
++framebuffer, or there is a flicker as we deactivate and delete the
++bootsplash's framebuffer and hand control over to userspace. Since we
++may set a different mode than userspace, we'd also have flicker due
++to mode switching.
++
++This logic is already contained in every KMS driver that performs fbdev
++emulation. So we might as well use that. And the correct API to do so is
++fbdev. Plus, we get compatibility with old, pure fbdev drivers for free.
++With the fbdev emulation, there is *always* a well-defined framebuffer
++to draw on. And the selection of mode has already been done by the
++graphics driver, so we don't need to reinvent that wheel, either.
++Finally, if userspace decides to use /dev/fbX, we don't have to worry
++about wasting video RAM, either.
++
++
++Why is the bootsplash integrated in fbcon?
++------------------------------------------
++
++Right now, the bootsplash is drawn from within fbcon, as this allows us
++to easily know *when* to draw - i.e. when we're safe from fbcon and
++userspace drawing all over our beautiful splash logo.
++
++Separating them is not easy - see the to-do list below.
++
++
++
++TO DO list for future development
++=================================
++
++Second enable/disable switch for the system
++-------------------------------------------
++
++It may be helpful to differentiate between the system and the user
++switching off the bootsplash. Thus, the system may make it disappear and
++reappear e.g. for a password prompt, yet once the user has pressed ESC,
++it could stay gone.
++
++
++Fix buggy DRM/KMS drivers
++-------------------------
++
++Currently, the splash code manually checks for fbdev emulation provided by
++the ast, cirrus, and mgag200 DRM/KMS drivers.
++These drivers use a manual mechanism similar to deferred I/O for their FB
++emulation, and thus need to be manually flushed onto the screen in the same
++way.
++
++This may be improved upon in several ways:
++
++1. Changing these drivers to expose the fbdev BO's memory directly, like
++ bochsdrmfb does.
++2. Creating a new fb_ops->fb_flush() API to allow the kernel to flush the
++ framebuffer once the bootsplash has been drawn into it.
++
++
++Separating from fbcon
++---------------------
++
++Separating these two components would yield independence from fbcon being
++compiled into the kernel, and thus lowering code size in embedded
++applications.
++
++To do this cleanly will involve a clean separation of users of an FB device
++within the kernel, i.e. fbcon, bootsplash, and userspace. Right now, the
++legacy fbcon code and VT code co-operate to switch between fbcon and
++userspace (by setting the VT into KD_GRAPHICS mode). Installing a muxer
++between these components ensues refactoring of old code and checking for
++correct locking.
+diff --git a/MAINTAINERS b/MAINTAINERS
+index 5c237445761e..7ffac272434e 100644
+--- a/MAINTAINERS
++++ b/MAINTAINERS
+@@ -2709,6 +2709,8 @@ BOOTSPLASH
+ M: Max Staudt <mstaudt@suse.de>
+ L: linux-fbdev@vger.kernel.org
+ S: Maintained
++F: Documentation/ABI/testing/sysfs-platform-bootsplash
++F: Documentation/bootsplash.rst
+ F: drivers/video/fbdev/core/bootsplash*.*
+ F: drivers/video/fbdev/core/dummycon.c
+ F: include/linux/bootsplash.h
diff --git a/0017-bootsplash.patch b/0017-bootsplash.patch
new file mode 100755
index 000000000000..8e87eb463187
--- /dev/null
+++ b/0017-bootsplash.patch
@@ -0,0 +1,129 @@
+diff --git a/Documentation/ABI/testing/sysfs-platform-bootsplash b/Documentation/ABI/testing/sysfs-platform-bootsplash
+index 742c7b035ded..f8f4b259220e 100644
+--- a/Documentation/ABI/testing/sysfs-platform-bootsplash
++++ b/Documentation/ABI/testing/sysfs-platform-bootsplash
+@@ -9,3 +9,35 @@ Description:
+ 1: Splash is shown whenever fbcon would show a text console
+ (i.e. no graphical application is running), and a splash
+ file is loaded.
++
++What: /sys/devices/platform/bootsplash.0/drop_splash
++Date: Oct 2017
++KernelVersion: 4.14
++Contact: Max Staudt <mstaudt@suse.de>
++Description:
++ Can only be set.
++
++ Any value written will cause the current splash theme file
++ to be unloaded and the text console to be redrawn.
++
++What: /sys/devices/platform/bootsplash.0/load_file
++Date: Oct 2017
++KernelVersion: 4.14
++Contact: Max Staudt <mstaudt@suse.de>
++Description:
++ Can only be set.
++
++ Any value written will cause the splash to be disabled and
++ internal memory structures to be freed.
++
++ A firmware path written will cause a new theme file to be
++ loaded and the current bootsplash to be replaced.
++ The current enabled/disabled status is not touched.
++ If the splash is already active, it will be redrawn.
++
++ The path has to be a path in /lib/firmware since
++ request_firmware() is used to fetch the data.
++
++ When setting the splash from the shell, echo -n has to be
++ used as any trailing '\n' newline will be interpreted as
++ part of the path.
+diff --git a/Documentation/bootsplash.rst b/Documentation/bootsplash.rst
+index 611f0c558925..b35aba5093e8 100644
+--- a/Documentation/bootsplash.rst
++++ b/Documentation/bootsplash.rst
+@@ -67,6 +67,14 @@ sysfs run-time configuration
+ a splash theme file is also loaded.
+
+
++``/sys/devices/platform/bootsplash.0/drop_splash``
++ Unload splash data and free memory.
++
++``/sys/devices/platform/bootsplash.0/load_file``
++ Load a splash file from ``/lib/firmware/``.
++ Note that trailing newlines will be interpreted as part of the file name.
++
++
+
+ Kconfig
+ =======
+diff --git a/drivers/video/fbdev/core/bootsplash.c b/drivers/video/fbdev/core/bootsplash.c
+index 13fcaabbc2ca..16cb0493629d 100644
+--- a/drivers/video/fbdev/core/bootsplash.c
++++ b/drivers/video/fbdev/core/bootsplash.c
+@@ -251,11 +251,65 @@ static ssize_t splash_store_enabled(struct device *device,
+ return count;
+ }
+
++static ssize_t splash_store_drop_splash(struct device *device,
++ struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ struct splash_file_priv *fp;
++
++ if (!buf || !count || !splash_state.file)
++ return count;
++
++ mutex_lock(&splash_state.data_lock);
++ fp = splash_state.file;
++ splash_state.file = NULL;
++ mutex_unlock(&splash_state.data_lock);
++
++ /* Redraw the text console */
++ schedule_work(&splash_state.work_redraw_vc);
++
++ bootsplash_free_file(fp);
++
++ return count;
++}
++
++static ssize_t splash_store_load_file(struct device *device,
++ struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ struct splash_file_priv *fp, *fp_old;
++
++ if (!count)
++ return 0;
++
++ fp = bootsplash_load_firmware(&splash_state.splash_device->dev,
++ buf);
++
++ if (!fp)
++ return -ENXIO;
++
++ mutex_lock(&splash_state.data_lock);
++ fp_old = splash_state.file;
++ splash_state.splash_fb = NULL;
++ splash_state.file = fp;
++ mutex_unlock(&splash_state.data_lock);
++
++ /* Update the splash or text console */
++ schedule_work(&splash_state.work_redraw_vc);
++
++ bootsplash_free_file(fp_old);
++ return count;
++}
++
+ static DEVICE_ATTR(enabled, 0644, splash_show_enabled, splash_store_enabled);
++static DEVICE_ATTR(drop_splash, 0200, NULL, splash_store_drop_splash);
++static DEVICE_ATTR(load_file, 0200, NULL, splash_store_load_file);
+
+
+ static struct attribute *splash_dev_attrs[] = {
+ &dev_attr_enabled.attr,
++ &dev_attr_drop_splash.attr,
++ &dev_attr_load_file.attr,
+ NULL
+ };
+
diff --git a/0018-bootsplash.patch b/0018-bootsplash.patch
new file mode 100755
index 000000000000..5d8ea1fe295c
--- /dev/null
+++ b/0018-bootsplash.patch
@@ -0,0 +1,511 @@
+diff --git a/MAINTAINERS b/MAINTAINERS
+index 7ffac272434e..ddff07cd794c 100644
+--- a/MAINTAINERS
++++ b/MAINTAINERS
+@@ -2715,6 +2715,7 @@ F: drivers/video/fbdev/core/bootsplash*.*
+ F: drivers/video/fbdev/core/dummycon.c
+ F: include/linux/bootsplash.h
+ F: include/uapi/linux/bootsplash_file.h
++F: tools/bootsplash/*
+
+ BPF (Safe dynamic programs and tools)
+ M: Alexei Starovoitov <ast@kernel.org>
+diff --git a/tools/bootsplash/.gitignore b/tools/bootsplash/.gitignore
+new file mode 100644
+index 000000000000..091b99a17567
+--- /dev/null
++++ b/tools/bootsplash/.gitignore
+@@ -0,0 +1 @@
++bootsplash-packer
+diff --git a/tools/bootsplash/Makefile b/tools/bootsplash/Makefile
+new file mode 100644
+index 000000000000..0ad8e8a84942
+--- /dev/null
++++ b/tools/bootsplash/Makefile
+@@ -0,0 +1,9 @@
++CC := $(CROSS_COMPILE)gcc
++CFLAGS := -I../../usr/include
++
++PROGS := bootsplash-packer
++
++all: $(PROGS)
++
++clean:
++ rm -fr $(PROGS)
+diff --git a/tools/bootsplash/bootsplash-packer.c b/tools/bootsplash/bootsplash-packer.c
+new file mode 100644
+index 000000000000..ffb6a8b69885
+--- /dev/null
++++ b/tools/bootsplash/bootsplash-packer.c
+@@ -0,0 +1,471 @@
++/*
++ * Kernel based bootsplash.
++ *
++ * (Splash file packer tool)
++ *
++ * Authors:
++ * Max Staudt <mstaudt@suse.de>
++ *
++ * SPDX-License-Identifier: GPL-2.0
++ */
++
++#include <endian.h>
++#include <getopt.h>
++#include <stdint.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++
++#include <linux/bootsplash_file.h>
++
++
++static void print_help(char *progname)
++{
++ printf("Usage: %s [OPTIONS] outfile\n", progname);
++ printf("\n"
++ "Options, executed in order given:\n"
++ " -h, --help Print this help message\n"
++ "\n"
++ " --bg_red <u8> Background color (red part)\n"
++ " --bg_green <u8> Background color (green part)\n"
++ " --bg_blue <u8> Background color (blue part)\n"
++ " --bg_reserved <u8> (do not use)\n"
++ " --frame_ms <u16> Minimum milliseconds between animation steps\n"
++ "\n"
++ " --picture Start describing the next picture\n"
++ " --pic_width <u16> Picture width in pixels\n"
++ " --pic_height <u16> Picture height in pixels\n"
++ " --pic_position <u8> Coarse picture placement:\n"
++ " 0x00 - Top left\n"
++ " 0x01 - Top\n"
++ " 0x02 - Top right\n"
++ " 0x03 - Right\n"
++ " 0x04 - Bottom right\n"
++ " 0x05 - Bottom\n"
++ " 0x06 - Bottom left\n"
++ " 0x07 - Left\n"
++ "\n"
++ " Flags:\n"
++ " 0x10 - Calculate offset from corner towards center,\n"
++ " rather than from center towards corner\n"
++ " --pic_position_offset <u16> Distance from base position in pixels\n"
++ " --pic_anim_type <u8> Animation type:\n"
++ " 0 - None\n"
++ " 1 - Forward loop\n"
++ " --pic_anim_loop <u8> Loop point for animation\n"
++ "\n"
++ " --blob <filename> Include next data stream\n"
++ " --blob_type <u16> Type of data\n"
++ " --blob_picture_id <u8> Picture to associate this blob with, starting at 0\n"
++ " (default: number of last --picture)\n"
++ "\n");
++ printf("This tool will write %s files.\n\n",
++#if __BYTE_ORDER == __BIG_ENDIAN
++ "Big Endian (BE)");
++#elif __BYTE_ORDER == __LITTLE_ENDIAN
++ "Little Endian (LE)");
++#else
++#error
++#endif
++}
++
++
++struct blob_entry {
++ struct blob_entry *next;
++
++ char *fn;
++
++ struct splash_blob_header header;
++};
++
++
++static void dump_file_header(struct splash_file_header *h)
++{
++ printf(" --- File header ---\n");
++ printf("\n");
++ printf(" version: %5u\n", h->version);
++ printf("\n");
++ printf(" bg_red: %5u\n", h->bg_red);
++ printf(" bg_green: %5u\n", h->bg_green);
++ printf(" bg_blue: %5u\n", h->bg_blue);
++ printf(" bg_reserved: %5u\n", h->bg_reserved);
++ printf("\n");
++ printf(" num_blobs: %5u\n", h->num_blobs);
++ printf(" num_pics: %5u\n", h->num_pics);
++ printf("\n");
++ printf(" frame_ms: %5u\n", h->frame_ms);
++ printf("\n");
++}
++
++static void dump_pic_header(struct splash_pic_header *ph)
++{
++ printf(" --- Picture header ---\n");
++ printf("\n");
++ printf(" width: %5u\n", ph->width);
++ printf(" height: %5u\n", ph->height);
++ printf("\n");
++ printf(" num_blobs: %5u\n", ph->num_blobs);
++ printf("\n");
++ printf(" position: %0x3x\n", ph->position);
++ printf(" position_offset: %5u\n", ph->position_offset);
++ printf("\n");
++ printf(" anim_type: %5u\n", ph->anim_type);
++ printf(" anim_loop: %5u\n", ph->anim_loop);
++ printf("\n");
++}
++
++static void dump_blob(struct blob_entry *b)
++{
++ printf(" --- Blob header ---\n");
++ printf("\n");
++ printf(" length: %7u\n", b->header.length);
++ printf(" type: %7u\n", b->header.type);
++ printf("\n");
++ printf(" picture_id: %7u\n", b->header.picture_id);
++ printf("\n");
++}
++
++
++#define OPT_MAX(var, max) \
++ do { \
++ if ((var) > max) { \
++ fprintf(stderr, "--%s: Invalid value\n", \
++ long_options[option_index].name); \
++ break; \
++ } \
++ } while (0)
++
++static struct option long_options[] = {
++ {"help", 0, 0, 'h'},
++ {"bg_red", 1, 0, 10001},
++ {"bg_green", 1, 0, 10002},
++ {"bg_blue", 1, 0, 10003},
++ {"bg_reserved", 1, 0, 10004},
++ {"frame_ms", 1, 0, 10005},
++ {"picture", 0, 0, 20000},
++ {"pic_width", 1, 0, 20001},
++ {"pic_height", 1, 0, 20002},
++ {"pic_position", 1, 0, 20003},
++ {"pic_position_offset", 1, 0, 20004},
++ {"pic_anim_type", 1, 0, 20005},
++ {"pic_anim_loop", 1, 0, 20006},
++ {"blob", 1, 0, 30000},
++ {"blob_type", 1, 0, 30001},
++ {"blob_picture_id", 1, 0, 30002},
++ {NULL, 0, NULL, 0}
++};
++
++
++int main(int argc, char **argv)
++{
++ FILE *of;
++ char *ofn;
++ int c;
++ int option_index = 0;
++
++ unsigned long ul;
++ struct splash_file_header fh = {};
++ struct splash_pic_header ph[255];
++ struct blob_entry *blob_first = NULL;
++ struct blob_entry *blob_last = NULL;
++ struct blob_entry *blob_cur = NULL;
++
++ if (argc < 2) {
++ print_help(argv[0]);
++ return EXIT_FAILURE;
++ }
++
++
++ /* Parse and and execute user commands */
++ while ((c = getopt_long(argc, argv, "h",
++ long_options, &option_index)) != -1) {
++ switch (c) {
++ case 10001: /* bg_red */
++ ul = strtoul(optarg, NULL, 0);
++ OPT_MAX(ul, 255);
++ fh.bg_red = ul;
++ break;
++ case 10002: /* bg_green */
++ ul = strtoul(optarg, NULL, 0);
++ OPT_MAX(ul, 255);
++ fh.bg_green = ul;
++ break;
++ case 10003: /* bg_blue */
++ ul = strtoul(optarg, NULL, 0);
++ OPT_MAX(ul, 255);
++ fh.bg_blue = ul;
++ break;
++ case 10004: /* bg_reserved */
++ ul = strtoul(optarg, NULL, 0);
++ OPT_MAX(ul, 255);
++ fh.bg_reserved = ul;
++ break;
++ case 10005: /* frame_ms */
++ ul = strtoul(optarg, NULL, 0);
++ OPT_MAX(ul, 65535);
++ fh.frame_ms = ul;
++ break;
++
++
++ case 20000: /* picture */
++ if (fh.num_pics >= 255) {
++ fprintf(stderr, "--%s: Picture array full\n",
++ long_options[option_index].name);
++ break;
++ }
++
++ fh.num_pics++;
++ break;
++
++ case 20001: /* pic_width */
++ ul = strtoul(optarg, NULL, 0);
++ OPT_MAX(ul, 65535);
++ ph[fh.num_pics - 1].width = ul;
++ break;
++
++ case 20002: /* pic_height */
++ ul = strtoul(optarg, NULL, 0);
++ OPT_MAX(ul, 65535);
++ ph[fh.num_pics - 1].height = ul;
++ break;
++
++ case 20003: /* pic_position */
++ ul = strtoul(optarg, NULL, 0);
++ OPT_MAX(ul, 255);
++ ph[fh.num_pics - 1].position = ul;
++ break;
++
++ case 20004: /* pic_position_offset */
++ ul = strtoul(optarg, NULL, 0);
++ OPT_MAX(ul, 255);
++ ph[fh.num_pics - 1].position_offset = ul;
++ break;
++
++ case 20005: /* pic_anim_type */
++ ul = strtoul(optarg, NULL, 0);
++ OPT_MAX(ul, 255);
++ ph[fh.num_pics - 1].anim_type = ul;
++ break;
++
++ case 20006: /* pic_anim_loop */
++ ul = strtoul(optarg, NULL, 0);
++ OPT_MAX(ul, 255);
++ ph[fh.num_pics - 1].anim_loop = ul;
++ break;
++
++
++ case 30000: /* blob */
++ if (fh.num_blobs >= 65535) {
++ fprintf(stderr, "--%s: Blob array full\n",
++ long_options[option_index].name);
++ break;
++ }
++
++ blob_cur = calloc(1, sizeof(struct blob_entry));
++ if (!blob_cur) {
++ fprintf(stderr, "--%s: Out of memory\n",
++ long_options[option_index].name);
++ break;
++ }
++
++ blob_cur->fn = optarg;
++ if (fh.num_pics)
++ blob_cur->header.picture_id = fh.num_pics - 1;
++
++ if (!blob_first)
++ blob_first = blob_cur;
++ if (blob_last)
++ blob_last->next = blob_cur;
++ blob_last = blob_cur;
++ fh.num_blobs++;
++ break;
++
++ case 30001: /* blob_type */
++ if (!blob_cur) {
++ fprintf(stderr, "--%s: No blob selected\n",
++ long_options[option_index].name);
++ break;
++ }
++
++ ul = strtoul(optarg, NULL, 0);
++ OPT_MAX(ul, 255);
++ blob_cur->header.type = ul;
++ break;
++
++ case 30002: /* blob_picture_id */
++ if (!blob_cur) {
++ fprintf(stderr, "--%s: No blob selected\n",
++ long_options[option_index].name);
++ break;
++ }
++
++ ul = strtoul(optarg, NULL, 0);
++ OPT_MAX(ul, 255);
++ blob_cur->header.picture_id = ul;
++ break;
++
++
++
++ case 'h':
++ case '?':
++ default:
++ print_help(argv[0]);
++ goto EXIT;
++ } /* switch (c) */
++ } /* while ((c = getopt_long(...)) != -1) */
++
++ /* Consume and drop lone arguments */
++ while (optind < argc) {
++ ofn = argv[optind];
++ optind++;
++ }
++
++
++ /* Read file lengths */
++ for (blob_cur = blob_first; blob_cur; blob_cur = blob_cur->next) {
++ FILE *f;
++ long pos;
++ int i;
++
++ if (!blob_cur->fn)
++ continue;
++
++ f = fopen(blob_cur->fn, "rb");
++ if (!f)
++ goto ERR_FILE_LEN;
++
++ if (fseek(f, 0, SEEK_END))
++ goto ERR_FILE_LEN;
++
++ pos = ftell(f);
++ if (pos < 0 || pos > (1 << 30))
++ goto ERR_FILE_LEN;
++
++ blob_cur->header.length = pos;
++
++ fclose(f);
++ continue;
++
++ERR_FILE_LEN:
++ fprintf(stderr, "Error getting file length (or too long): %s\n",
++ blob_cur->fn);
++ if (f)
++ fclose(f);
++ continue;
++ }
++
++
++ /* Set magic headers */
++#if __BYTE_ORDER == __BIG_ENDIAN
++ memcpy(&fh.id[0], BOOTSPLASH_MAGIC_BE, 16);
++#elif __BYTE_ORDER == __LITTLE_ENDIAN
++ memcpy(&fh.id[0], BOOTSPLASH_MAGIC_LE, 16);
++#else
++#error
++#endif
++ fh.version = BOOTSPLASH_VERSION;
++
++ /* Set blob counts */
++ for (blob_cur = blob_first; blob_cur; blob_cur = blob_cur->next) {
++ if (blob_cur->header.picture_id < fh.num_pics)
++ ph[blob_cur->header.picture_id].num_blobs++;
++ }
++
++
++ /* Dump structs */
++ dump_file_header(&fh);
++
++ for (ul = 0; ul < fh.num_pics; ul++)
++ dump_pic_header(&ph[ul]);
++
++ for (blob_cur = blob_first; blob_cur; blob_cur = blob_cur->next)
++ dump_blob(blob_cur);
++
++
++ /* Write to file */
++ printf("Writing splash to file: %s\n", ofn);
++ of = fopen(ofn, "wb");
++ if (!of)
++ goto ERR_WRITING;
++
++ if (fwrite(&fh, sizeof(struct splash_file_header), 1, of) != 1)
++ goto ERR_WRITING;
++
++ for (ul = 0; ul < fh.num_pics; ul++) {
++ if (fwrite(&ph[ul], sizeof(struct splash_pic_header), 1, of)
++ != 1)
++ goto ERR_WRITING;
++ }
++
++ blob_cur = blob_first;
++ while (blob_cur) {
++ struct blob_entry *blob_old = blob_cur;
++ FILE *f;
++ char *buf[256];
++ uint32_t left;
++
++ if (fwrite(&blob_cur->header,
++ sizeof(struct splash_blob_header), 1, of) != 1)
++ goto ERR_WRITING;
++
++ if (!blob_cur->header.length || !blob_cur->fn)
++ continue;
++
++ f = fopen(blob_cur->fn, "rb");
++ if (!f)
++ goto ERR_FILE_COPY;
++
++ left = blob_cur->header.length;
++ while (left >= sizeof(buf)) {
++ if (fread(buf, sizeof(buf), 1, f) != 1)
++ goto ERR_FILE_COPY;
++ if (fwrite(buf, sizeof(buf), 1, of) != 1)
++ goto ERR_FILE_COPY;
++ left -= sizeof(buf);
++ }
++ if (left) {
++ if (fread(buf, left, 1, f) != 1)
++ goto ERR_FILE_COPY;
++ if (fwrite(buf, left, 1, of) != 1)
++ goto ERR_FILE_COPY;
++ }
++
++ /* Pad data stream to 16 bytes */
++ if (left % 16) {
++ if (fwrite("\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0",
++ 16 - (left % 16), 1, of) != 1)
++ goto ERR_FILE_COPY;
++ }
++
++ fclose(f);
++ blob_cur = blob_cur->next;
++ free(blob_old);
++ continue;
++
++ERR_FILE_COPY:
++ if (f)
++ fclose(f);
++ goto ERR_WRITING;
++ }
++
++ fclose(of);
++
++EXIT:
++ return EXIT_SUCCESS;
++
++
++ERR_WRITING:
++ fprintf(stderr, "Error writing splash.\n");
++ fprintf(stderr, "The output file is probably corrupt.\n");
++ if (of)
++ fclose(of);
++
++ while (blob_cur) {
++ struct blob_entry *blob_old = blob_cur;
++
++ blob_cur = blob_cur->next;
++ free(blob_old);
++ }
++
++ return EXIT_FAILURE;
++}
diff --git a/0019-bootsplash.patch b/0019-bootsplash.patch
new file mode 100755
index 000000000000..0924d29e7d48
--- /dev/null
+++ b/0019-bootsplash.patch
@@ -0,0 +1,102 @@
+diff --git a/Documentation/bootsplash.rst b/Documentation/bootsplash.rst
+index b35aba5093e8..d4f132eca615 100644
+--- a/Documentation/bootsplash.rst
++++ b/Documentation/bootsplash.rst
+@@ -195,6 +195,16 @@ Hooks - how the bootsplash is integrated
+
+
+
++Crating a bootsplash theme file
++===============================
++
++A simple tool for theme file creation is included in ``tools/bootsplash``.
++
++There is also an example shell script, as an example on how to use the tool
++and in order to generate a reference bootsplash file.
++
++
++
+ FAQ: Frequently Asked Questions
+ ===============================
+
+diff --git a/tools/bootsplash/.gitignore b/tools/bootsplash/.gitignore
+index 091b99a17567..5dfced41ba82 100644
+--- a/tools/bootsplash/.gitignore
++++ b/tools/bootsplash/.gitignore
+@@ -1 +1,4 @@
+ bootsplash-packer
++bootsplash
++logo.rgb
++throbber*.rgb
+diff --git a/tools/bootsplash/bootsplash-tux.sh b/tools/bootsplash/bootsplash-tux.sh
+new file mode 100755
+index 000000000000..1078f87644b9
+--- /dev/null
++++ b/tools/bootsplash/bootsplash-tux.sh
+@@ -0,0 +1,66 @@
++#!/bin/bash
++#
++# A simple script to show how to create a bootsplash.
++# Do with it whatever you wish.
++#
++# This needs ImageMagick for the 'convert' and 'identify' tools.
++#
++
++LOGO=../../Documentation/logo.gif
++LOGO_WIDTH=$(identify $LOGO | cut -d " " -f 3 | cut -d x -f 1)
++LOGO_HEIGHT=$(identify $LOGO | cut -d " " -f 3 | cut -d x -f 2)
++
++THROBBER=ajax-loader.gif
++THROBBER_WIDTH=$(identify $THROBBER | head -1 | cut -d " " -f 3 | \
++ cut -d x -f 1)
++THROBBER_HEIGHT=$(identify $THROBBER | head -1 | cut -d " " -f 3 | \
++ cut -d x -f 2)
++
++convert -alpha remove \
++ -background "#ff3a40" \
++ $LOGO \
++ logo.rgb
++
++convert -alpha remove \
++ -background "#ff3a40" \
++ $THROBBER \
++ throbber%02d.rgb
++
++
++make clean
++make bootsplash-packer
++
++
++# Let's put Tux in the center of an orange background.
++./bootsplash-packer \
++ --bg_red 0xff \
++ --bg_green 0x3a \
++ --bg_blue 0x40 \
++ --frame_ms 48 \
++ --picture \
++ --pic_width $LOGO_WIDTH \
++ --pic_height $LOGO_HEIGHT \
++ --pic_position 0 \
++ --blob logo.rgb \
++ --picture \
++ --pic_width $THROBBER_WIDTH \
++ --pic_height $THROBBER_HEIGHT \
++ --pic_position 0x14 \
++ --pic_position_offset 20 \
++ --pic_anim_type 1 \
++ --pic_anim_loop 0 \
++ --blob throbber00.rgb \
++ --blob throbber01.rgb \
++ --blob throbber02.rgb \
++ --blob throbber03.rgb \
++ --blob throbber04.rgb \
++ --blob throbber05.rgb \
++ --blob throbber06.rgb \
++ --blob throbber07.rgb \
++ --blob throbber08.rgb \
++ --blob throbber09.rgb \
++ --blob throbber10.rgb \
++ --blob throbber11.rgb \
++ bootsplash
++
++rm *.rgb
diff --git a/PKGBUILD b/PKGBUILD
index c7b275b6bc43..c0d928803de7 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -62,7 +62,7 @@ _localmodcfg=
pkgbase=linux-bootsplash
pkgdesc='Linux kernel with kernel bootsplash support'
-_srcver=5.2.11-arch1
+_srcver=5.5.3-arch1
pkgver=${_srcver%-*}
pkgrel=1
arch=(x86_64)
@@ -70,20 +70,18 @@ url="https://www.kernel.org/"
license=(GPL2)
makedepends=(kmod inetutils bc libelf)
options=('!strip')
-_gcc_more_v='20190714'
source=(
"https://www.kernel.org/pub/linux/kernel/v5.x/linux-$pkgver.tar.xz"
config # the main kernel config file
60-linux.hook # pacman hook for depmod
90-linux.hook # pacman hook for initramfs regeneration
linux.preset # standard config files for mkinitcpio ramdisk
- "enable_additional_cpu_optimizations-$_gcc_more_v.tar.gz::https://github.com/graysky2/kernel_gcc_patch/archive/$_gcc_more_v.tar.gz"
- 0001-add-sysctl-to-disallow-unprivileged-CLONE_NEWUSER-by.patch
- 0002-ZEN-Add-CONFIG-for-unprivileged_userns_clone.patch
- 0003-bootsplash.patch
- 0004-bootsplash.patch
- 0005-bootsplash.patch
- 0006-bootsplash.patch
+ 0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch
+ 0002-iwlwifi-pcie-restore-support-for-Killer-Qu-C0-NICs.patch
+ 0003-iwlwifi-mvm-Do-not-require-PHY_SKU-NVM-section-for-3.patch
+ 0004-drm-i915-Wean-off-drm_pci_alloc-drm_pci_free.patch
+ 0005-drm-Remove-PageReserved-manipulation-from-drm_pci_al.patch
+ 0006-drm-i915-execlists-Always-force-a-context-reload-whe.patch
0007-bootsplash.patch
0008-bootsplash.patch
0009-bootsplash.patch
@@ -93,21 +91,27 @@ source=(
0013-bootsplash.patch
0014-bootsplash.patch
0015-bootsplash.patch
+ 0016-bootsplash.patch
+ 0017-bootsplash.patch
+ 0018-bootsplash.patch
+ 0019-bootsplash.patch
'ajax-loader.gif'
)
validpgpkeys=(
'ABAF11C65A2970B130ABE3C479BE3E4300411886' # Linus Torvalds
'647F28654894E3BD457199BE38DBBDC86092693E' # Greg Kroah-Hartman
)
-sha256sums=('0c2a831f993dc8a8a8e1ca4186b467de72ff173c6f5855e2aab70f6f7fb033f9'
- 'SKIP'
- '1c4d5500a3b4995035c2e940fc0ad2a2dae7be047c8eb20c097444e348258f87'
+sha256sums=('2bef3edcf44c746383045f4a809b2013e18c52319c827875ed8e89138951cab2'
+ '99f9170890845cd168271b4e6d75390dea1106b6aa06c032e3435074de05b95c'
'ae2e95db94ef7176207c690224169594d49445e04249d2499e9d2fbc117a0b21'
'c043f3033bb781e2688794a59f6d1f7ed49ef9b13eb77ff9a425df33a244a636'
'ad6344badc91ad0630caacde83f7f9b97276f80d26a20619a87952be65492c65'
- 'f1abc13a8d859fbf6350040e45d7f04ad551a6d39f113ba96fbbd820118c0e36'
- '91fafa76bf9cb32159ac7f22191b3589278b91e65bc4505cf2fc6013b8037bf3'
- 'ef926edbd866d95464eb86f7565de572eb97ecfa0369d3b2e078016a0e71a871'
+ 'c981eacffe1091fbd4b22fd6359163bea343591c44c7c53573391541eb943d17'
+ 'a25a82ce5a7e84d7a580036a250aa4d2621ab0fdac0f375b40417a207f87cf87'
+ 'd5b209bcd90d11fd83055ffe8aea617776101502908c4aefdc7f6f3bc3a87929'
+ '03bcdd2668403cf7875bab86313cb4719dc35e202f4bb21c61c3646215a15be3'
+ '49a63d402a35dcefe18e858b0c66d0983a075c003fcfb50426fd0ba79639fafe'
+ '8e1e9cf077e774ac579bbaa7cb5932a1f96f50fad7a72fa998b868137c2472d3'
'a504f6cf84094e08eaa3cc5b28440261797bf4f06f04993ee46a20628ff2b53c'
'e096b127a5208f56d368d2cb938933454d7200d70c86b763aa22c38e0ddb8717'
'8c1c880f2caa9c7ae43281a35410203887ea8eae750fe8d360d0c8bf80fcc6e0'
@@ -120,11 +124,12 @@ sha256sums=('0c2a831f993dc8a8a8e1ca4186b467de72ff173c6f5855e2aab70f6f7fb033f9'
'e9f22cbb542591087d2d66dc6dc912b1434330ba3cd13d2df741d869a2c31e89'
'27471eee564ca3149dd271b0817719b5565a9594dc4d884fe3dc51a5f03832bc'
'60e295601e4fb33d9bf65f198c54c7eb07c0d1e91e2ad1e0dd6cd6e142cb266d'
- '035ea4b2a7621054f4560471f45336b981538a40172d8f17285910d4e0e0b3ef'
+ '92a06fecdc3b5d7ea47d0b922cbedd2c227084f7aaf9d70858a3250eb73f740c'
'aebc793d0064383ee6b1625bf3bb32532ec30a5c12bf9117066107d412119123')
-_kernelname=${pkgbase#linux}
-: ${_kernelname:=-ARCH}
+export KBUILD_BUILD_HOST=archlinux
+export KBUILD_BUILD_USER=$pkgbase
+export KBUILD_BUILD_TIMESTAMP="$(date -Ru${SOURCE_DATE_EPOCH:+d @$SOURCE_DATE_EPOCH})"
prepare() {
cd linux-${pkgver}
@@ -151,16 +156,6 @@ prepare() {
# https://bbs.archlinux.org/viewtopic.php?pid=1824594#p1824594
sed -i -e 's/# CONFIG_PSI_DEFAULT_DISABLED is not set/CONFIG_PSI_DEFAULT_DISABLED=y/' ./.config
- # https://github.com/graysky2/kernel_gcc_patch
- msg2 "Applying enable_additional_cpu_optimizations_for_gcc_v9.1+_kernel_v4.13+.patch ..."
- patch -Np1 -i "$srcdir/kernel_gcc_patch-$_gcc_more_v/enable_additional_cpu_optimizations_for_gcc_v9.1+_kernel_v4.13+.patch"
-
- if [ -n "$_subarch" ]; then
- yes "$_subarch" | make oldconfig
- else
- make prepare
- fi
-
### Optionally load needed modules for the make localmodconfig
# See https://aur.archlinux.org/packages/modprobed-db
if [ -n "$_localmodcfg" ]; then
@@ -342,4 +337,4 @@ for _p in "${pkgname[@]}"; do
}"
done
-# vim:set ts=8 sts=2 sw=2 et:
+# vim:set ts=8 sts=2 sw=2 et: \ No newline at end of file
diff --git a/config b/config
index ce36dc7bcc75..04fe326a1ebd 100644
--- a/config
+++ b/config
@@ -1,15 +1,17 @@
#
# Automatically generated file; DO NOT EDIT.
-# Linux/x86 5.2.2 Kernel Configuration
+# Linux/x86 5.4.15-arch1 Kernel Configuration
#
#
-# Compiler: gcc (GCC) 9.1.0
+# Compiler: gcc (GCC) 9.2.0
#
CONFIG_CC_IS_GCC=y
-CONFIG_GCC_VERSION=90100
+CONFIG_GCC_VERSION=90200
CONFIG_CLANG_VERSION=0
+CONFIG_CC_CAN_LINK=y
CONFIG_CC_HAS_ASM_GOTO=y
+CONFIG_CC_HAS_ASM_INLINE=y
CONFIG_CC_HAS_WARN_MAYBE_UNINITIALIZED=y
CONFIG_IRQ_WORK=y
CONFIG_BUILDTIME_EXTABLE_SORT=y
@@ -18,9 +20,9 @@ CONFIG_THREAD_INFO_IN_TASK=y
#
# General setup
#
-CONFIG_SCHED_MUQSS=y
CONFIG_INIT_ENV_ARG_LIMIT=32
# CONFIG_COMPILE_TEST is not set
+# CONFIG_HEADER_TEST is not set
CONFIG_LOCALVERSION=""
CONFIG_LOCALVERSION_AUTO=y
CONFIG_BUILD_SALT=""
@@ -65,7 +67,6 @@ CONFIG_GENERIC_MSI_IRQ_DOMAIN=y
CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y
CONFIG_GENERIC_IRQ_RESERVATION_MODE=y
CONFIG_IRQ_FORCED_THREADING=y
-# CONFIG_FORCE_IRQ_THREADING is not set
CONFIG_SPARSE_IRQ=y
# CONFIG_GENERIC_IRQ_DEBUGFS is not set
# end of IRQ subsystem
@@ -87,9 +88,7 @@ CONFIG_TICK_ONESHOT=y
CONFIG_NO_HZ_COMMON=y
# CONFIG_HZ_PERIODIC is not set
CONFIG_NO_HZ_IDLE=y
-# CONFIG_NO_HZ_FULL_NODEF is not set
-CONFIG_CONTEXT_TRACKING=y
-# CONFIG_CONTEXT_TRACKING_FORCE is not set
+# CONFIG_NO_HZ_FULL is not set
CONFIG_NO_HZ=y
CONFIG_HIGH_RES_TIMERS=y
# end of Timers subsystem
@@ -98,13 +97,13 @@ CONFIG_HIGH_RES_TIMERS=y
# CONFIG_PREEMPT_VOLUNTARY is not set
CONFIG_PREEMPT=y
CONFIG_PREEMPT_COUNT=y
+CONFIG_PREEMPTION=y
#
# CPU/Task time and stats accounting
#
-CONFIG_VIRT_CPU_ACCOUNTING=y
-# CONFIG_TICK_CPU_ACCOUNTING is not set
-CONFIG_VIRT_CPU_ACCOUNTING_GEN=y
+CONFIG_TICK_CPU_ACCOUNTING=y
+# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set
CONFIG_IRQ_TIME_ACCOUNTING=y
CONFIG_HAVE_SCHED_AVG_IRQ=y
CONFIG_BSD_PROCESS_ACCT=y
@@ -114,7 +113,7 @@ CONFIG_TASK_DELAY_ACCT=y
CONFIG_TASK_XACCT=y
CONFIG_TASK_IO_ACCOUNTING=y
CONFIG_PSI=y
-CONFIG_PSI_DEFAULT_DISABLED=y
+# CONFIG_PSI_DEFAULT_DISABLED is not set
# end of CPU/Task time and stats accounting
CONFIG_CPU_ISOLATION=y
@@ -129,12 +128,12 @@ CONFIG_TREE_SRCU=y
CONFIG_TASKS_RCU=y
CONFIG_RCU_STALL_COMMON=y
CONFIG_RCU_NEED_SEGCBLIST=y
-CONFIG_RCU_FANOUT=32
+CONFIG_RCU_FANOUT=64
CONFIG_RCU_FANOUT_LEAF=16
CONFIG_RCU_FAST_NO_HZ=y
CONFIG_RCU_BOOST=y
CONFIG_RCU_BOOST_DELAY=500
-CONFIG_RCU_NOCB_CPU=y
+# CONFIG_RCU_NOCB_CPU is not set
# end of RCU Subsystem
CONFIG_BUILD_BIN2C=y
@@ -145,9 +144,19 @@ CONFIG_LOG_BUF_SHIFT=17
CONFIG_LOG_CPU_MAX_BUF_SHIFT=12
CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13
CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y
+
+#
+# Scheduler features
+#
+CONFIG_UCLAMP_TASK=y
+CONFIG_UCLAMP_BUCKETS_COUNT=5
+# end of Scheduler features
+
CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y
CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y
CONFIG_ARCH_SUPPORTS_INT128=y
+CONFIG_NUMA_BALANCING=y
+CONFIG_NUMA_BALANCING_DEFAULT_ENABLED=y
CONFIG_CGROUPS=y
CONFIG_PAGE_COUNTER=y
CONFIG_MEMCG=y
@@ -155,9 +164,12 @@ CONFIG_MEMCG_SWAP=y
CONFIG_MEMCG_SWAP_ENABLED=y
CONFIG_MEMCG_KMEM=y
CONFIG_BLK_CGROUP=y
-# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_CGROUP_WRITEBACK=y
CONFIG_CGROUP_SCHED=y
+CONFIG_FAIR_GROUP_SCHED=y
+CONFIG_CFS_BANDWIDTH=y
+# CONFIG_RT_GROUP_SCHED is not set
+CONFIG_UCLAMP_TASK_GROUP=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_RDMA=y
CONFIG_CGROUP_FREEZER=y
@@ -165,6 +177,7 @@ CONFIG_CGROUP_HUGETLB=y
CONFIG_CPUSETS=y
CONFIG_PROC_PID_CPUSET=y
CONFIG_CGROUP_DEVICE=y
+CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_BPF=y
# CONFIG_CGROUP_DEBUG is not set
@@ -177,6 +190,7 @@ CONFIG_USER_NS_UNPRIVILEGED=y
CONFIG_PID_NS=y
CONFIG_NET_NS=y
CONFIG_CHECKPOINT_RESTORE=y
+CONFIG_SCHED_AUTOGROUP=y
# CONFIG_SYSFS_DEPRECATED is not set
CONFIG_RELAY=y
CONFIG_BLK_DEV_INITRD=y
@@ -251,7 +265,7 @@ CONFIG_SLAB_MERGE_DEFAULT=y
CONFIG_SLAB_FREELIST_RANDOM=y
CONFIG_SLAB_FREELIST_HARDENED=y
CONFIG_SHUFFLE_PAGE_ALLOCATOR=y
-# CONFIG_SLUB_CPU_PARTIAL is not set
+CONFIG_SLUB_CPU_PARTIAL=y
CONFIG_SYSTEM_DATA_VERIFICATION=y
CONFIG_PROFILING=y
CONFIG_TRACEPOINTS=y
@@ -283,7 +297,6 @@ CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y
CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
CONFIG_ARCH_SUSPEND_POSSIBLE=y
-CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y
CONFIG_ARCH_WANT_GENERAL_HUGETLB=y
CONFIG_ZONE_DMA32=y
CONFIG_AUDIT_ARCH=y
@@ -293,7 +306,7 @@ CONFIG_X86_64_SMP=y
CONFIG_ARCH_SUPPORTS_UPROBES=y
CONFIG_FIX_EARLYCON_MEM=y
CONFIG_DYNAMIC_PHYSICAL_MASK=y
-CONFIG_PGTABLE_LEVELS=4
+CONFIG_PGTABLE_LEVELS=5
CONFIG_CC_HAS_SANE_STACKPROTECTOR=y
#
@@ -319,6 +332,7 @@ CONFIG_PARAVIRT=y
CONFIG_PARAVIRT_XXL=y
# CONFIG_PARAVIRT_DEBUG is not set
CONFIG_PARAVIRT_SPINLOCKS=y
+CONFIG_X86_HV_CALLBACK_VECTOR=y
CONFIG_XEN=y
CONFIG_XEN_PV=y
CONFIG_XEN_PV_SMP=y
@@ -330,11 +344,13 @@ CONFIG_XEN_SAVE_RESTORE=y
# CONFIG_XEN_DEBUG_FS is not set
CONFIG_XEN_PVH=y
CONFIG_KVM_GUEST=y
+CONFIG_ARCH_CPUIDLE_HALTPOLL=y
CONFIG_PVH=y
# CONFIG_KVM_DEBUG_FS is not set
CONFIG_PARAVIRT_TIME_ACCOUNTING=y
CONFIG_PARAVIRT_CLOCK=y
CONFIG_JAILHOUSE_GUEST=y
+CONFIG_ACRN_GUEST=y
# CONFIG_MK8 is not set
# CONFIG_MPSC is not set
# CONFIG_MCORE2 is not set
@@ -352,6 +368,7 @@ CONFIG_CPU_SUP_INTEL=y
CONFIG_CPU_SUP_AMD=y
CONFIG_CPU_SUP_HYGON=y
CONFIG_CPU_SUP_CENTAUR=y
+CONFIG_CPU_SUP_ZHAOXIN=y
CONFIG_HPET_TIMER=y
CONFIG_HPET_EMULATE_RTC=y
CONFIG_DMI=y
@@ -364,15 +381,8 @@ CONFIG_NR_CPUS_RANGE_END=512
CONFIG_NR_CPUS_DEFAULT=64
CONFIG_NR_CPUS=320
CONFIG_SCHED_SMT=y
-CONFIG_SMT_NICE=y
CONFIG_SCHED_MC=y
CONFIG_SCHED_MC_PRIO=y
-# CONFIG_RQ_NONE is not set
-# CONFIG_RQ_SMT is not set
-CONFIG_RQ_MC=y
-# CONFIG_RQ_SMP is not set
-# CONFIG_RQ_ALL is not set
-CONFIG_SHARERQ=2
CONFIG_X86_LOCAL_APIC=y
CONFIG_X86_IO_APIC=y
CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y
@@ -403,10 +413,9 @@ CONFIG_MICROCODE_AMD=y
CONFIG_MICROCODE_OLD_INTERFACE=y
CONFIG_X86_MSR=m
CONFIG_X86_CPUID=m
-# CONFIG_X86_5LEVEL is not set
+CONFIG_X86_5LEVEL=y
CONFIG_X86_DIRECT_GBPAGES=y
# CONFIG_X86_CPA_STATISTICS is not set
-CONFIG_ARCH_HAS_MEM_ENCRYPT=y
CONFIG_AMD_MEM_ENCRYPT=y
# CONFIG_AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT is not set
CONFIG_NUMA=y
@@ -437,20 +446,23 @@ CONFIG_X86_SMAP=y
CONFIG_X86_INTEL_UMIP=y
# CONFIG_X86_INTEL_MPX is not set
CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS=y
+# CONFIG_X86_INTEL_TSX_MODE_OFF is not set
+# CONFIG_X86_INTEL_TSX_MODE_ON is not set
+CONFIG_X86_INTEL_TSX_MODE_AUTO=y
CONFIG_EFI=y
CONFIG_EFI_STUB=y
CONFIG_EFI_MIXED=y
CONFIG_SECCOMP=y
-CONFIG_HZ_100=y
-# CONFIG_HZ_250_NODEF is not set
-# CONFIG_HZ_300_NODEF is not set
-# CONFIG_HZ_1000_NODEF is not set
-CONFIG_HZ=100
+# CONFIG_HZ_100 is not set
+# CONFIG_HZ_250 is not set
+CONFIG_HZ_300=y
+# CONFIG_HZ_1000 is not set
+CONFIG_HZ=300
CONFIG_SCHED_HRTICK=y
CONFIG_KEXEC=y
CONFIG_KEXEC_FILE=y
CONFIG_ARCH_HAS_KEXEC_PURGATORY=y
-# CONFIG_KEXEC_VERIFY_SIG is not set
+# CONFIG_KEXEC_SIG is not set
CONFIG_CRASH_DUMP=y
CONFIG_KEXEC_JUMP=y
CONFIG_PHYSICAL_START=0x1000000
@@ -466,7 +478,8 @@ CONFIG_HOTPLUG_CPU=y
# CONFIG_DEBUG_HOTPLUG_CPU0 is not set
# CONFIG_COMPAT_VDSO is not set
# CONFIG_LEGACY_VSYSCALL_EMULATE is not set
-CONFIG_LEGACY_VSYSCALL_NONE=y
+CONFIG_LEGACY_VSYSCALL_XONLY=y
+# CONFIG_LEGACY_VSYSCALL_NONE is not set
# CONFIG_CMDLINE_BOOL is not set
CONFIG_MODIFY_LDT_SYSCALL=y
CONFIG_HAVE_LIVEPATCH=y
@@ -625,6 +638,8 @@ CONFIG_CPU_IDLE=y
CONFIG_CPU_IDLE_GOV_LADDER=y
CONFIG_CPU_IDLE_GOV_MENU=y
CONFIG_CPU_IDLE_GOV_TEO=y
+CONFIG_CPU_IDLE_GOV_HALTPOLL=y
+CONFIG_HALTPOLL_CPUIDLE=m
# end of CPU Idle
CONFIG_INTEL_IDLE=y
@@ -656,7 +671,6 @@ CONFIG_SYSVIPC_COMPAT=y
# end of Binary Emulations
CONFIG_X86_DEV_DMA_OPS=y
-CONFIG_HAVE_GENERIC_GUP=y
#
# Firmware Drivers
@@ -671,7 +685,14 @@ CONFIG_ISCSI_IBFT_FIND=y
CONFIG_ISCSI_IBFT=m
CONFIG_FW_CFG_SYSFS=m
# CONFIG_FW_CFG_SYSFS_CMDLINE is not set
-# CONFIG_GOOGLE_FIRMWARE is not set
+CONFIG_GOOGLE_FIRMWARE=y
+# CONFIG_GOOGLE_SMI is not set
+CONFIG_GOOGLE_COREBOOT_TABLE=m
+CONFIG_GOOGLE_MEMCONSOLE=m
+# CONFIG_GOOGLE_MEMCONSOLE_X86_LEGACY is not set
+CONFIG_GOOGLE_FRAMEBUFFER_COREBOOT=m
+CONFIG_GOOGLE_MEMCONSOLE_COREBOOT=m
+CONFIG_GOOGLE_VPD=m
#
# EFI (Extensible Firmware Interface) Support
@@ -685,6 +706,7 @@ CONFIG_EFI_CAPSULE_LOADER=m
# CONFIG_EFI_TEST is not set
CONFIG_APPLE_PROPERTIES=y
# CONFIG_RESET_ATTACK_MITIGATION is not set
+CONFIG_EFI_RCI2_TABLE=y
# end of EFI (Extensible Firmware Interface) Support
CONFIG_UEFI_CPER=y
@@ -711,6 +733,7 @@ CONFIG_KVM_VFIO=y
CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y
CONFIG_KVM_COMPAT=y
CONFIG_HAVE_KVM_IRQ_BYPASS=y
+CONFIG_HAVE_KVM_NO_POLL=y
CONFIG_VIRTUALIZATION=y
CONFIG_KVM=m
CONFIG_KVM_INTEL=m
@@ -758,6 +781,7 @@ CONFIG_ARCH_HAS_SET_MEMORY=y
CONFIG_ARCH_HAS_SET_DIRECT_MAP=y
CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y
CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y
+CONFIG_HAVE_ASM_MODVERSIONS=y
CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
CONFIG_HAVE_RSEQ=y
CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y
@@ -793,6 +817,7 @@ CONFIG_HAVE_MOVE_PMD=y
CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y
CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y
CONFIG_HAVE_ARCH_HUGE_VMAP=y
+CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y
CONFIG_HAVE_ARCH_SOFT_DIRTY=y
CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
CONFIG_MODULES_USE_ELF_RELA=y
@@ -823,6 +848,7 @@ CONFIG_ARCH_HAS_REFCOUNT=y
CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y
CONFIG_ARCH_USE_MEMREMAP_PROT=y
CONFIG_LOCK_EVENT_COUNTS=y
+CONFIG_ARCH_HAS_MEM_ENCRYPT=y
#
# GCOV-based kernel profiling
@@ -834,18 +860,14 @@ CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
CONFIG_PLUGIN_HOSTCC="g++"
CONFIG_HAVE_GCC_PLUGINS=y
CONFIG_GCC_PLUGINS=y
-
-#
-# GCC plugins
-#
# CONFIG_GCC_PLUGIN_CYC_COMPLEXITY is not set
# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set
# CONFIG_GCC_PLUGIN_RANDSTRUCT is not set
-# end of GCC plugins
# end of General architecture-dependent options
CONFIG_RT_MUTEXES=y
CONFIG_BASE_SMALL=0
+CONFIG_MODULE_SIG_FORMAT=y
CONFIG_MODULES=y
CONFIG_MODULE_FORCE_LOAD=y
CONFIG_MODULE_UNLOAD=y
@@ -864,8 +886,11 @@ CONFIG_MODULE_SIG_HASH="sha512"
CONFIG_MODULE_COMPRESS=y
# CONFIG_MODULE_COMPRESS_GZIP is not set
CONFIG_MODULE_COMPRESS_XZ=y
+CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS=y
+CONFIG_UNUSED_SYMBOLS=y
CONFIG_MODULES_TREE_LOOKUP=y
CONFIG_BLOCK=y
+CONFIG_BLK_RQ_ALLOC_TIME=y
CONFIG_BLK_SCSI_REQUEST=y
CONFIG_BLK_DEV_BSG=y
CONFIG_BLK_DEV_BSGLIB=y
@@ -876,6 +901,7 @@ CONFIG_BLK_DEV_THROTTLING_LOW=y
# CONFIG_BLK_CMDLINE_PARSER is not set
CONFIG_BLK_WBT=y
CONFIG_BLK_CGROUP_IOLATENCY=y
+CONFIG_BLK_CGROUP_IOCOST=y
CONFIG_BLK_WBT_MQ=y
CONFIG_BLK_DEBUG_FS=y
CONFIG_BLK_DEBUG_FS_ZONED=y
@@ -920,6 +946,7 @@ CONFIG_MQ_IOSCHED_DEADLINE=y
CONFIG_MQ_IOSCHED_KYBER=y
CONFIG_IOSCHED_BFQ=y
CONFIG_BFQ_GROUP_IOSCHED=y
+# CONFIG_BFQ_CGROUP_DEBUG is not set
# end of IO Schedulers
CONFIG_PREEMPT_NOTIFIERS=y
@@ -962,6 +989,7 @@ CONFIG_SPARSEMEM_EXTREME=y
CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
CONFIG_SPARSEMEM_VMEMMAP=y
CONFIG_HAVE_MEMBLOCK_NODE_MAP=y
+CONFIG_HAVE_FAST_GUP=y
CONFIG_MEMORY_ISOLATION=y
CONFIG_HAVE_BOOTMEM_INFO_NODE=y
CONFIG_MEMORY_HOTPLUG=y
@@ -1003,22 +1031,17 @@ CONFIG_ZSMALLOC=y
CONFIG_GENERIC_EARLY_IOREMAP=y
# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set
# CONFIG_IDLE_PAGE_TRACKING is not set
-CONFIG_ARCH_HAS_ZONE_DEVICE=y
+CONFIG_ARCH_HAS_PTE_DEVMAP=y
CONFIG_ZONE_DEVICE=y
-CONFIG_ARCH_HAS_HMM_MIRROR=y
-CONFIG_ARCH_HAS_HMM_DEVICE=y
-CONFIG_ARCH_HAS_HMM=y
-CONFIG_MIGRATE_VMA_HELPER=y
CONFIG_DEV_PAGEMAP_OPS=y
-CONFIG_HMM=y
CONFIG_HMM_MIRROR=y
CONFIG_DEVICE_PRIVATE=y
-CONFIG_DEVICE_PUBLIC=y
CONFIG_FRAME_VECTOR=y
CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y
CONFIG_ARCH_HAS_PKEYS=y
# CONFIG_PERCPU_STATS is not set
# CONFIG_GUP_BENCHMARK is not set
+CONFIG_READ_ONLY_THP_FOR_FS=y
CONFIG_ARCH_HAS_PTE_SPECIAL=y
# end of Memory Management options
@@ -1224,6 +1247,7 @@ CONFIG_NFT_XFRM=m
CONFIG_NFT_SOCKET=m
CONFIG_NFT_OSF=m
CONFIG_NFT_TPROXY=m
+CONFIG_NFT_SYNPROXY=m
CONFIG_NF_DUP_NETDEV=m
CONFIG_NFT_DUP_NETDEV=m
CONFIG_NFT_FWD_NETDEV=m
@@ -1467,9 +1491,11 @@ CONFIG_IP6_NF_TARGET_NPT=m
# end of IPv6: Netfilter Configuration
CONFIG_NF_DEFRAG_IPV6=m
-CONFIG_NF_TABLES_BRIDGE=y
+CONFIG_NF_TABLES_BRIDGE=m
+CONFIG_NFT_BRIDGE_META=m
CONFIG_NFT_BRIDGE_REJECT=m
CONFIG_NF_LOG_BRIDGE=m
+CONFIG_NF_CONNTRACK_BRIDGE=m
CONFIG_BRIDGE_NF_EBTABLES=m
CONFIG_BRIDGE_EBT_BROUTE=m
CONFIG_BRIDGE_EBT_T_FILTER=m
@@ -1554,9 +1580,7 @@ CONFIG_NET_DSA_TAG_GSWIP=m
CONFIG_NET_DSA_TAG_DSA=m
CONFIG_NET_DSA_TAG_EDSA=m
CONFIG_NET_DSA_TAG_MTK=m
-CONFIG_NET_DSA_TAG_KSZ_COMMON=m
CONFIG_NET_DSA_TAG_KSZ=m
-CONFIG_NET_DSA_TAG_KSZ9477=m
CONFIG_NET_DSA_TAG_QCA=m
CONFIG_NET_DSA_TAG_LAN9303=m
CONFIG_NET_DSA_TAG_SJA1105=m
@@ -1675,16 +1699,19 @@ CONFIG_NET_ACT_PEDIT=m
CONFIG_NET_ACT_SIMP=m
CONFIG_NET_ACT_SKBEDIT=m
CONFIG_NET_ACT_CSUM=m
+CONFIG_NET_ACT_MPLS=m
CONFIG_NET_ACT_VLAN=m
CONFIG_NET_ACT_BPF=m
CONFIG_NET_ACT_CONNMARK=m
+CONFIG_NET_ACT_CTINFO=m
CONFIG_NET_ACT_SKBMOD=m
CONFIG_NET_ACT_IFE=m
CONFIG_NET_ACT_TUNNEL_KEY=m
+CONFIG_NET_ACT_CT=m
CONFIG_NET_IFE_SKBMARK=m
CONFIG_NET_IFE_SKBPRIO=m
CONFIG_NET_IFE_SKBTCINDEX=m
-CONFIG_NET_CLS_IND=y
+CONFIG_NET_TC_SKB_EXT=y
CONFIG_NET_SCH_FIFO=y
CONFIG_DCB=y
CONFIG_DNS_RESOLVER=m
@@ -1734,7 +1761,7 @@ CONFIG_NET_FLOW_LIMIT=y
# Network testing
#
CONFIG_NET_PKTGEN=m
-CONFIG_NET_DROP_MONITOR=m
+CONFIG_NET_DROP_MONITOR=y
# end of Network testing
# end of Networking options
@@ -1764,6 +1791,7 @@ CONFIG_CAN=m
CONFIG_CAN_RAW=m
CONFIG_CAN_BCM=m
CONFIG_CAN_GW=m
+CONFIG_CAN_J1939=m
#
# CAN Device Drivers
@@ -1776,6 +1804,7 @@ CONFIG_CAN_CALC_BITTIMING=y
CONFIG_CAN_FLEXCAN=m
CONFIG_CAN_GRCAN=m
CONFIG_CAN_JANZ_ICAN3=m
+CONFIG_CAN_KVASER_PCIEFD=m
CONFIG_CAN_C_CAN=m
CONFIG_CAN_C_CAN_PLATFORM=m
CONFIG_CAN_C_CAN_PCI=m
@@ -1784,17 +1813,20 @@ CONFIG_CAN_CC770=m
CONFIG_CAN_CC770_PLATFORM=m
CONFIG_CAN_IFI_CANFD=m
CONFIG_CAN_M_CAN=m
+CONFIG_CAN_M_CAN_PLATFORM=m
+CONFIG_CAN_M_CAN_TCAN4X5X=m
CONFIG_CAN_PEAK_PCIEFD=m
CONFIG_CAN_SJA1000=m
-# CONFIG_CAN_SJA1000_ISA is not set
-CONFIG_CAN_SJA1000_PLATFORM=m
-# CONFIG_CAN_EMS_PCMCIA is not set
CONFIG_CAN_EMS_PCI=m
-CONFIG_CAN_PEAK_PCMCIA=m
+# CONFIG_CAN_EMS_PCMCIA is not set
+CONFIG_CAN_F81601=m
+CONFIG_CAN_KVASER_PCI=m
CONFIG_CAN_PEAK_PCI=m
CONFIG_CAN_PEAK_PCIEC=y
-CONFIG_CAN_KVASER_PCI=m
+CONFIG_CAN_PEAK_PCMCIA=m
CONFIG_CAN_PLX_PCI=m
+# CONFIG_CAN_SJA1000_ISA is not set
+CONFIG_CAN_SJA1000_PLATFORM=m
CONFIG_CAN_SOFTING=m
CONFIG_CAN_SOFTING_CS=m
@@ -1847,6 +1879,7 @@ CONFIG_BT_QCA=m
CONFIG_BT_HCIBTUSB=m
CONFIG_BT_HCIBTUSB_AUTOSUSPEND=y
CONFIG_BT_HCIBTUSB_BCM=y
+CONFIG_BT_HCIBTUSB_MTK=y
CONFIG_BT_HCIBTUSB_RTL=y
CONFIG_BT_HCIBTSDIO=m
CONFIG_BT_HCIUART=m
@@ -2059,6 +2092,7 @@ CONFIG_PCI_HOST_COMMON=y
CONFIG_PCI_HOST_GENERIC=y
CONFIG_PCIE_XILINX=y
CONFIG_VMD=m
+CONFIG_PCI_HYPERV_INTERFACE=m
#
# DesignWare PCI Core Support
@@ -2137,8 +2171,10 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
# Firmware loader
#
CONFIG_FW_LOADER=y
+CONFIG_FW_LOADER_PAGED_BUF=y
CONFIG_EXTRA_FIRMWARE=""
# CONFIG_FW_LOADER_USER_HELPER is not set
+CONFIG_FW_LOADER_COMPRESS=y
# end of Firmware loader
CONFIG_WANT_DEV_COREDUMP=y
@@ -2160,7 +2196,8 @@ CONFIG_REGMAP_SPMI=m
CONFIG_REGMAP_W1=m
CONFIG_REGMAP_MMIO=y
CONFIG_REGMAP_IRQ=y
-CONFIG_REGMAP_SOUNDWIRE=m
+CONFIG_REGMAP_SCCB=m
+CONFIG_REGMAP_I3C=m
CONFIG_DMA_SHARED_BUFFER=y
# CONFIG_DMA_FENCE_TRACE is not set
# end of Generic Driver Options
@@ -2168,6 +2205,7 @@ CONFIG_DMA_SHARED_BUFFER=y
#
# Bus devices
#
+CONFIG_MOXTET=m
CONFIG_SIMPLE_PM_BUS=y
# end of Bus devices
@@ -2180,13 +2218,13 @@ CONFIG_GNSS_SIRF_SERIAL=m
CONFIG_GNSS_UBX_SERIAL=m
CONFIG_MTD=m
CONFIG_MTD_TESTS=m
-CONFIG_MTD_CMDLINE_PARTS=m
-CONFIG_MTD_OF_PARTS=m
-CONFIG_MTD_AR7_PARTS=m
#
# Partition parsers
#
+CONFIG_MTD_AR7_PARTS=m
+CONFIG_MTD_CMDLINE_PARTS=m
+CONFIG_MTD_OF_PARTS=m
CONFIG_MTD_REDBOOT_PARTS=m
CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
@@ -2265,7 +2303,6 @@ CONFIG_MTD_PMC551=m
CONFIG_MTD_DATAFLASH=m
# CONFIG_MTD_DATAFLASH_WRITE_VERIFY is not set
CONFIG_MTD_DATAFLASH_OTP=y
-CONFIG_MTD_M25P80=m
CONFIG_MTD_MCHP23K256=m
CONFIG_MTD_SST25L=m
CONFIG_MTD_SLRAM=m
@@ -2301,6 +2338,7 @@ CONFIG_MTD_NAND_DENALI=m
CONFIG_MTD_NAND_DENALI_PCI=m
CONFIG_MTD_NAND_DENALI_DT=m
CONFIG_MTD_NAND_CAFE=m
+CONFIG_MTD_NAND_MXIC=m
CONFIG_MTD_NAND_GPIO=m
CONFIG_MTD_NAND_PLATFORM=m
@@ -2335,6 +2373,7 @@ CONFIG_MTD_UBI_BEB_LIMIT=20
CONFIG_MTD_UBI_FASTMAP=y
CONFIG_MTD_UBI_GLUEBI=m
CONFIG_MTD_UBI_BLOCK=y
+CONFIG_MTD_HYPERBUS=m
CONFIG_DTC=y
CONFIG_OF=y
# CONFIG_OF_UNITTEST is not set
@@ -2424,7 +2463,6 @@ CONFIG_AD525X_DPOT_SPI=m
# CONFIG_DUMMY_IRQ is not set
CONFIG_IBM_ASM=m
CONFIG_PHANTOM=m
-CONFIG_SGI_IOC4=m
CONFIG_TIFM_CORE=m
CONFIG_TIFM_7XX1=m
CONFIG_ICS932S401=m
@@ -2439,10 +2477,10 @@ CONFIG_SENSORS_APDS990X=m
CONFIG_HMC6352=m
CONFIG_DS1682=m
CONFIG_VMWARE_BALLOON=m
-CONFIG_USB_SWITCH_FSA9480=m
CONFIG_LATTICE_ECP3_CONFIG=m
# CONFIG_SRAM is not set
CONFIG_PCI_ENDPOINT_TEST=m
+CONFIG_XILINX_SDFEC=m
CONFIG_MISC_RTSX=m
CONFIG_PVPANIC=m
CONFIG_C2PORT=m
@@ -2552,7 +2590,6 @@ CONFIG_SCSI_PROC_FS=y
#
CONFIG_BLK_DEV_SD=m
CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
CONFIG_BLK_DEV_SR=m
CONFIG_BLK_DEV_SR_VENDOR=y
CONFIG_CHR_DEV_SG=m
@@ -2643,6 +2680,8 @@ CONFIG_FCOE_FNIC=m
CONFIG_SCSI_SNIC=m
# CONFIG_SCSI_SNIC_DEBUG_FS is not set
CONFIG_SCSI_DMX3191D=m
+CONFIG_SCSI_FDOMAIN=m
+CONFIG_SCSI_FDOMAIN_PCI=m
CONFIG_SCSI_GDTH=m
CONFIG_SCSI_ISCI=m
CONFIG_SCSI_IPS=m
@@ -2681,6 +2720,7 @@ CONFIG_SCSI_VIRTIO=m
CONFIG_SCSI_CHELSIO_FCOE=m
CONFIG_SCSI_LOWLEVEL_PCMCIA=y
CONFIG_PCMCIA_AHA152X=m
+CONFIG_PCMCIA_FDOMAIN=m
CONFIG_PCMCIA_QLOGIC=m
CONFIG_PCMCIA_SYM53C500=m
CONFIG_SCSI_DH=y
@@ -2817,6 +2857,7 @@ CONFIG_DM_CACHE=m
CONFIG_DM_CACHE_SMQ=m
CONFIG_DM_WRITECACHE=m
CONFIG_DM_ERA=m
+CONFIG_DM_CLONE=m
CONFIG_DM_MIRROR=m
CONFIG_DM_LOG_USERSPACE=m
CONFIG_DM_RAID=m
@@ -2829,6 +2870,7 @@ CONFIG_DM_DUST=m
CONFIG_DM_UEVENT=y
CONFIG_DM_FLAKEY=m
CONFIG_DM_VERITY=m
+CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG=y
CONFIG_DM_VERITY_FEC=y
CONFIG_DM_SWITCH=m
CONFIG_DM_LOG_WRITES=m
@@ -2962,17 +3004,24 @@ CONFIG_NET_DSA_MT7530=m
CONFIG_NET_DSA_MV88E6060=m
CONFIG_NET_DSA_MICROCHIP_KSZ_COMMON=m
CONFIG_NET_DSA_MICROCHIP_KSZ9477=m
+CONFIG_NET_DSA_MICROCHIP_KSZ9477_I2C=m
CONFIG_NET_DSA_MICROCHIP_KSZ9477_SPI=m
+CONFIG_NET_DSA_MICROCHIP_KSZ8795=m
+CONFIG_NET_DSA_MICROCHIP_KSZ8795_SPI=m
CONFIG_NET_DSA_MV88E6XXX=m
CONFIG_NET_DSA_MV88E6XXX_GLOBAL2=y
CONFIG_NET_DSA_MV88E6XXX_PTP=y
CONFIG_NET_DSA_SJA1105=m
+CONFIG_NET_DSA_SJA1105_PTP=y
+CONFIG_NET_DSA_SJA1105_TAS=y
CONFIG_NET_DSA_QCA8K=m
CONFIG_NET_DSA_REALTEK_SMI=m
CONFIG_NET_DSA_SMSC_LAN9303=m
CONFIG_NET_DSA_SMSC_LAN9303_I2C=m
CONFIG_NET_DSA_SMSC_LAN9303_MDIO=m
CONFIG_NET_DSA_VITESSE_VSC73XX=m
+CONFIG_NET_DSA_VITESSE_VSC73XX_SPI=m
+CONFIG_NET_DSA_VITESSE_VSC73XX_PLATFORM=m
# end of Distributed Switch Architecture drivers
CONFIG_ETHERNET=y
@@ -3088,6 +3137,8 @@ CONFIG_NET_VENDOR_EZCHIP=y
CONFIG_EZCHIP_NPS_MANAGEMENT_ENET=m
CONFIG_NET_VENDOR_FUJITSU=y
CONFIG_PCMCIA_FMVJ18X=m
+CONFIG_NET_VENDOR_GOOGLE=y
+CONFIG_GVE=m
CONFIG_NET_VENDOR_HP=y
CONFIG_HP100=m
CONFIG_NET_VENDOR_HUAWEI=y
@@ -3141,8 +3192,12 @@ CONFIG_MLX5_MPFS=y
CONFIG_MLX5_ESWITCH=y
CONFIG_MLX5_CORE_EN_DCB=y
CONFIG_MLX5_CORE_IPOIB=y
+CONFIG_MLX5_FPGA_IPSEC=y
CONFIG_MLX5_EN_IPSEC=y
+CONFIG_MLX5_FPGA_TLS=y
+CONFIG_MLX5_TLS=y
CONFIG_MLX5_EN_TLS=y
+CONFIG_MLX5_SW_STEERING=y
CONFIG_MLXSW_CORE=m
CONFIG_MLXSW_CORE_HWMON=y
CONFIG_MLXSW_CORE_THERMAL=y
@@ -3196,13 +3251,14 @@ CONFIG_ETHOC=m
CONFIG_NET_VENDOR_PACKET_ENGINES=y
CONFIG_HAMACHI=m
CONFIG_YELLOWFIN=m
+CONFIG_NET_VENDOR_PENSANDO=y
+CONFIG_IONIC=m
CONFIG_NET_VENDOR_QLOGIC=y
CONFIG_QLA3XXX=m
CONFIG_QLCNIC=m
CONFIG_QLCNIC_SRIOV=y
CONFIG_QLCNIC_DCB=y
CONFIG_QLCNIC_HWMON=y
-CONFIG_QLGE=m
CONFIG_NETXEN_NIC=m
CONFIG_QED=m
CONFIG_QED_LL2=y
@@ -3256,6 +3312,7 @@ CONFIG_SMSC9420=m
CONFIG_NET_VENDOR_SOCIONEXT=y
CONFIG_NET_VENDOR_STMICRO=y
CONFIG_STMMAC_ETH=m
+# CONFIG_STMMAC_SELFTESTS is not set
CONFIG_STMMAC_PLATFORM=m
CONFIG_DWMAC_DWC_QOS_ETH=m
CONFIG_DWMAC_GENERIC=m
@@ -3285,6 +3342,7 @@ CONFIG_WIZNET_W5300=m
CONFIG_WIZNET_BUS_ANY=y
CONFIG_WIZNET_W5100_SPI=m
CONFIG_NET_VENDOR_XILINX=y
+CONFIG_XILINX_AXI_EMAC=m
CONFIG_XILINX_LL_TEMAC=m
CONFIG_NET_VENDOR_XIRCOM=y
CONFIG_PCMCIA_XIRC2PS=m
@@ -3318,6 +3376,7 @@ CONFIG_LED_TRIGGER_PHY=y
# MII PHY device drivers
#
CONFIG_SFP=m
+CONFIG_ADIN_PHY=m
CONFIG_AMD_PHY=m
CONFIG_AQUANTIA_PHY=m
CONFIG_AX88796B_PHY=m
@@ -3345,6 +3404,7 @@ CONFIG_MICROCHIP_PHY=m
CONFIG_MICROCHIP_T1_PHY=m
CONFIG_MICROSEMI_PHY=m
CONFIG_NATIONAL_PHY=m
+CONFIG_NXP_TJA11XX_PHY=m
CONFIG_QSEMI_PHY=m
CONFIG_REALTEK_PHY=m
CONFIG_RENESAS_PHY=m
@@ -3443,6 +3503,7 @@ CONFIG_ATH9K_WOW=y
CONFIG_ATH9K_RFKILL=y
CONFIG_ATH9K_CHANNEL_CONTEXT=y
CONFIG_ATH9K_PCOEM=y
+CONFIG_ATH9K_PCI_NO_EEPROM=m
CONFIG_ATH9K_HTC=m
CONFIG_ATH9K_HTC_DEBUGFS=y
CONFIG_ATH9K_HWRNG=y
@@ -3551,7 +3612,6 @@ CONFIG_IWLDVM=m
CONFIG_IWLMVM=m
CONFIG_IWLWIFI_OPMODE_MODULAR=y
# CONFIG_IWLWIFI_BCAST_FILTERING is not set
-# CONFIG_IWLWIFI_PCIE_RTPM is not set
#
# Debugging Options
@@ -3739,107 +3799,10 @@ CONFIG_HYPERV_NET=m
CONFIG_NETDEVSIM=m
CONFIG_NET_FAILOVER=m
CONFIG_ISDN=y
-CONFIG_ISDN_I4L=m
-CONFIG_ISDN_PPP=y
-CONFIG_ISDN_PPP_VJ=y
-CONFIG_ISDN_MPP=y
-CONFIG_IPPP_FILTER=y
-CONFIG_ISDN_PPP_BSDCOMP=m
-CONFIG_ISDN_AUDIO=y
-CONFIG_ISDN_TTY_FAX=y
-
-#
-# ISDN feature submodules
-#
-CONFIG_ISDN_DIVERSION=m
-# end of ISDN feature submodules
-
-#
-# ISDN4Linux hardware drivers
-#
-
-#
-# Passive cards
-#
-CONFIG_ISDN_DRV_HISAX=m
-
-#
-# D-channel protocol features
-#
-CONFIG_HISAX_EURO=y
-CONFIG_DE_AOC=y
-# CONFIG_HISAX_NO_SENDCOMPLETE is not set
-# CONFIG_HISAX_NO_LLC is not set
-# CONFIG_HISAX_NO_KEYPAD is not set
-CONFIG_HISAX_1TR6=y
-CONFIG_HISAX_NI1=y
-CONFIG_HISAX_MAX_CARDS=8
-
-#
-# HiSax supported cards
-#
-CONFIG_HISAX_16_3=y
-CONFIG_HISAX_TELESPCI=y
-CONFIG_HISAX_S0BOX=y
-CONFIG_HISAX_FRITZPCI=y
-CONFIG_HISAX_AVM_A1_PCMCIA=y
-CONFIG_HISAX_ELSA=y
-CONFIG_HISAX_DIEHLDIVA=y
-CONFIG_HISAX_SEDLBAUER=y
-CONFIG_HISAX_NETJET=y
-CONFIG_HISAX_NETJET_U=y
-CONFIG_HISAX_NICCY=y
-CONFIG_HISAX_BKM_A4T=y
-CONFIG_HISAX_SCT_QUADRO=y
-CONFIG_HISAX_GAZEL=y
-CONFIG_HISAX_HFC_PCI=y
-CONFIG_HISAX_W6692=y
-CONFIG_HISAX_HFC_SX=y
-CONFIG_HISAX_ENTERNOW_PCI=y
-# CONFIG_HISAX_DEBUG is not set
-
-#
-# HiSax PCMCIA card service modules
-#
-CONFIG_HISAX_SEDLBAUER_CS=m
-CONFIG_HISAX_ELSA_CS=m
-CONFIG_HISAX_AVM_A1_CS=m
-CONFIG_HISAX_TELES_CS=m
-
-#
-# HiSax sub driver modules
-#
-CONFIG_HISAX_ST5481=m
-CONFIG_HISAX_HFCUSB=m
-CONFIG_HISAX_HFC4S8S=m
-CONFIG_HISAX_FRITZ_PCIPNP=m
-# end of Passive cards
-
CONFIG_ISDN_CAPI=m
CONFIG_CAPI_TRACE=y
CONFIG_ISDN_CAPI_CAPI20=m
CONFIG_ISDN_CAPI_MIDDLEWARE=y
-CONFIG_ISDN_CAPI_CAPIDRV=m
-# CONFIG_ISDN_CAPI_CAPIDRV_VERBOSE is not set
-
-#
-# CAPI hardware drivers
-#
-CONFIG_CAPI_AVM=y
-CONFIG_ISDN_DRV_AVMB1_B1PCI=m
-CONFIG_ISDN_DRV_AVMB1_B1PCIV4=y
-CONFIG_ISDN_DRV_AVMB1_B1PCMCIA=m
-CONFIG_ISDN_DRV_AVMB1_AVM_CS=m
-CONFIG_ISDN_DRV_AVMB1_T1PCI=m
-CONFIG_ISDN_DRV_AVMB1_C4=m
-CONFIG_ISDN_DRV_GIGASET=m
-CONFIG_GIGASET_CAPI=y
-CONFIG_GIGASET_BASE=m
-CONFIG_GIGASET_M105=m
-CONFIG_GIGASET_M101=m
-# CONFIG_GIGASET_DEBUG is not set
-CONFIG_HYSDN=m
-CONFIG_HYSDN_CAPI=y
CONFIG_MISDN=m
CONFIG_MISDN_DSP=m
CONFIG_MISDN_L1OIP=m
@@ -3855,9 +3818,9 @@ CONFIG_MISDN_SPEEDFAX=m
CONFIG_MISDN_INFINEON=m
CONFIG_MISDN_W6692=m
CONFIG_MISDN_NETJET=m
+CONFIG_MISDN_HDLC=m
CONFIG_MISDN_IPAC=m
CONFIG_MISDN_ISAR=m
-CONFIG_ISDN_HDLC=m
CONFIG_NVM=y
CONFIG_NVM_PBLK=m
# CONFIG_NVM_PBLK_DEBUG is not set
@@ -3891,6 +3854,7 @@ CONFIG_KEYBOARD_ADC=m
CONFIG_KEYBOARD_ADP5520=m
CONFIG_KEYBOARD_ADP5588=m
CONFIG_KEYBOARD_ADP5589=m
+CONFIG_KEYBOARD_APPLESPI=m
CONFIG_KEYBOARD_ATKBD=m
CONFIG_KEYBOARD_QT1050=m
CONFIG_KEYBOARD_QT1070=m
@@ -3963,8 +3927,8 @@ CONFIG_JOYSTICK_INTERACT=m
CONFIG_JOYSTICK_SIDEWINDER=m
CONFIG_JOYSTICK_TMDC=m
CONFIG_JOYSTICK_IFORCE=m
-CONFIG_JOYSTICK_IFORCE_USB=y
-CONFIG_JOYSTICK_IFORCE_232=y
+CONFIG_JOYSTICK_IFORCE_USB=m
+CONFIG_JOYSTICK_IFORCE_232=m
CONFIG_JOYSTICK_WARRIOR=m
CONFIG_JOYSTICK_MAGELLAN=m
CONFIG_JOYSTICK_SPACEORB=m
@@ -3984,6 +3948,7 @@ CONFIG_JOYSTICK_WALKERA0701=m
CONFIG_JOYSTICK_PSXPAD_SPI=m
CONFIG_JOYSTICK_PSXPAD_SPI_FF=y
CONFIG_JOYSTICK_PXRC=m
+CONFIG_JOYSTICK_FSIA6B=m
CONFIG_INPUT_TABLET=y
CONFIG_TABLET_USB_ACECAD=m
CONFIG_TABLET_USB_AIPTEK=m
@@ -4176,7 +4141,7 @@ CONFIG_RMI4_F11=y
CONFIG_RMI4_F12=y
CONFIG_RMI4_F30=y
CONFIG_RMI4_F34=y
-CONFIG_RMI4_F54=y
+# CONFIG_RMI4_F54 is not set
CONFIG_RMI4_F55=y
#
@@ -4260,11 +4225,11 @@ CONFIG_SERIAL_8250_ASPEED_VUART=m
CONFIG_SERIAL_8250_SHARE_IRQ=y
# CONFIG_SERIAL_8250_DETECT_IRQ is not set
CONFIG_SERIAL_8250_RSA=y
+CONFIG_SERIAL_8250_DWLIB=y
CONFIG_SERIAL_8250_DW=m
CONFIG_SERIAL_8250_RT288X=y
CONFIG_SERIAL_8250_LPSS=y
CONFIG_SERIAL_8250_MID=y
-CONFIG_SERIAL_8250_MOXA=m
CONFIG_SERIAL_OF_PLATFORM=m
#
@@ -4294,10 +4259,12 @@ CONFIG_SERIAL_ARC_NR_PORTS=1
CONFIG_SERIAL_RP2=m
CONFIG_SERIAL_RP2_NR_UARTS=32
CONFIG_SERIAL_FSL_LPUART=m
+CONFIG_SERIAL_FSL_LINFLEXUART=m
CONFIG_SERIAL_CONEXANT_DIGICOLOR=m
CONFIG_SERIAL_MEN_Z135=m
# end of Serial drivers
+CONFIG_SERIAL_MCTRL_GPIO=y
CONFIG_SERIAL_DEV_BUS=y
CONFIG_SERIAL_DEV_CTRL_TTYPORT=y
# CONFIG_TTY_PRINTK is not set
@@ -4318,6 +4285,7 @@ CONFIG_IPMI_SI=m
CONFIG_IPMI_SSIF=m
CONFIG_IPMI_WATCHDOG=m
CONFIG_IPMI_POWEROFF=m
+CONFIG_IPMB_DEVICE_INTERFACE=m
CONFIG_HW_RANDOM=m
CONFIG_HW_RANDOM_TIMERIOMEM=m
CONFIG_HW_RANDOM_INTEL=m
@@ -4369,6 +4337,7 @@ CONFIG_XILLYBUS_OF=m
# end of Character devices
# CONFIG_RANDOM_TRUST_CPU is not set
+# CONFIG_RANDOM_TRUST_BOOTLOADER is not set
#
# I2C support
@@ -4592,9 +4561,11 @@ CONFIG_PINCTRL_LEWISBURG=y
CONFIG_PINCTRL_SUNRISEPOINT=y
CONFIG_PINCTRL_LOCHNAGAR=m
CONFIG_PINCTRL_MADERA=m
+CONFIG_PINCTRL_CS47L15=y
CONFIG_PINCTRL_CS47L35=y
CONFIG_PINCTRL_CS47L85=y
CONFIG_PINCTRL_CS47L90=y
+CONFIG_PINCTRL_CS47L92=y
CONFIG_GPIOLIB=y
CONFIG_GPIOLIB_FASTPATH_LIMIT=512
CONFIG_OF_GPIO=y
@@ -4659,6 +4630,7 @@ CONFIG_GPIO_TPIC2810=m
#
CONFIG_GPIO_ADP5520=m
CONFIG_GPIO_ARIZONA=m
+CONFIG_GPIO_BD70528=m
CONFIG_GPIO_BD9571MWV=m
CONFIG_GPIO_CRYSTAL_COVE=m
CONFIG_GPIO_DA9052=m
@@ -4712,6 +4684,7 @@ CONFIG_GPIO_MAX7301=m
CONFIG_GPIO_MC33880=m
CONFIG_GPIO_PISOSR=m
CONFIG_GPIO_XRA1403=m
+CONFIG_GPIO_MOXTET=m
# end of SPI GPIO expanders
#
@@ -4732,6 +4705,7 @@ CONFIG_W1_MASTER_DS2490=m
CONFIG_W1_MASTER_DS2482=m
CONFIG_W1_MASTER_DS1WM=m
CONFIG_W1_MASTER_GPIO=m
+CONFIG_W1_MASTER_SGI=m
# end of 1-wire Bus Masters
#
@@ -4750,6 +4724,7 @@ CONFIG_W1_SLAVE_DS2431=m
CONFIG_W1_SLAVE_DS2433=m
# CONFIG_W1_SLAVE_DS2433_CRC is not set
CONFIG_W1_SLAVE_DS2438=m
+CONFIG_W1_SLAVE_DS250X=m
CONFIG_W1_SLAVE_DS2780=m
CONFIG_W1_SLAVE_DS2781=m
CONFIG_W1_SLAVE_DS28E04=m
@@ -4767,8 +4742,10 @@ CONFIG_POWER_RESET_SYSCON=y
CONFIG_POWER_RESET_SYSCON_POWEROFF=y
CONFIG_REBOOT_MODE=m
CONFIG_SYSCON_REBOOT_MODE=m
+CONFIG_NVMEM_REBOOT_MODE=m
CONFIG_POWER_SUPPLY=y
# CONFIG_POWER_SUPPLY_DEBUG is not set
+CONFIG_POWER_SUPPLY_HWMON=y
CONFIG_PDA_POWER=m
CONFIG_GENERIC_ADC_BATTERY=m
CONFIG_MAX8925_POWER=m
@@ -4835,6 +4812,8 @@ CONFIG_BATTERY_RT5033=m
CONFIG_CHARGER_RT9455=m
CONFIG_CHARGER_CROS_USBPD=m
CONFIG_CHARGER_UCS1002=m
+CONFIG_CHARGER_BD70528=m
+CONFIG_CHARGER_WILCO=m
CONFIG_HWMON=y
CONFIG_HWMON_VID=m
# CONFIG_HWMON_DEBUG_CHIP is not set
@@ -4860,6 +4839,7 @@ CONFIG_SENSORS_ADT7411=m
CONFIG_SENSORS_ADT7462=m
CONFIG_SENSORS_ADT7470=m
CONFIG_SENSORS_ADT7475=m
+CONFIG_SENSORS_AS370=m
CONFIG_SENSORS_ASC7621=m
CONFIG_SENSORS_K8TEMP=m
CONFIG_SENSORS_K10TEMP=m
@@ -4950,8 +4930,10 @@ CONFIG_PMBUS=m
CONFIG_SENSORS_PMBUS=m
CONFIG_SENSORS_ADM1275=m
CONFIG_SENSORS_IBM_CFFPS=m
+CONFIG_SENSORS_INSPUR_IPSPS=m
CONFIG_SENSORS_IR35221=m
CONFIG_SENSORS_IR38064=m
+CONFIG_SENSORS_IRPS5401=m
CONFIG_SENSORS_ISL68137=m
CONFIG_SENSORS_LM25066=m
CONFIG_SENSORS_LTC2978=m
@@ -4962,6 +4944,7 @@ CONFIG_SENSORS_MAX20751=m
CONFIG_SENSORS_MAX31785=m
CONFIG_SENSORS_MAX34440=m
CONFIG_SENSORS_MAX8688=m
+CONFIG_SENSORS_PXE1610=m
CONFIG_SENSORS_TPS40422=m
CONFIG_SENSORS_TPS53679=m
CONFIG_SENSORS_UCD9000=m
@@ -4986,7 +4969,6 @@ CONFIG_SENSORS_SCH5636=m
CONFIG_SENSORS_STTS751=m
CONFIG_SENSORS_SMM665=m
CONFIG_SENSORS_ADC128D818=m
-CONFIG_SENSORS_ADS1015=m
CONFIG_SENSORS_ADS7828=m
CONFIG_SENSORS_ADS7871=m
CONFIG_SENSORS_AMC6821=m
@@ -5062,6 +5044,7 @@ CONFIG_INTEL_SOC_DTS_THERMAL=m
CONFIG_INT340X_THERMAL=m
CONFIG_ACPI_THERMAL_REL=m
CONFIG_INT3406_THERMAL=m
+CONFIG_PROC_THERMAL_MMIO_RAPL=y
# end of ACPI INT340X thermal drivers
CONFIG_INTEL_BXT_PMIC_THERMAL=m
@@ -5073,6 +5056,7 @@ CONFIG_WATCHDOG=y
CONFIG_WATCHDOG_CORE=y
# CONFIG_WATCHDOG_NOWAYOUT is not set
CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y
+CONFIG_WATCHDOG_OPEN_TIMEOUT=0
CONFIG_WATCHDOG_SYSFS=y
#
@@ -5090,6 +5074,7 @@ CONFIG_WATCHDOG_PRETIMEOUT_DEFAULT_GOV_PANIC=y
#
CONFIG_SOFT_WATCHDOG=m
# CONFIG_SOFT_WATCHDOG_PRETIMEOUT is not set
+CONFIG_BD70528_WATCHDOG=m
CONFIG_DA9052_WATCHDOG=m
CONFIG_DA9055_WATCHDOG=m
CONFIG_DA9063_WATCHDOG=m
@@ -5203,14 +5188,15 @@ CONFIG_MFD_BCM590XX=m
CONFIG_MFD_BD9571MWV=m
CONFIG_MFD_AXP20X=m
CONFIG_MFD_AXP20X_I2C=m
-CONFIG_MFD_CROS_EC=m
-CONFIG_MFD_CROS_EC_CHARDEV=m
+CONFIG_MFD_CROS_EC_DEV=m
CONFIG_MFD_MADERA=m
CONFIG_MFD_MADERA_I2C=m
CONFIG_MFD_MADERA_SPI=m
+CONFIG_MFD_CS47L15=y
CONFIG_MFD_CS47L35=y
CONFIG_MFD_CS47L85=y
CONFIG_MFD_CS47L90=y
+CONFIG_MFD_CS47L92=y
CONFIG_PMIC_DA903X=y
CONFIG_PMIC_DA9052=y
CONFIG_MFD_DA9052_SPI=y
@@ -5331,6 +5317,7 @@ CONFIG_MFD_WM8350=y
CONFIG_MFD_WM8350_I2C=y
CONFIG_MFD_WM8994=m
CONFIG_MFD_ROHM_BD718XX=m
+CONFIG_MFD_ROHM_BD70528=m
CONFIG_MFD_STPMIC1=m
CONFIG_MFD_STMFX=m
CONFIG_RAVE_SP_CORE=m
@@ -5356,6 +5343,7 @@ CONFIG_REGULATOR_AS3711=m
CONFIG_REGULATOR_AS3722=m
CONFIG_REGULATOR_AXP20X=m
CONFIG_REGULATOR_BCM590XX=m
+CONFIG_REGULATOR_BD70528=m
CONFIG_REGULATOR_BD718XX=m
CONFIG_REGULATOR_BD9571MWV=m
CONFIG_REGULATOR_CPCAP=m
@@ -5422,8 +5410,10 @@ CONFIG_REGULATOR_S2MPA01=m
CONFIG_REGULATOR_S2MPS11=m
CONFIG_REGULATOR_S5M8767=m
CONFIG_REGULATOR_SKY81452=m
+CONFIG_REGULATOR_SLG51000=m
CONFIG_REGULATOR_STPMIC1=m
CONFIG_REGULATOR_SY8106A=m
+CONFIG_REGULATOR_SY8824X=m
CONFIG_REGULATOR_TPS51632=m
CONFIG_REGULATOR_TPS6105X=m
CONFIG_REGULATOR_TPS62360=m
@@ -5506,6 +5496,7 @@ CONFIG_MEDIA_CONTROLLER_DVB=y
CONFIG_VIDEO_DEV=m
CONFIG_VIDEO_V4L2_SUBDEV_API=y
CONFIG_VIDEO_V4L2=m
+CONFIG_VIDEO_V4L2_I2C=y
# CONFIG_VIDEO_ADV_DEBUG is not set
# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
CONFIG_VIDEO_TUNER=m
@@ -5636,6 +5627,7 @@ CONFIG_DVB_USB_DIBUSB_MC=m
CONFIG_DVB_USB_DIB0700=m
CONFIG_DVB_USB_UMT_010=m
CONFIG_DVB_USB_CXUSB=m
+CONFIG_DVB_USB_CXUSB_ANALOG=y
CONFIG_DVB_USB_M920X=m
CONFIG_DVB_USB_DIGITV=m
CONFIG_DVB_USB_VP7045=m
@@ -5743,7 +5735,6 @@ CONFIG_VIDEO_SAA7134_RC=y
CONFIG_VIDEO_SAA7134_DVB=m
CONFIG_VIDEO_SAA7134_GO7007=m
CONFIG_VIDEO_SAA7164=m
-CONFIG_VIDEO_COBALT=m
#
# Media digital TV PCI Adapters
@@ -5868,17 +5859,23 @@ CONFIG_MEDIA_ATTACH=y
CONFIG_VIDEO_IR_I2C=m
#
+# I2C Encoders, decoders, sensors and other helper chips
+#
+
+#
# Audio decoders, processors and mixers
#
CONFIG_VIDEO_TVAUDIO=m
CONFIG_VIDEO_TDA7432=m
CONFIG_VIDEO_TDA9840=m
+CONFIG_VIDEO_TDA1997X=m
CONFIG_VIDEO_TEA6415C=m
CONFIG_VIDEO_TEA6420=m
CONFIG_VIDEO_MSP3400=m
CONFIG_VIDEO_CS3308=m
CONFIG_VIDEO_CS5345=m
CONFIG_VIDEO_CS53L32A=m
+CONFIG_VIDEO_TLV320AIC23B=m
CONFIG_VIDEO_UDA1342=m
CONFIG_VIDEO_WM8775=m
CONFIG_VIDEO_WM8739=m
@@ -5893,13 +5890,30 @@ CONFIG_VIDEO_SAA6588=m
#
# Video decoders
#
+CONFIG_VIDEO_ADV7180=m
+CONFIG_VIDEO_ADV7183=m
+CONFIG_VIDEO_ADV748X=m
CONFIG_VIDEO_ADV7604=m
+CONFIG_VIDEO_ADV7604_CEC=y
CONFIG_VIDEO_ADV7842=m
+CONFIG_VIDEO_ADV7842_CEC=y
+CONFIG_VIDEO_BT819=m
+CONFIG_VIDEO_BT856=m
+CONFIG_VIDEO_BT866=m
+CONFIG_VIDEO_KS0127=m
+CONFIG_VIDEO_ML86V7667=m
+CONFIG_VIDEO_SAA7110=m
CONFIG_VIDEO_SAA711X=m
+CONFIG_VIDEO_TC358743=m
+CONFIG_VIDEO_TC358743_CEC=y
+CONFIG_VIDEO_TVP514X=m
CONFIG_VIDEO_TVP5150=m
+CONFIG_VIDEO_TVP7002=m
CONFIG_VIDEO_TW2804=m
CONFIG_VIDEO_TW9903=m
CONFIG_VIDEO_TW9906=m
+CONFIG_VIDEO_TW9910=m
+CONFIG_VIDEO_VPX3220=m
#
# Video and audio decoders
@@ -5911,23 +5925,81 @@ CONFIG_VIDEO_CX25840=m
# Video encoders
#
CONFIG_VIDEO_SAA7127=m
-CONFIG_VIDEO_ADV7511=m
+CONFIG_VIDEO_SAA7185=m
+CONFIG_VIDEO_ADV7170=m
+CONFIG_VIDEO_ADV7175=m
+CONFIG_VIDEO_ADV7343=m
+CONFIG_VIDEO_ADV7393=m
+CONFIG_VIDEO_AD9389B=m
+CONFIG_VIDEO_AK881X=m
+CONFIG_VIDEO_THS8200=m
#
# Camera sensor devices
#
+CONFIG_VIDEO_APTINA_PLL=m
+CONFIG_VIDEO_SMIAPP_PLL=m
+CONFIG_VIDEO_IMX214=m
+CONFIG_VIDEO_IMX258=m
+CONFIG_VIDEO_IMX274=m
+CONFIG_VIDEO_IMX319=m
+CONFIG_VIDEO_IMX355=m
CONFIG_VIDEO_OV2640=m
+CONFIG_VIDEO_OV2659=m
+CONFIG_VIDEO_OV2680=m
+CONFIG_VIDEO_OV2685=m
+CONFIG_VIDEO_OV5640=m
+CONFIG_VIDEO_OV5645=m
+CONFIG_VIDEO_OV5647=m
+CONFIG_VIDEO_OV6650=m
+CONFIG_VIDEO_OV5670=m
+CONFIG_VIDEO_OV5675=m
+CONFIG_VIDEO_OV5695=m
+CONFIG_VIDEO_OV7251=m
+CONFIG_VIDEO_OV772X=m
CONFIG_VIDEO_OV7640=m
CONFIG_VIDEO_OV7670=m
+CONFIG_VIDEO_OV7740=m
+CONFIG_VIDEO_OV8856=m
+CONFIG_VIDEO_OV9640=m
+CONFIG_VIDEO_OV9650=m
+CONFIG_VIDEO_OV13858=m
+CONFIG_VIDEO_VS6624=m
+CONFIG_VIDEO_MT9M001=m
+CONFIG_VIDEO_MT9M032=m
+CONFIG_VIDEO_MT9M111=m
+CONFIG_VIDEO_MT9P031=m
+CONFIG_VIDEO_MT9T001=m
+CONFIG_VIDEO_MT9T112=m
CONFIG_VIDEO_MT9V011=m
+CONFIG_VIDEO_MT9V032=m
+CONFIG_VIDEO_MT9V111=m
+CONFIG_VIDEO_SR030PC30=m
+CONFIG_VIDEO_NOON010PC30=m
+CONFIG_VIDEO_M5MOLS=m
+CONFIG_VIDEO_RJ54N1=m
+CONFIG_VIDEO_S5K6AA=m
+CONFIG_VIDEO_S5K6A3=m
+CONFIG_VIDEO_S5K4ECGX=m
+CONFIG_VIDEO_S5K5BAF=m
+CONFIG_VIDEO_SMIAPP=m
+CONFIG_VIDEO_ET8EK8=m
+CONFIG_VIDEO_S5C73M3=m
#
# Lens drivers
#
+CONFIG_VIDEO_AD5820=m
+CONFIG_VIDEO_AK7375=m
+CONFIG_VIDEO_DW9714=m
+CONFIG_VIDEO_DW9807_VCM=m
#
# Flash devices
#
+CONFIG_VIDEO_ADP1653=m
+CONFIG_VIDEO_LM3560=m
+CONFIG_VIDEO_LM3646=m
#
# Video improvement chips
@@ -5943,11 +6015,22 @@ CONFIG_VIDEO_SAA6752HS=m
#
# SDR tuner chips
#
+CONFIG_SDR_MAX2175=m
#
# Miscellaneous helper chips
#
+CONFIG_VIDEO_THS7303=m
CONFIG_VIDEO_M52790=m
+CONFIG_VIDEO_I2C=m
+CONFIG_VIDEO_ST_MIPID02=m
+# end of I2C Encoders, decoders, sensors and other helper chips
+
+#
+# SPI helper chips
+#
+CONFIG_VIDEO_GS1662=m
+# end of SPI helper chips
#
# Media SPI Adapters
@@ -5956,6 +6039,10 @@ CONFIG_CXD2880_SPI_DRV=m
# end of Media SPI Adapters
CONFIG_MEDIA_TUNER=m
+
+#
+# Customize TV tuners
+#
CONFIG_MEDIA_TUNER_SIMPLE=m
CONFIG_MEDIA_TUNER_TDA18250=m
CONFIG_MEDIA_TUNER_TDA8290=m
@@ -5993,6 +6080,11 @@ CONFIG_MEDIA_TUNER_R820T=m
CONFIG_MEDIA_TUNER_MXL301RF=m
CONFIG_MEDIA_TUNER_QM1D1C0042=m
CONFIG_MEDIA_TUNER_QM1D1B0004=m
+# end of Customize TV tuners
+
+#
+# Customise DVB Frontends
+#
#
# Multistandard (satellite) frontends
@@ -6053,6 +6145,7 @@ CONFIG_DVB_SP8870=m
CONFIG_DVB_SP887X=m
CONFIG_DVB_CX22700=m
CONFIG_DVB_CX22702=m
+CONFIG_DVB_S5H1432=m
CONFIG_DVB_DRXD=m
CONFIG_DVB_L64781=m
CONFIG_DVB_TDA1004X=m
@@ -6063,6 +6156,7 @@ CONFIG_DVB_DIB3000MB=m
CONFIG_DVB_DIB3000MC=m
CONFIG_DVB_DIB7000M=m
CONFIG_DVB_DIB7000P=m
+CONFIG_DVB_DIB9000=m
CONFIG_DVB_TDA10048=m
CONFIG_DVB_AF9013=m
CONFIG_DVB_EC100=m
@@ -6076,6 +6170,7 @@ CONFIG_DVB_SI2168=m
CONFIG_DVB_AS102_FE=m
CONFIG_DVB_ZD1301_DEMOD=m
CONFIG_DVB_GP8PSK_FE=m
+CONFIG_DVB_CXD2880=m
#
# DVB-C (cable) frontends
@@ -6113,6 +6208,7 @@ CONFIG_DVB_MB86A20S=m
# ISDB-S (satellite) & ISDB-T (terrestrial) frontends
#
CONFIG_DVB_TC90522=m
+CONFIG_DVB_MN88443X=m
#
# Digital terrestrial only tuners/PLL
@@ -6126,12 +6222,14 @@ CONFIG_DVB_TUNER_DIB0090=m
#
CONFIG_DVB_DRX39XYJ=m
CONFIG_DVB_LNBH25=m
+CONFIG_DVB_LNBH29=m
CONFIG_DVB_LNBP21=m
CONFIG_DVB_LNBP22=m
CONFIG_DVB_ISL6405=m
CONFIG_DVB_ISL6421=m
CONFIG_DVB_ISL6423=m
CONFIG_DVB_A8293=m
+CONFIG_DVB_LGS8GL5=m
CONFIG_DVB_LGS8GXX=m
CONFIG_DVB_ATBM8830=m
CONFIG_DVB_TDA665x=m
@@ -6152,6 +6250,7 @@ CONFIG_DVB_SP2=m
# Tools to develop new frontends
#
CONFIG_DVB_DUMMY_FE=m
+# end of Customise DVB Frontends
#
# Graphics support
@@ -6166,6 +6265,7 @@ CONFIG_VGA_ARB=y
CONFIG_VGA_ARB_MAX_GPUS=10
CONFIG_VGA_SWITCHEROO=y
CONFIG_DRM=m
+CONFIG_DRM_MIPI_DBI=m
CONFIG_DRM_MIPI_DSI=y
CONFIG_DRM_DP_AUX_CHARDEV=y
# CONFIG_DRM_DEBUG_SELFTEST is not set
@@ -6177,6 +6277,7 @@ CONFIG_DRM_FBDEV_OVERALLOC=100
CONFIG_DRM_LOAD_EDID_FIRMWARE=y
CONFIG_DRM_DP_CEC=y
CONFIG_DRM_TTM=m
+CONFIG_DRM_VRAM_HELPER=m
CONFIG_DRM_GEM_CMA_HELPER=y
CONFIG_DRM_KMS_CMA_HELPER=y
CONFIG_DRM_GEM_SHMEM_HELPER=y
@@ -6216,7 +6317,9 @@ CONFIG_DRM_AMD_ACP=y
#
CONFIG_DRM_AMD_DC=y
CONFIG_DRM_AMD_DC_DCN1_0=y
-CONFIG_DRM_AMD_DC_DCN1_01=y
+CONFIG_DRM_AMD_DC_DCN2_0=y
+CONFIG_DRM_AMD_DC_DCN2_1=y
+CONFIG_DRM_AMD_DC_DSC_SUPPORT=y
# CONFIG_DEBUG_KERNEL_DC is not set
# end of Display Engine Configuration
@@ -6230,6 +6333,7 @@ CONFIG_DRM_NOUVEAU_BACKLIGHT=y
CONFIG_DRM_NOUVEAU_SVM=y
CONFIG_DRM_I915=m
CONFIG_DRM_I915_ALPHA_SUPPORT=y
+CONFIG_DRM_I915_FORCE_PROBE="*"
CONFIG_DRM_I915_CAPTURE_ERROR=y
CONFIG_DRM_I915_COMPRESS_ERROR=y
CONFIG_DRM_I915_USERPTR=y
@@ -6241,6 +6345,7 @@ CONFIG_DRM_I915_GVT_KVMGT=m
#
# CONFIG_DRM_I915_WERROR is not set
# CONFIG_DRM_I915_DEBUG is not set
+# CONFIG_DRM_I915_DEBUG_MMIO is not set
# CONFIG_DRM_I915_SW_FENCE_DEBUG_OBJECTS is not set
# CONFIG_DRM_I915_SW_FENCE_CHECK_DAG is not set
# CONFIG_DRM_I915_DEBUG_GUC is not set
@@ -6250,6 +6355,13 @@ CONFIG_DRM_I915_GVT_KVMGT=m
# CONFIG_DRM_I915_DEBUG_RUNTIME_PM is not set
# end of drm/i915 Debugging
+#
+# drm/i915 Profile Guided Optimisation
+#
+CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND=250
+CONFIG_DRM_I915_SPIN_REQUEST=5
+# end of drm/i915 Profile Guided Optimisation
+
CONFIG_DRM_VGEM=m
CONFIG_DRM_VKMS=m
CONFIG_DRM_VMWGFX=m
@@ -6281,23 +6393,33 @@ CONFIG_DRM_PANEL_INNOLUX_P079ZCA=m
CONFIG_DRM_PANEL_JDI_LT070ME05000=m
CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04=m
CONFIG_DRM_PANEL_SAMSUNG_LD9040=m
+CONFIG_DRM_PANEL_LG_LB035Q02=m
CONFIG_DRM_PANEL_LG_LG4573=m
+CONFIG_DRM_PANEL_NEC_NL8048HL11=m
+CONFIG_DRM_PANEL_NOVATEK_NT39016=m
CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO=m
CONFIG_DRM_PANEL_ORISETECH_OTM8009A=m
+CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS=m
CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00=m
CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN=m
+CONFIG_DRM_PANEL_RAYDIUM_RM67191=m
CONFIG_DRM_PANEL_RAYDIUM_RM68200=m
CONFIG_DRM_PANEL_ROCKTECH_JH057N00900=m
CONFIG_DRM_PANEL_RONBO_RB070D30=m
CONFIG_DRM_PANEL_SAMSUNG_S6D16D0=m
CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2=m
CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03=m
+CONFIG_DRM_PANEL_SAMSUNG_S6E63M0=m
CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0=m
CONFIG_DRM_PANEL_SEIKO_43WVF1G=m
CONFIG_DRM_PANEL_SHARP_LQ101R1SX01=m
+CONFIG_DRM_PANEL_SHARP_LS037V7DW01=m
CONFIG_DRM_PANEL_SHARP_LS043T1LE01=m
CONFIG_DRM_PANEL_SITRONIX_ST7701=m
CONFIG_DRM_PANEL_SITRONIX_ST7789V=m
+CONFIG_DRM_PANEL_SONY_ACX565AKM=m
+CONFIG_DRM_PANEL_TPO_TD028TTEC1=m
+CONFIG_DRM_PANEL_TPO_TD043MTEA1=m
CONFIG_DRM_PANEL_TPO_TPG110=m
CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA=m
# end of Display Panels
@@ -6335,11 +6457,9 @@ CONFIG_DRM_DW_HDMI_CEC=m
# CONFIG_DRM_ETNAVIV is not set
CONFIG_DRM_ARCPGU=m
-CONFIG_DRM_HISI_HIBMC=m
CONFIG_DRM_MXS=y
CONFIG_DRM_MXSFB=m
-CONFIG_DRM_TINYDRM=m
-CONFIG_TINYDRM_MIPI_DBI=m
+CONFIG_DRM_GM12U320=m
CONFIG_TINYDRM_HX8357D=m
CONFIG_TINYDRM_ILI9225=m
CONFIG_TINYDRM_ILI9341=m
@@ -6635,6 +6755,7 @@ CONFIG_SND_YMFPCI=m
#
CONFIG_SND_HDA=m
CONFIG_SND_HDA_INTEL=m
+# CONFIG_SND_HDA_INTEL_DETECT_DMIC is not set
CONFIG_SND_HDA_HWDEP=y
CONFIG_SND_HDA_RECONFIG=y
CONFIG_SND_HDA_INPUT_BEEP=y
@@ -6662,6 +6783,7 @@ CONFIG_SND_HDA_COMPONENT=y
CONFIG_SND_HDA_I915=y
CONFIG_SND_HDA_EXT_CORE=m
CONFIG_SND_HDA_PREALLOC_SIZE=4096
+CONFIG_SND_INTEL_NHLT=m
CONFIG_SND_SPI=y
CONFIG_SND_USB=y
CONFIG_SND_USB_AUDIO=m
@@ -6717,11 +6839,11 @@ CONFIG_SND_DESIGNWARE_PCM=y
#
# CONFIG_SND_SOC_FSL_ASRC is not set
# CONFIG_SND_SOC_FSL_SAI is not set
-CONFIG_SND_SOC_FSL_AUDMIX=m
+# CONFIG_SND_SOC_FSL_AUDMIX is not set
# CONFIG_SND_SOC_FSL_SSI is not set
# CONFIG_SND_SOC_FSL_SPDIF is not set
# CONFIG_SND_SOC_FSL_ESAI is not set
-CONFIG_SND_SOC_FSL_MICFIL=m
+# CONFIG_SND_SOC_FSL_MICFIL is not set
# CONFIG_SND_SOC_IMX_AUDMUX is not set
# end of SoC Audio for Freescale CPUs
@@ -6744,16 +6866,18 @@ CONFIG_SND_SOC_INTEL_HASWELL=m
CONFIG_SND_SST_ATOM_HIFI2_PLATFORM=m
CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_PCI=m
CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI=m
-CONFIG_SND_SOC_INTEL_SKYLAKE=m
+# CONFIG_SND_SOC_INTEL_SKYLAKE is not set
CONFIG_SND_SOC_INTEL_SKL=m
CONFIG_SND_SOC_INTEL_APL=m
CONFIG_SND_SOC_INTEL_KBL=m
CONFIG_SND_SOC_INTEL_GLK=m
-CONFIG_SND_SOC_INTEL_CNL=m
-CONFIG_SND_SOC_INTEL_CFL=m
+# CONFIG_SND_SOC_INTEL_CNL is not set
+# CONFIG_SND_SOC_INTEL_CFL is not set
+# CONFIG_SND_SOC_INTEL_CML_H is not set
+# CONFIG_SND_SOC_INTEL_CML_LP is not set
CONFIG_SND_SOC_INTEL_SKYLAKE_FAMILY=m
CONFIG_SND_SOC_INTEL_SKYLAKE_SSP_CLK=m
-CONFIG_SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC=y
+# CONFIG_SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC is not set
CONFIG_SND_SOC_INTEL_SKYLAKE_COMMON=m
CONFIG_SND_SOC_ACPI_INTEL_MATCH=m
CONFIG_SND_SOC_INTEL_MACH=y
@@ -6766,12 +6890,14 @@ CONFIG_SND_SOC_INTEL_CHT_BSW_RT5672_MACH=m
CONFIG_SND_SOC_INTEL_CHT_BSW_RT5645_MACH=m
CONFIG_SND_SOC_INTEL_CHT_BSW_MAX98090_TI_MACH=m
CONFIG_SND_SOC_INTEL_CHT_BSW_NAU8824_MACH=m
+CONFIG_SND_SOC_INTEL_BYT_CHT_CX2072X_MACH=m
CONFIG_SND_SOC_INTEL_BYT_CHT_DA7213_MACH=m
CONFIG_SND_SOC_INTEL_BYT_CHT_ES8316_MACH=m
# CONFIG_SND_SOC_INTEL_BYT_CHT_NOCODEC_MACH is not set
CONFIG_SND_SOC_INTEL_SKL_RT286_MACH=m
CONFIG_SND_SOC_INTEL_SKL_NAU88L25_SSM4567_MACH=m
CONFIG_SND_SOC_INTEL_SKL_NAU88L25_MAX98357A_MACH=m
+CONFIG_SND_SOC_INTEL_DA7219_MAX98357A_GENERIC=m
CONFIG_SND_SOC_INTEL_BXT_DA7219_MAX98357A_MACH=m
CONFIG_SND_SOC_INTEL_BXT_RT298_MACH=m
CONFIG_SND_SOC_INTEL_KBL_RT5663_MAX98927_MACH=m
@@ -6782,10 +6908,12 @@ CONFIG_SND_SOC_INTEL_KBL_RT5660_MACH=m
CONFIG_SND_SOC_INTEL_GLK_RT5682_MAX98357A_MACH=m
CONFIG_SND_SOC_INTEL_SKL_HDA_DSP_GENERIC_MACH=m
CONFIG_SND_SOC_INTEL_SOF_RT5682_MACH=m
+CONFIG_SND_SOC_INTEL_CML_LP_DA7219_MAX98357A_MACH=m
CONFIG_SND_SOC_MTK_BTCVSD=m
CONFIG_SND_SOC_SOF_TOPLEVEL=y
CONFIG_SND_SOC_SOF_PCI=m
CONFIG_SND_SOC_SOF_ACPI=m
+CONFIG_SND_SOC_SOF_OF=m
CONFIG_SND_SOC_SOF_OPTIONS=m
# CONFIG_SND_SOC_SOF_NOCODEC_SUPPORT is not set
# CONFIG_SND_SOC_SOF_STRICT_ABI_CHECKS is not set
@@ -6798,10 +6926,7 @@ CONFIG_SND_SOC_SOF_INTEL_PCI=m
CONFIG_SND_SOC_SOF_INTEL_HIFI_EP_IPC=m
CONFIG_SND_SOC_SOF_INTEL_ATOM_HIFI_EP=m
CONFIG_SND_SOC_SOF_INTEL_COMMON=m
-CONFIG_SND_SOC_SOF_BAYTRAIL_SUPPORT=y
-CONFIG_SND_SOC_SOF_BAYTRAIL=m
-CONFIG_SND_SOC_SOF_BROADWELL_SUPPORT=y
-CONFIG_SND_SOC_SOF_BROADWELL=m
+# CONFIG_SND_SOC_SOF_BAYTRAIL_SUPPORT is not set
CONFIG_SND_SOC_SOF_MERRIFIELD_SUPPORT=y
CONFIG_SND_SOC_SOF_MERRIFIELD=m
CONFIG_SND_SOC_SOF_APOLLOLAKE_SUPPORT=y
@@ -6814,9 +6939,18 @@ CONFIG_SND_SOC_SOF_COFFEELAKE_SUPPORT=y
CONFIG_SND_SOC_SOF_COFFEELAKE=m
CONFIG_SND_SOC_SOF_ICELAKE_SUPPORT=y
CONFIG_SND_SOC_SOF_ICELAKE=m
+CONFIG_SND_SOC_SOF_COMETLAKE_LP=m
+CONFIG_SND_SOC_SOF_COMETLAKE_LP_SUPPORT=y
+CONFIG_SND_SOC_SOF_COMETLAKE_H=m
+CONFIG_SND_SOC_SOF_COMETLAKE_H_SUPPORT=y
+CONFIG_SND_SOC_SOF_TIGERLAKE_SUPPORT=y
+CONFIG_SND_SOC_SOF_TIGERLAKE=m
+CONFIG_SND_SOC_SOF_ELKHARTLAKE_SUPPORT=y
+CONFIG_SND_SOC_SOF_ELKHARTLAKE=m
CONFIG_SND_SOC_SOF_HDA_COMMON=m
CONFIG_SND_SOC_SOF_HDA_LINK=y
CONFIG_SND_SOC_SOF_HDA_AUDIO_CODEC=y
+# CONFIG_SND_SOC_SOF_HDA_ALWAYS_ENABLE_DMI_L1 is not set
CONFIG_SND_SOC_SOF_HDA_LINK_BASELINE=m
CONFIG_SND_SOC_SOF_HDA=m
CONFIG_SND_SOC_SOF_XTENSA=m
@@ -6879,6 +7013,7 @@ CONFIG_SND_SOC_CS43130=m
CONFIG_SND_SOC_CS4341=m
CONFIG_SND_SOC_CS4349=m
CONFIG_SND_SOC_CS53L30=m
+CONFIG_SND_SOC_CX2072X=m
CONFIG_SND_SOC_DA7213=m
CONFIG_SND_SOC_DA7219=m
CONFIG_SND_SOC_DMIC=m
@@ -6974,6 +7109,7 @@ CONFIG_SND_SOC_TLV320AIC3X=m
CONFIG_SND_SOC_TS3A227E=m
CONFIG_SND_SOC_TSCS42XX=m
CONFIG_SND_SOC_TSCS454=m
+CONFIG_SND_SOC_UDA1334=m
CONFIG_SND_SOC_WCD9335=m
CONFIG_SND_SOC_WM8510=m
CONFIG_SND_SOC_WM8523=m
@@ -7051,6 +7187,7 @@ CONFIG_HID_MACALLY=m
CONFIG_HID_PRODIKEYS=m
CONFIG_HID_CMEDIA=m
CONFIG_HID_CP2112=m
+CONFIG_HID_CREATIVE_SB0540=m
CONFIG_HID_CYPRESS=m
CONFIG_HID_DRAGONRISE=m
CONFIG_DRAGONRISE_FF=y
@@ -7174,6 +7311,9 @@ CONFIG_INTEL_ISH_FIRMWARE_DOWNLOADER=m
CONFIG_USB_OHCI_LITTLE_ENDIAN=y
CONFIG_USB_SUPPORT=y
CONFIG_USB_COMMON=y
+CONFIG_USB_LED_TRIG=y
+CONFIG_USB_ULPI_BUS=m
+CONFIG_USB_CONN_GPIO=m
CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB=y
CONFIG_USB_PCI=y
@@ -7190,9 +7330,6 @@ CONFIG_USB_DYNAMIC_MINORS=y
CONFIG_USB_LEDS_TRIGGER_USBPORT=m
CONFIG_USB_AUTOSUSPEND_DELAY=2
CONFIG_USB_MON=m
-CONFIG_USB_WUSB=m
-CONFIG_USB_WUSB_CBAF=m
-# CONFIG_USB_WUSB_CBAF_DEBUG is not set
#
# USB Host Controller Drivers
@@ -7222,8 +7359,6 @@ CONFIG_USB_SL811_HCD=m
# CONFIG_USB_SL811_HCD_ISO is not set
CONFIG_USB_SL811_CS=m
CONFIG_USB_R8A66597_HCD=m
-CONFIG_USB_WHCI_HCD=m
-CONFIG_USB_HWA_HCD=m
CONFIG_USB_HCD_BCMA=m
CONFIG_USB_HCD_SSB=m
# CONFIG_USB_HCD_TEST_MODE is not set
@@ -7273,6 +7408,10 @@ CONFIG_USBIP_VHCI_NR_HCS=1
CONFIG_USBIP_HOST=m
CONFIG_USBIP_VUDC=m
# CONFIG_USBIP_DEBUG is not set
+CONFIG_USB_CDNS3=m
+CONFIG_USB_CDNS3_GADGET=y
+CONFIG_USB_CDNS3_HOST=y
+CONFIG_USB_CDNS3_PCI_WRAP=m
CONFIG_USB_MUSB_HDRC=m
# CONFIG_USB_MUSB_HOST is not set
# CONFIG_USB_MUSB_GADGET is not set
@@ -7390,7 +7529,6 @@ CONFIG_USB_EMI62=m
CONFIG_USB_EMI26=m
CONFIG_USB_ADUTUX=m
CONFIG_USB_SEVSEG=m
-CONFIG_USB_RIO500=m
CONFIG_USB_LEGOTOWER=m
CONFIG_USB_LCD=m
CONFIG_USB_CYPRESS_CY7C63=m
@@ -7565,12 +7703,6 @@ CONFIG_TYPEC_NVIDIA_ALTMODE=m
CONFIG_USB_ROLE_SWITCH=m
CONFIG_USB_ROLES_INTEL_XHCI=m
-CONFIG_USB_LED_TRIG=y
-CONFIG_USB_ULPI_BUS=m
-CONFIG_UWB=m
-CONFIG_UWB_HWA=m
-CONFIG_UWB_WHCI=m
-CONFIG_UWB_I1480U=m
CONFIG_MMC=m
CONFIG_PWRSEQ_EMMC=m
CONFIG_PWRSEQ_SD8787=m
@@ -7591,6 +7723,7 @@ CONFIG_MMC_RICOH_MMC=y
CONFIG_MMC_SDHCI_ACPI=m
CONFIG_MMC_SDHCI_PLTFM=m
CONFIG_MMC_SDHCI_OF_ARASAN=m
+CONFIG_MMC_SDHCI_OF_ASPEED=m
CONFIG_MMC_SDHCI_OF_AT91=m
CONFIG_MMC_SDHCI_OF_DWCMSHC=m
CONFIG_MMC_SDHCI_CADENCE=m
@@ -7702,6 +7835,10 @@ CONFIG_LEDS_MLXCPLD=m
CONFIG_LEDS_MLXREG=m
CONFIG_LEDS_USER=m
CONFIG_LEDS_NIC78BX=m
+CONFIG_LEDS_SPI_BYTE=m
+CONFIG_LEDS_TI_LMU_COMMON=m
+CONFIG_LEDS_LM3697=m
+CONFIG_LEDS_LM36274=m
#
# LED Triggers
@@ -7747,8 +7884,6 @@ CONFIG_INFINIBAND_EFA=m
CONFIG_INFINIBAND_I40IW=m
CONFIG_MLX4_INFINIBAND=m
CONFIG_MLX5_INFINIBAND=m
-CONFIG_INFINIBAND_NES=m
-# CONFIG_INFINIBAND_NES_DEBUG is not set
CONFIG_INFINIBAND_OCRDMA=m
CONFIG_INFINIBAND_VMWARE_PVRDMA=m
CONFIG_INFINIBAND_USNIC=m
@@ -7759,6 +7894,7 @@ CONFIG_INFINIBAND_HFI1=m
CONFIG_INFINIBAND_QEDR=m
CONFIG_INFINIBAND_RDMAVT=m
CONFIG_RDMA_RXE=m
+CONFIG_RDMA_SIW=m
CONFIG_INFINIBAND_IPOIB=m
CONFIG_INFINIBAND_IPOIB_CM=y
CONFIG_INFINIBAND_IPOIB_DEBUG=y
@@ -7846,6 +7982,7 @@ CONFIG_RTC_DRV_PCF8563=m
CONFIG_RTC_DRV_PCF8583=m
CONFIG_RTC_DRV_M41T80=m
CONFIG_RTC_DRV_M41T80_WDT=y
+CONFIG_RTC_DRV_BD70528=m
CONFIG_RTC_DRV_BQ32K=m
CONFIG_RTC_DRV_TWL4030=m
CONFIG_RTC_DRV_PALMAS=m
@@ -7964,6 +8101,8 @@ CONFIG_QCOM_HIDMA=m
CONFIG_DW_DMAC_CORE=y
CONFIG_DW_DMAC=y
CONFIG_DW_DMAC_PCI=y
+CONFIG_DW_EDMA=m
+CONFIG_DW_EDMA_PCIE=m
CONFIG_HSU_DMA=y
#
@@ -7979,6 +8118,7 @@ CONFIG_DMA_ENGINE_RAID=y
CONFIG_SYNC_FILE=y
# CONFIG_SW_SYNC is not set
CONFIG_UDMABUF=y
+# CONFIG_DMABUF_SELFTESTS is not set
# end of DMABUF options
CONFIG_DCA=m
@@ -8025,10 +8165,11 @@ CONFIG_VFIO_MDEV_DEVICE=m
CONFIG_IRQ_BYPASS_MANAGER=m
CONFIG_VIRT_DRIVERS=y
CONFIG_VBOXGUEST=m
-CONFIG_VIRTIO=m
+CONFIG_VIRTIO=y
CONFIG_VIRTIO_MENU=y
CONFIG_VIRTIO_PCI=m
CONFIG_VIRTIO_PCI_LEGACY=y
+CONFIG_VIRTIO_PMEM=m
CONFIG_VIRTIO_BALLOON=m
CONFIG_VIRTIO_INPUT=m
CONFIG_VIRTIO_MMIO=m
@@ -8038,7 +8179,7 @@ CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y
# Microsoft Hyper-V guest support
#
CONFIG_HYPERV=m
-CONFIG_HYPERV_TSCPAGE=y
+CONFIG_HYPERV_TIMER=y
CONFIG_HYPERV_UTILS=m
CONFIG_HYPERV_BALLOON=m
# end of Microsoft Hyper-V guest support
@@ -8047,7 +8188,6 @@ CONFIG_HYPERV_BALLOON=m
# Xen driver support
#
CONFIG_XEN_BALLOON=y
-CONFIG_XEN_SELFBALLOONING=y
CONFIG_XEN_BALLOON_MEMORY_HOTPLUG=y
CONFIG_XEN_BALLOON_MEMORY_HOTPLUG_LIMIT=512
CONFIG_XEN_SCRUB_PAGES_DEFAULT=y
@@ -8062,7 +8202,6 @@ CONFIG_XEN_GNTDEV_DMABUF=y
CONFIG_XEN_GRANT_DEV_ALLOC=m
CONFIG_XEN_GRANT_DMA_ALLOC=y
CONFIG_SWIOTLB_XEN=y
-CONFIG_XEN_TMEM=m
CONFIG_XEN_PCIDEV_BACKEND=m
CONFIG_XEN_PVCALLS_FRONTEND=m
CONFIG_XEN_PVCALLS_BACKEND=y
@@ -8079,6 +8218,7 @@ CONFIG_XEN_HAVE_VPMU=y
CONFIG_XEN_FRONT_PGDIR_SHBUF=m
# end of Xen driver support
+# CONFIG_GREYBUS is not set
CONFIG_STAGING=y
CONFIG_PRISM2_USB=m
CONFIG_COMEDI=m
@@ -8268,7 +8408,6 @@ CONFIG_SPEAKUP_SYNTH_DUMMY=m
# end of Speakup console speech
CONFIG_STAGING_MEDIA=y
-CONFIG_I2C_BCM2048=m
CONFIG_VIDEO_IPU3_IMGU=m
#
@@ -8305,7 +8444,6 @@ CONFIG_MOST_DIM2=m
CONFIG_MOST_I2C=m
CONFIG_MOST_USB=m
CONFIG_KS7010=m
-# CONFIG_GREYBUS is not set
CONFIG_PI433=m
#
@@ -8316,19 +8454,6 @@ CONFIG_STAGING_APEX_DRIVER=m
# end of Gasket devices
CONFIG_XIL_AXIS_FIFO=m
-CONFIG_EROFS_FS=m
-# CONFIG_EROFS_FS_DEBUG is not set
-CONFIG_EROFS_FS_XATTR=y
-CONFIG_EROFS_FS_POSIX_ACL=y
-CONFIG_EROFS_FS_SECURITY=y
-# CONFIG_EROFS_FS_USE_VM_MAP_RAM is not set
-# CONFIG_EROFS_FAULT_INJECTION is not set
-CONFIG_EROFS_FS_IO_MAX_RETRIES=5
-CONFIG_EROFS_FS_ZIP=y
-CONFIG_EROFS_FS_CLUSTER_PAGE_LIMIT=2
-# CONFIG_EROFS_FS_ZIP_NO_CACHE is not set
-# CONFIG_EROFS_FS_ZIP_CACHE_UNIPOLAR is not set
-CONFIG_EROFS_FS_ZIP_CACHE_BIPOLAR=y
CONFIG_FIELDBUS_DEV=m
CONFIG_HMS_ANYBUSS_BUS=m
CONFIG_ARCX_ANYBUS_CONTROLLER=m
@@ -8338,6 +8463,45 @@ CONFIG_KPC2000_CORE=m
CONFIG_KPC2000_SPI=m
CONFIG_KPC2000_I2C=m
CONFIG_KPC2000_DMA=m
+
+#
+# ISDN CAPI drivers
+#
+CONFIG_CAPI_AVM=y
+CONFIG_ISDN_DRV_AVMB1_B1PCI=m
+CONFIG_ISDN_DRV_AVMB1_B1PCIV4=y
+CONFIG_ISDN_DRV_AVMB1_B1PCMCIA=m
+CONFIG_ISDN_DRV_AVMB1_AVM_CS=m
+CONFIG_ISDN_DRV_AVMB1_T1PCI=m
+CONFIG_ISDN_DRV_AVMB1_C4=m
+CONFIG_ISDN_DRV_GIGASET=m
+CONFIG_GIGASET_CAPI=y
+CONFIG_GIGASET_BASE=m
+CONFIG_GIGASET_M105=m
+CONFIG_GIGASET_M101=m
+# CONFIG_GIGASET_DEBUG is not set
+CONFIG_HYSDN=m
+CONFIG_HYSDN_CAPI=y
+# end of ISDN CAPI drivers
+
+CONFIG_USB_WUSB=m
+CONFIG_USB_WUSB_CBAF=m
+# CONFIG_USB_WUSB_CBAF_DEBUG is not set
+CONFIG_USB_WHCI_HCD=m
+CONFIG_USB_HWA_HCD=m
+CONFIG_UWB=m
+CONFIG_UWB_HWA=m
+CONFIG_UWB_WHCI=m
+CONFIG_UWB_I1480U=m
+CONFIG_EXFAT_FS=m
+CONFIG_EXFAT_DONT_MOUNT_VFAT=y
+CONFIG_EXFAT_DISCARD=y
+# CONFIG_EXFAT_DELAYED_SYNC is not set
+# CONFIG_EXFAT_KERNEL_DEBUG is not set
+# CONFIG_EXFAT_DEBUG_MSG is not set
+CONFIG_EXFAT_DEFAULT_CODEPAGE=437
+CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8"
+CONFIG_QLGE=m
CONFIG_X86_PLATFORM_DEVICES=y
CONFIG_ACER_WMI=m
CONFIG_ACER_WIRELESS=m
@@ -8388,6 +8552,7 @@ CONFIG_ASUS_WIRELESS=m
CONFIG_ACPI_WMI=m
CONFIG_WMI_BMOF=m
CONFIG_INTEL_WMI_THUNDERBOLT=m
+CONFIG_XIAOMI_WMI=m
CONFIG_MSI_WMI=m
CONFIG_PEAQ_WMI=m
CONFIG_TOPSTAR_LAPTOP=m
@@ -8395,6 +8560,7 @@ CONFIG_ACPI_TOSHIBA=m
CONFIG_TOSHIBA_BT_RFKILL=m
CONFIG_TOSHIBA_HAPS=m
CONFIG_TOSHIBA_WMI=m
+CONFIG_ACPI_CMPC=m
CONFIG_INTEL_CHT_INT33FE=m
CONFIG_INTEL_INT0002_VGPIO=m
CONFIG_INTEL_HID_EVENT=m
@@ -8405,6 +8571,7 @@ CONFIG_IBM_RTL=m
CONFIG_SAMSUNG_LAPTOP=m
CONFIG_MXM_WMI=m
CONFIG_INTEL_OAKTRAIL=m
+CONFIG_SAMSUNG_Q10=m
CONFIG_APPLE_GMUX=m
CONFIG_INTEL_RST=m
CONFIG_INTEL_SMARTCONNECT=m
@@ -8422,18 +8589,28 @@ CONFIG_I2C_MULTI_INSTANTIATE=m
CONFIG_INTEL_ATOMISP2_PM=m
CONFIG_HUAWEI_WMI=m
CONFIG_PCENGINES_APU2=m
+
+#
+# Intel Speed Select Technology interface support
+#
+CONFIG_INTEL_SPEED_SELECT_INTERFACE=m
+# end of Intel Speed Select Technology interface support
+
CONFIG_PMC_ATOM=y
+CONFIG_MFD_CROS_EC=m
CONFIG_CHROME_PLATFORMS=y
CONFIG_CHROMEOS_LAPTOP=m
CONFIG_CHROMEOS_PSTORE=m
CONFIG_CHROMEOS_TBMC=m
+CONFIG_CROS_EC=m
CONFIG_CROS_EC_I2C=m
CONFIG_CROS_EC_RPMSG=m
+CONFIG_CROS_EC_ISHTP=m
CONFIG_CROS_EC_SPI=m
CONFIG_CROS_EC_LPC=m
-CONFIG_CROS_EC_LPC_MEC=y
CONFIG_CROS_EC_PROTO=y
CONFIG_CROS_KBD_LED_BACKLIGHT=m
+CONFIG_CROS_EC_CHARDEV=m
CONFIG_CROS_EC_LIGHTBAR=m
CONFIG_CROS_EC_VBC=m
CONFIG_CROS_EC_DEBUGFS=m
@@ -8441,6 +8618,8 @@ CONFIG_CROS_EC_SYSFS=m
CONFIG_CROS_USBPD_LOGGER=m
CONFIG_WILCO_EC=m
CONFIG_WILCO_EC_DEBUGFS=m
+CONFIG_WILCO_EC_EVENTS=m
+CONFIG_WILCO_EC_TELEMETRY=m
CONFIG_MELLANOX_PLATFORM=y
CONFIG_MLXREG_HOTPLUG=m
CONFIG_MLXREG_IO=m
@@ -8456,6 +8635,7 @@ CONFIG_CLK_HSDK=y
CONFIG_COMMON_CLK_MAX77686=m
CONFIG_COMMON_CLK_MAX9485=m
CONFIG_COMMON_CLK_RK808=m
+CONFIG_COMMON_CLK_SI5341=m
CONFIG_COMMON_CLK_SI5351=m
CONFIG_COMMON_CLK_SI514=m
CONFIG_COMMON_CLK_SI544=m
@@ -8501,7 +8681,7 @@ CONFIG_IOMMU_SUPPORT=y
# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set
CONFIG_OF_IOMMU=y
CONFIG_AMD_IOMMU=y
-CONFIG_AMD_IOMMU_V2=m
+CONFIG_AMD_IOMMU_V2=y
CONFIG_DMAR_TABLE=y
CONFIG_INTEL_IOMMU=y
CONFIG_INTEL_IOMMU_SVM=y
@@ -8513,7 +8693,7 @@ CONFIG_HYPERV_IOMMU=y
#
# Remoteproc drivers
#
-CONFIG_REMOTEPROC=m
+CONFIG_REMOTEPROC=y
# end of Remoteproc drivers
#
@@ -8526,12 +8706,11 @@ CONFIG_RPMSG_QCOM_GLINK_RPM=m
CONFIG_RPMSG_VIRTIO=m
# end of Rpmsg drivers
-CONFIG_SOUNDWIRE=y
+CONFIG_SOUNDWIRE=m
#
# SoundWire Devices
#
-CONFIG_SOUNDWIRE_BUS=m
CONFIG_SOUNDWIRE_CADENCE=m
CONFIG_SOUNDWIRE_INTEL=m
@@ -8565,13 +8744,6 @@ CONFIG_SOUNDWIRE_INTEL=m
# end of i.MX SoC drivers
#
-# IXP4xx SoC drivers
-#
-CONFIG_IXP4XX_QMGR=m
-CONFIG_IXP4XX_NPE=m
-# end of IXP4xx SoC drivers
-
-#
# Qualcomm SoC drivers
#
# end of Qualcomm SoC drivers
@@ -8608,6 +8780,7 @@ CONFIG_EXTCON=y
CONFIG_EXTCON_ADC_JACK=m
CONFIG_EXTCON_ARIZONA=m
CONFIG_EXTCON_AXP288=m
+CONFIG_EXTCON_FSA9480=m
CONFIG_EXTCON_GPIO=m
CONFIG_EXTCON_INTEL_INT3496=m
CONFIG_EXTCON_INTEL_CHT_WC=m
@@ -8749,6 +8922,7 @@ CONFIG_TWL4030_MADC=m
CONFIG_TWL6030_GPADC=m
CONFIG_VF610_ADC=m
CONFIG_VIPERBOARD_ADC=m
+CONFIG_XILINX_XADC=m
# end of Analog to digital converters
#
@@ -8780,6 +8954,7 @@ CONFIG_VZ89X=m
CONFIG_IIO_CROS_EC_SENSORS_CORE=m
CONFIG_IIO_CROS_EC_SENSORS=m
+CONFIG_IIO_CROS_EC_SENSORS_LID_ANGLE=m
#
# Hid Sensor IIO Common
@@ -8861,6 +9036,7 @@ CONFIG_AD9523=m
# Phase-Locked Loop (PLL) frequency synthesizers
#
CONFIG_ADF4350=m
+CONFIG_ADF4371=m
# end of Phase-Locked Loop (PLL) frequency synthesizers
# end of Frequency Synthesizers DDS/PLL
@@ -8920,6 +9096,7 @@ CONFIG_SI7020=m
# Inertial measurement units
#
CONFIG_ADIS16400=m
+CONFIG_ADIS16460=m
CONFIG_ADIS16480=m
CONFIG_BMI160=m
CONFIG_BMI160_I2C=m
@@ -8931,6 +9108,7 @@ CONFIG_INV_MPU6050_SPI=m
CONFIG_IIO_ST_LSM6DSX=m
CONFIG_IIO_ST_LSM6DSX_I2C=m
CONFIG_IIO_ST_LSM6DSX_SPI=m
+CONFIG_IIO_ST_LSM6DSX_I3C=m
# end of Inertial measurement units
CONFIG_IIO_ADIS_LIB=m
@@ -8965,6 +9143,7 @@ CONFIG_LTR501=m
CONFIG_LV0104CS=m
CONFIG_MAX44000=m
CONFIG_MAX44009=m
+CONFIG_NOA1305=m
CONFIG_OPT3001=m
CONFIG_PA12203001=m
CONFIG_SI1133=m
@@ -9037,6 +9216,7 @@ CONFIG_IIO_SYSFS_TRIGGER=m
#
CONFIG_AD5272=m
CONFIG_DS1803=m
+CONFIG_MAX5432=m
CONFIG_MAX5481=m
CONFIG_MAX5487=m
CONFIG_MCP4018=m
@@ -9060,6 +9240,7 @@ CONFIG_BMP280=m
CONFIG_BMP280_I2C=m
CONFIG_BMP280_SPI=m
CONFIG_IIO_CROS_EC_BARO=m
+CONFIG_DPS310=m
CONFIG_HID_SENSOR_PRESS=m
CONFIG_HP03=m
CONFIG_MPL115=m
@@ -9121,6 +9302,7 @@ CONFIG_MAX31856=m
# end of Temperature sensors
CONFIG_NTB=m
+CONFIG_NTB_MSI=y
CONFIG_NTB_AMD=m
CONFIG_NTB_IDT=m
CONFIG_NTB_INTEL=m
@@ -9128,6 +9310,7 @@ CONFIG_NTB_SWITCHTEC=m
# CONFIG_NTB_PINGPONG is not set
# CONFIG_NTB_TOOL is not set
# CONFIG_NTB_PERF is not set
+# CONFIG_NTB_MSI_TEST is not set
CONFIG_NTB_TRANSPORT=m
CONFIG_VME_BUS=y
@@ -9166,7 +9349,7 @@ CONFIG_PWM_TWL_LED=m
# IRQ chip support
#
CONFIG_IRQCHIP=y
-CONFIG_ARM_GIC_MAX_NR=1
+CONFIG_AL_FIC=y
CONFIG_MADERA_IRQ=m
# end of IRQ chip support
@@ -9175,11 +9358,6 @@ CONFIG_BOARD_TPCI200=m
CONFIG_SERIAL_IPOCTAL=m
CONFIG_RESET_CONTROLLER=y
CONFIG_RESET_TI_SYSCON=m
-CONFIG_FMC=m
-CONFIG_FMC_FAKEDEV=m
-CONFIG_FMC_TRIVIAL=m
-CONFIG_FMC_WRITE_EEPROM=m
-CONFIG_FMC_CHARDEV=m
#
# PHY Subsystem
@@ -9191,6 +9369,7 @@ CONFIG_PHY_CADENCE_DP=m
CONFIG_PHY_CADENCE_DPHY=m
CONFIG_PHY_CADENCE_SIERRA=m
CONFIG_PHY_FSL_IMX8MQ_USB=m
+CONFIG_PHY_MIXEL_MIPI_DPHY=m
CONFIG_PHY_PXA_28NM_HSIC=m
CONFIG_PHY_PXA_28NM_USB2=m
CONFIG_PHY_CPCAP_USB=m
@@ -9203,6 +9382,7 @@ CONFIG_PHY_TUSB1210=m
# end of PHY Subsystem
CONFIG_POWERCAP=y
+CONFIG_INTEL_RAPL_CORE=m
CONFIG_INTEL_RAPL=m
CONFIG_IDLE_INJECT=y
CONFIG_MCB=m
@@ -9216,6 +9396,7 @@ CONFIG_MCB_LPC=m
CONFIG_RAS=y
CONFIG_RAS_CEC=y
+# CONFIG_RAS_CEC_DEBUG is not set
CONFIG_THUNDERBOLT=m
#
@@ -9380,6 +9561,9 @@ CONFIG_EXPORTFS_BLOCK_OPS=y
CONFIG_FILE_LOCKING=y
# CONFIG_MANDATORY_FILE_LOCKING is not set
CONFIG_FS_ENCRYPTION=y
+CONFIG_FS_VERITY=y
+# CONFIG_FS_VERITY_DEBUG is not set
+CONFIG_FS_VERITY_BUILTIN_SIGNATURES=y
CONFIG_FSNOTIFY=y
CONFIG_DNOTIFY=y
CONFIG_INOTIFY_USER=y
@@ -9398,6 +9582,7 @@ CONFIG_AUTOFS4_FS=y
CONFIG_AUTOFS_FS=y
CONFIG_FUSE_FS=m
CONFIG_CUSE=m
+CONFIG_VIRTIO_FS=m
CONFIG_OVERLAY_FS=m
CONFIG_OVERLAY_FS_REDIRECT_DIR=y
# CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW is not set
@@ -9451,6 +9636,7 @@ CONFIG_PROC_VMCORE_DEVICE_DUMP=y
CONFIG_PROC_SYSCTL=y
CONFIG_PROC_PAGE_MONITOR=y
CONFIG_PROC_CHILDREN=y
+CONFIG_PROC_PID_ARCH_STATUS=y
CONFIG_KERNFS=y
CONFIG_SYSFS=y
CONFIG_TMPFS=y
@@ -9491,6 +9677,7 @@ CONFIG_UBIFS_FS=m
# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set
CONFIG_UBIFS_FS_LZO=y
CONFIG_UBIFS_FS_ZLIB=y
+CONFIG_UBIFS_FS_ZSTD=y
CONFIG_UBIFS_ATIME_SUPPORT=y
CONFIG_UBIFS_FS_XATTR=y
CONFIG_UBIFS_FS_SECURITY=y
@@ -9546,6 +9733,13 @@ CONFIG_PSTORE_RAM=y
CONFIG_UFS_FS=m
# CONFIG_UFS_FS_WRITE is not set
# CONFIG_UFS_DEBUG is not set
+CONFIG_EROFS_FS=m
+# CONFIG_EROFS_FS_DEBUG is not set
+CONFIG_EROFS_FS_XATTR=y
+CONFIG_EROFS_FS_POSIX_ACL=y
+CONFIG_EROFS_FS_SECURITY=y
+CONFIG_EROFS_FS_ZIP=y
+CONFIG_EROFS_FS_CLUSTER_PAGE_LIMIT=2
CONFIG_NETWORK_FILESYSTEMS=y
CONFIG_NFS_FS=m
CONFIG_NFS_V2=m
@@ -9575,7 +9769,6 @@ CONFIG_NFSD_BLOCKLAYOUT=y
CONFIG_NFSD_SCSILAYOUT=y
# CONFIG_NFSD_FLEXFILELAYOUT is not set
CONFIG_NFSD_V4_SECURITY_LABEL=y
-# CONFIG_NFSD_FAULT_INJECTION is not set
CONFIG_GRACE_PERIOD=m
CONFIG_LOCKD=m
CONFIG_LOCKD_V4=y
@@ -9586,12 +9779,13 @@ CONFIG_SUNRPC_GSS=m
CONFIG_SUNRPC_BACKCHANNEL=y
CONFIG_SUNRPC_SWAP=y
CONFIG_RPCSEC_GSS_KRB5=m
-CONFIG_CONFIG_SUNRPC_DISABLE_INSECURE_ENCTYPES=y
+CONFIG_SUNRPC_DISABLE_INSECURE_ENCTYPES=y
CONFIG_SUNRPC_DEBUG=y
CONFIG_SUNRPC_XPRT_RDMA=m
CONFIG_CEPH_FS=m
CONFIG_CEPH_FSCACHE=y
CONFIG_CEPH_FS_POSIX_ACL=y
+CONFIG_CEPH_FS_SECURITY_LABEL=y
CONFIG_CIFS=m
# CONFIG_CIFS_STATS2 is not set
CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y
@@ -9599,7 +9793,6 @@ CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y
CONFIG_CIFS_UPCALL=y
CONFIG_CIFS_XATTR=y
CONFIG_CIFS_POSIX=y
-CONFIG_CIFS_ACL=y
CONFIG_CIFS_DEBUG=y
# CONFIG_CIFS_DEBUG2 is not set
# CONFIG_CIFS_DEBUG_DUMP_KEYS is not set
@@ -9677,6 +9870,7 @@ CONFIG_UNICODE=y
#
CONFIG_KEYS=y
CONFIG_KEYS_COMPAT=y
+CONFIG_KEYS_REQUEST_CACHE=y
CONFIG_PERSISTENT_KEYRINGS=y
CONFIG_BIG_KEYS=y
CONFIG_TRUSTED_KEYS=m
@@ -9722,6 +9916,11 @@ CONFIG_SECURITY_APPARMOR_HASH_DEFAULT=y
# CONFIG_SECURITY_LOADPIN is not set
CONFIG_SECURITY_YAMA=y
CONFIG_SECURITY_SAFESETID=y
+CONFIG_SECURITY_LOCKDOWN_LSM=y
+# CONFIG_SECURITY_LOCKDOWN_LSM_EARLY is not set
+CONFIG_LOCK_DOWN_KERNEL_FORCE_NONE=y
+# CONFIG_LOCK_DOWN_KERNEL_FORCE_INTEGRITY is not set
+# CONFIG_LOCK_DOWN_KERNEL_FORCE_CONFIDENTIALITY is not set
# CONFIG_INTEGRITY is not set
# CONFIG_DEFAULT_SECURITY_SELINUX is not set
# CONFIG_DEFAULT_SECURITY_SMACK is not set
@@ -9744,6 +9943,8 @@ CONFIG_GCC_PLUGIN_STRUCTLEAK=y
CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL=y
# CONFIG_GCC_PLUGIN_STRUCTLEAK_VERBOSE is not set
# CONFIG_GCC_PLUGIN_STACKLEAK is not set
+CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y
+# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set
# end of Memory initialization
# end of Kernel hardening options
# end of Security options
@@ -9783,7 +9984,6 @@ CONFIG_CRYPTO_GF128MUL=y
CONFIG_CRYPTO_NULL=y
CONFIG_CRYPTO_NULL2=y
CONFIG_CRYPTO_PCRYPT=m
-CONFIG_CRYPTO_WORKQUEUE=y
CONFIG_CRYPTO_CRYPTD=m
CONFIG_CRYPTO_AUTHENC=m
CONFIG_CRYPTO_TEST=m
@@ -9807,18 +10007,7 @@ CONFIG_CRYPTO_CCM=m
CONFIG_CRYPTO_GCM=y
CONFIG_CRYPTO_CHACHA20POLY1305=m
CONFIG_CRYPTO_AEGIS128=m
-CONFIG_CRYPTO_AEGIS128L=m
-CONFIG_CRYPTO_AEGIS256=m
CONFIG_CRYPTO_AEGIS128_AESNI_SSE2=m
-CONFIG_CRYPTO_AEGIS128L_AESNI_SSE2=m
-CONFIG_CRYPTO_AEGIS256_AESNI_SSE2=m
-CONFIG_CRYPTO_MORUS640=m
-CONFIG_CRYPTO_MORUS640_GLUE=m
-CONFIG_CRYPTO_MORUS640_SSE2=m
-CONFIG_CRYPTO_MORUS1280=m
-CONFIG_CRYPTO_MORUS1280_GLUE=m
-CONFIG_CRYPTO_MORUS1280_SSE2=m
-CONFIG_CRYPTO_MORUS1280_AVX2=m
CONFIG_CRYPTO_SEQIV=y
CONFIG_CRYPTO_ECHAINIV=m
@@ -9839,6 +10028,7 @@ CONFIG_CRYPTO_NHPOLY1305=m
CONFIG_CRYPTO_NHPOLY1305_SSE2=m
CONFIG_CRYPTO_NHPOLY1305_AVX2=m
CONFIG_CRYPTO_ADIANTUM=m
+CONFIG_CRYPTO_ESSIV=m
#
# Hash modes
@@ -9855,6 +10045,7 @@ CONFIG_CRYPTO_CRC32C=m
CONFIG_CRYPTO_CRC32C_INTEL=m
CONFIG_CRYPTO_CRC32=m
CONFIG_CRYPTO_CRC32_PCLMUL=m
+CONFIG_CRYPTO_XXHASH=m
CONFIG_CRYPTO_CRCT10DIF=y
CONFIG_CRYPTO_CRCT10DIF_PCLMUL=m
CONFIG_CRYPTO_GHASH=y
@@ -9871,6 +10062,7 @@ CONFIG_CRYPTO_SHA1=y
CONFIG_CRYPTO_SHA1_SSSE3=m
CONFIG_CRYPTO_SHA256_SSSE3=m
CONFIG_CRYPTO_SHA512_SSSE3=m
+CONFIG_CRYPTO_LIB_SHA256=y
CONFIG_CRYPTO_SHA256=y
CONFIG_CRYPTO_SHA512=y
CONFIG_CRYPTO_SHA3=m
@@ -9883,11 +10075,12 @@ CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL=m
#
# Ciphers
#
+CONFIG_CRYPTO_LIB_AES=y
CONFIG_CRYPTO_AES=y
CONFIG_CRYPTO_AES_TI=m
-CONFIG_CRYPTO_AES_X86_64=m
CONFIG_CRYPTO_AES_NI_INTEL=m
CONFIG_CRYPTO_ANUBIS=m
+CONFIG_CRYPTO_LIB_ARC4=m
CONFIG_CRYPTO_ARC4=m
CONFIG_CRYPTO_BLOWFISH=m
CONFIG_CRYPTO_BLOWFISH_COMMON=m
@@ -9901,6 +10094,7 @@ CONFIG_CRYPTO_CAST5=m
CONFIG_CRYPTO_CAST5_AVX_X86_64=m
CONFIG_CRYPTO_CAST6=m
CONFIG_CRYPTO_CAST6_AVX_X86_64=m
+CONFIG_CRYPTO_LIB_DES=m
CONFIG_CRYPTO_DES=m
CONFIG_CRYPTO_DES3_EDE_X86_64=m
CONFIG_CRYPTO_FCRYPT=m
@@ -9952,11 +10146,15 @@ CONFIG_CRYPTO_HW=y
CONFIG_CRYPTO_DEV_PADLOCK=m
CONFIG_CRYPTO_DEV_PADLOCK_AES=m
CONFIG_CRYPTO_DEV_PADLOCK_SHA=m
+CONFIG_CRYPTO_DEV_ATMEL_I2C=m
+CONFIG_CRYPTO_DEV_ATMEL_ECC=m
+CONFIG_CRYPTO_DEV_ATMEL_SHA204A=m
CONFIG_CRYPTO_DEV_CCP=y
CONFIG_CRYPTO_DEV_CCP_DD=m
CONFIG_CRYPTO_DEV_SP_CCP=y
CONFIG_CRYPTO_DEV_CCP_CRYPTO=m
CONFIG_CRYPTO_DEV_SP_PSP=y
+CONFIG_CRYPTO_DEV_CCP_DEBUGFS=y
CONFIG_CRYPTO_DEV_QAT=m
CONFIG_CRYPTO_DEV_QAT_DH895xCC=m
CONFIG_CRYPTO_DEV_QAT_C3XXX=m
@@ -9970,6 +10168,7 @@ CONFIG_CRYPTO_DEV_CHELSIO=m
CONFIG_CHELSIO_IPSEC_INLINE=y
CONFIG_CRYPTO_DEV_CHELSIO_TLS=m
CONFIG_CRYPTO_DEV_VIRTIO=m
+CONFIG_CRYPTO_DEV_SAFEXCEL=m
CONFIG_CRYPTO_DEV_CCREE=m
CONFIG_ASYMMETRIC_KEY_TYPE=y
CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y
@@ -10075,7 +10274,7 @@ CONFIG_HAS_DMA=y
CONFIG_NEED_SG_DMA_LENGTH=y
CONFIG_NEED_DMA_MAP_STATE=y
CONFIG_ARCH_DMA_ADDR_T_64BIT=y
-CONFIG_DMA_DECLARE_COHERENT=y
+CONFIG_ARCH_HAS_FORCE_DMA_UNENCRYPTED=y
CONFIG_DMA_VIRT_OPS=y
CONFIG_SWIOTLB=y
# CONFIG_DMA_API_DEBUG is not set
@@ -10089,12 +10288,14 @@ CONFIG_GLOB=y
CONFIG_NLATTR=y
CONFIG_LRU_CACHE=m
CONFIG_CLZ_TAB=y
-CONFIG_DDR=y
CONFIG_IRQ_POLL=y
CONFIG_MPILIB=y
+CONFIG_DIMLIB=y
CONFIG_LIBFDT=y
CONFIG_OID_REGISTRY=y
CONFIG_UCS2_STRING=y
+CONFIG_HAVE_GENERIC_VDSO=y
+CONFIG_GENERIC_GETTIMEOFDAY=y
CONFIG_FONT_SUPPORT=y
CONFIG_FONTS=y
# CONFIG_FONT_8x8 is not set
@@ -10117,11 +10318,10 @@ CONFIG_ARCH_HAS_UACCESS_MCSAFE=y
CONFIG_ARCH_STACKWALK=y
CONFIG_SBITMAP=y
CONFIG_PARMAN=m
+CONFIG_OBJAGG=m
# CONFIG_STRING_SELFTEST is not set
# end of Library routines
-CONFIG_OBJAGG=m
-
#
# Kernel hacking
#
@@ -10146,10 +10346,9 @@ CONFIG_DYNAMIC_DEBUG=y
CONFIG_FRAME_WARN=2048
CONFIG_STRIP_ASM_SYMS=y
# CONFIG_READABLE_ASM is not set
-CONFIG_UNUSED_SYMBOLS=y
CONFIG_DEBUG_FS=y
-# CONFIG_HEADERS_CHECK is not set
-# CONFIG_OPTIMIZE_INLINING is not set
+# CONFIG_HEADERS_INSTALL is not set
+CONFIG_OPTIMIZE_INLINING=y
# CONFIG_DEBUG_SECTION_MISMATCH is not set
CONFIG_SECTION_MISMATCH_WARN_ONLY=y
CONFIG_STACK_VALIDATION=y
@@ -10310,7 +10509,7 @@ CONFIG_PROBE_EVENTS=y
CONFIG_DYNAMIC_FTRACE=y
CONFIG_DYNAMIC_FTRACE_WITH_REGS=y
CONFIG_FUNCTION_PROFILER=y
-# CONFIG_BPF_KPROBE_OVERRIDE is not set
+CONFIG_BPF_KPROBE_OVERRIDE=y
CONFIG_FTRACE_MCOUNT_RECORD=y
# CONFIG_FTRACE_STARTUP_TEST is not set
CONFIG_MMIOTRACE=y
@@ -10330,6 +10529,7 @@ CONFIG_LKDTM=m
# CONFIG_KPROBES_SANITY_TEST is not set
# CONFIG_BACKTRACE_SELF_TEST is not set
# CONFIG_RBTREE_TEST is not set
+# CONFIG_REED_SOLOMON_TEST is not set
# CONFIG_INTERVAL_TREE_TEST is not set
# CONFIG_PERCPU_TEST is not set
# CONFIG_ATOMIC64_SELFTEST is not set
@@ -10352,6 +10552,7 @@ CONFIG_LKDTM=m
# CONFIG_TEST_VMALLOC is not set
# CONFIG_TEST_USER_COPY is not set
# CONFIG_TEST_BPF is not set
+# CONFIG_TEST_BLACKHOLE_DEV is not set
# CONFIG_FIND_BIT_BENCHMARK is not set
# CONFIG_TEST_FIRMWARE is not set
# CONFIG_TEST_SYSCTL is not set
@@ -10361,6 +10562,7 @@ CONFIG_LKDTM=m
# CONFIG_TEST_MEMCAT_P is not set
# CONFIG_TEST_OBJAGG is not set
# CONFIG_TEST_STACKINIT is not set
+# CONFIG_TEST_MEMINIT is not set
# CONFIG_MEMTEST is not set
# CONFIG_BUG_ON_DATA_CORRUPTION is not set
# CONFIG_SAMPLES is not set
@@ -10386,15 +10588,10 @@ CONFIG_DOUBLEFAULT=y
# CONFIG_IOMMU_DEBUG is not set
CONFIG_HAVE_MMIOTRACE_SUPPORT=y
# CONFIG_X86_DECODER_SELFTEST is not set
-CONFIG_IO_DELAY_TYPE_0X80=0
-CONFIG_IO_DELAY_TYPE_0XED=1
-CONFIG_IO_DELAY_TYPE_UDELAY=2
-CONFIG_IO_DELAY_TYPE_NONE=3
CONFIG_IO_DELAY_0X80=y
# CONFIG_IO_DELAY_0XED is not set
# CONFIG_IO_DELAY_UDELAY is not set
# CONFIG_IO_DELAY_NONE is not set
-CONFIG_DEFAULT_IO_DELAY_TYPE=0
CONFIG_DEBUG_BOOT_PARAMS=y
# CONFIG_CPA_DEBUG is not set
# CONFIG_DEBUG_ENTRY is not set
@@ -10404,4 +10601,4 @@ CONFIG_DEBUG_BOOT_PARAMS=y
CONFIG_UNWINDER_ORC=y
# CONFIG_UNWINDER_FRAME_POINTER is not set
# CONFIG_UNWINDER_GUESS is not set
-# end of Kernel hacking
+# end of Kernel hacking \ No newline at end of file