--- /dev/null
+From b824a67f3c2c2b6ee4604cdee46a869e3e5f5c69 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 10 Oct 2019 18:09:03 -0700
+Subject: drm/i915: fix port checks for MST support on gen >= 11
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Lucas De Marchi <lucas.demarchi@intel.com>
+
+[ Upstream commit 10d987fd1b7baceaafa78d805e71427ab735b4e4 ]
+
+Both Ice Lake and Elkhart Lake (gen 11) support MST on all external
+connections except DDI A. Tiger Lake (gen 12) supports on all external
+connections.
+
+Move the check to happen inside intel_dp_mst_encoder_init() and add
+specific platform checks.
+
+v2: Replace != with == checks for ports on gen < 11 (Ville)
+
+Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
+Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
+Link: https://patchwork.freedesktop.org/patch/msgid/20191015164029.18431-3-lucas.demarchi@intel.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/i915/intel_dp.c | 7 ++-----
+ drivers/gpu/drm/i915/intel_dp_mst.c | 22 ++++++++++++++++------
+ 2 files changed, 18 insertions(+), 11 deletions(-)
+
+diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
+index 20cd4c8acecc..77a2f7fc2b37 100644
+--- a/drivers/gpu/drm/i915/intel_dp.c
++++ b/drivers/gpu/drm/i915/intel_dp.c
+@@ -6288,11 +6288,8 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
+ intel_connector->get_hw_state = intel_connector_get_hw_state;
+
+ /* init MST on ports that can support it */
+- if (HAS_DP_MST(dev_priv) && !intel_dp_is_edp(intel_dp) &&
+- (port == PORT_B || port == PORT_C ||
+- port == PORT_D || port == PORT_F))
+- intel_dp_mst_encoder_init(intel_dig_port,
+- intel_connector->base.base.id);
++ intel_dp_mst_encoder_init(intel_dig_port,
++ intel_connector->base.base.id);
+
+ if (!intel_edp_init_connector(intel_dp, intel_connector)) {
+ intel_dp_aux_fini(intel_dp);
+diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c
+index 58ba14966d4f..c7d52c66ff29 100644
+--- a/drivers/gpu/drm/i915/intel_dp_mst.c
++++ b/drivers/gpu/drm/i915/intel_dp_mst.c
+@@ -588,21 +588,31 @@ intel_dp_create_fake_mst_encoders(struct intel_digital_port *intel_dig_port)
+ int
+ intel_dp_mst_encoder_init(struct intel_digital_port *intel_dig_port, int conn_base_id)
+ {
++ struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
+ struct intel_dp *intel_dp = &intel_dig_port->dp;
+- struct drm_device *dev = intel_dig_port->base.base.dev;
++ enum port port = intel_dig_port->base.port;
+ int ret;
+
+- intel_dp->can_mst = true;
++ if (!HAS_DP_MST(i915) || intel_dp_is_edp(intel_dp))
++ return 0;
++
++ if (INTEL_GEN(i915) < 12 && port == PORT_A)
++ return 0;
++
++ if (INTEL_GEN(i915) < 11 && port == PORT_E)
++ return 0;
++
+ intel_dp->mst_mgr.cbs = &mst_cbs;
+
+ /* create encoders */
+ intel_dp_create_fake_mst_encoders(intel_dig_port);
+- ret = drm_dp_mst_topology_mgr_init(&intel_dp->mst_mgr, dev,
++ ret = drm_dp_mst_topology_mgr_init(&intel_dp->mst_mgr, &i915->drm,
+ &intel_dp->aux, 16, 3, conn_base_id);
+- if (ret) {
+- intel_dp->can_mst = false;
++ if (ret)
+ return ret;
+- }
++
++ intel_dp->can_mst = true;
++
+ return 0;
+ }
+
+--
+2.25.1
+
--- /dev/null
+From 820a6450e44f321f114f30ef70c38c188fc0649e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 27 Nov 2019 12:50:35 +0530
+Subject: powerpc/powernv: Avoid re-registration of imc debugfs directory
+
+From: Anju T Sudhakar <anju@linux.vnet.ibm.com>
+
+[ Upstream commit 48e626ac85b43cc589dd1b3b8004f7f85f03544d ]
+
+export_imc_mode_and_cmd() function which creates the debugfs interface
+for imc-mode and imc-command, is invoked when each nest pmu units is
+registered.
+
+When the first nest pmu unit is registered, export_imc_mode_and_cmd()
+creates 'imc' directory under `/debug/powerpc/`. In the subsequent
+invocations debugfs_create_dir() function returns, since the directory
+already exists.
+
+The recent commit <c33d442328f55> (debugfs: make error message a bit
+more verbose), throws a warning if we try to invoke
+`debugfs_create_dir()` with an already existing directory name.
+
+Address this warning by making the debugfs directory registration in
+the opal_imc_counters_probe() function, i.e invoke
+export_imc_mode_and_cmd() function from the probe function.
+
+Signed-off-by: Anju T Sudhakar <anju@linux.vnet.ibm.com>
+Tested-by: Nageswara R Sastry <nasastry@in.ibm.com>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://lore.kernel.org/r/20191127072035.4283-1-anju@linux.vnet.ibm.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/powerpc/platforms/powernv/opal-imc.c | 39 ++++++++++-------------
+ 1 file changed, 16 insertions(+), 23 deletions(-)
+
+diff --git a/arch/powerpc/platforms/powernv/opal-imc.c b/arch/powerpc/platforms/powernv/opal-imc.c
+index 649fb268f446..5399682797d0 100644
+--- a/arch/powerpc/platforms/powernv/opal-imc.c
++++ b/arch/powerpc/platforms/powernv/opal-imc.c
+@@ -63,10 +63,6 @@ static void export_imc_mode_and_cmd(struct device_node *node,
+
+ imc_debugfs_parent = debugfs_create_dir("imc", powerpc_debugfs_root);
+
+- /*
+- * Return here, either because 'imc' directory already exists,
+- * Or failed to create a new one.
+- */
+ if (!imc_debugfs_parent)
+ return;
+
+@@ -139,7 +135,6 @@ static int imc_get_mem_addr_nest(struct device_node *node,
+ }
+
+ pmu_ptr->imc_counter_mmaped = true;
+- export_imc_mode_and_cmd(node, pmu_ptr);
+ kfree(base_addr_arr);
+ kfree(chipid_arr);
+ return 0;
+@@ -155,7 +150,7 @@ static int imc_get_mem_addr_nest(struct device_node *node,
+ * and domain as the inputs.
+ * Allocates memory for the struct imc_pmu, sets up its domain, size and offsets
+ */
+-static int imc_pmu_create(struct device_node *parent, int pmu_index, int domain)
++static struct imc_pmu *imc_pmu_create(struct device_node *parent, int pmu_index, int domain)
+ {
+ int ret = 0;
+ struct imc_pmu *pmu_ptr;
+@@ -163,27 +158,23 @@ static int imc_pmu_create(struct device_node *parent, int pmu_index, int domain)
+
+ /* Return for unknown domain */
+ if (domain < 0)
+- return -EINVAL;
++ return NULL;
+
+ /* memory for pmu */
+ pmu_ptr = kzalloc(sizeof(*pmu_ptr), GFP_KERNEL);
+ if (!pmu_ptr)
+- return -ENOMEM;
++ return NULL;
+
+ /* Set the domain */
+ pmu_ptr->domain = domain;
+
+ ret = of_property_read_u32(parent, "size", &pmu_ptr->counter_mem_size);
+- if (ret) {
+- ret = -EINVAL;
++ if (ret)
+ goto free_pmu;
+- }
+
+ if (!of_property_read_u32(parent, "offset", &offset)) {
+- if (imc_get_mem_addr_nest(parent, pmu_ptr, offset)) {
+- ret = -EINVAL;
++ if (imc_get_mem_addr_nest(parent, pmu_ptr, offset))
+ goto free_pmu;
+- }
+ }
+
+ /* Function to register IMC pmu */
+@@ -194,14 +185,14 @@ static int imc_pmu_create(struct device_node *parent, int pmu_index, int domain)
+ if (pmu_ptr->domain == IMC_DOMAIN_NEST)
+ kfree(pmu_ptr->mem_info);
+ kfree(pmu_ptr);
+- return ret;
++ return NULL;
+ }
+
+- return 0;
++ return pmu_ptr;
+
+ free_pmu:
+ kfree(pmu_ptr);
+- return ret;
++ return NULL;
+ }
+
+ static void disable_nest_pmu_counters(void)
+@@ -258,6 +249,7 @@ int get_max_nest_dev(void)
+ static int opal_imc_counters_probe(struct platform_device *pdev)
+ {
+ struct device_node *imc_dev = pdev->dev.of_node;
++ struct imc_pmu *pmu;
+ int pmu_count = 0, domain;
+ bool core_imc_reg = false, thread_imc_reg = false;
+ u32 type;
+@@ -273,6 +265,7 @@ static int opal_imc_counters_probe(struct platform_device *pdev)
+ }
+
+ for_each_compatible_node(imc_dev, NULL, IMC_DTB_UNIT_COMPAT) {
++ pmu = NULL;
+ if (of_property_read_u32(imc_dev, "type", &type)) {
+ pr_warn("IMC Device without type property\n");
+ continue;
+@@ -294,9 +287,13 @@ static int opal_imc_counters_probe(struct platform_device *pdev)
+ break;
+ }
+
+- if (!imc_pmu_create(imc_dev, pmu_count, domain)) {
+- if (domain == IMC_DOMAIN_NEST)
++ pmu = imc_pmu_create(imc_dev, pmu_count, domain);
++ if (pmu != NULL) {
++ if (domain == IMC_DOMAIN_NEST) {
++ if (!imc_debugfs_parent)
++ export_imc_mode_and_cmd(imc_dev, pmu);
+ pmu_count++;
++ }
+ if (domain == IMC_DOMAIN_CORE)
+ core_imc_reg = true;
+ if (domain == IMC_DOMAIN_THREAD)
+@@ -304,10 +301,6 @@ static int opal_imc_counters_probe(struct platform_device *pdev)
+ }
+ }
+
+- /* If none of the nest units are registered, remove debugfs interface */
+- if (pmu_count == 0)
+- debugfs_remove_recursive(imc_debugfs_parent);
+-
+ /* If core imc is not registered, unregister thread-imc */
+ if (!core_imc_reg && thread_imc_reg)
+ unregister_thread_imc();
+--
+2.25.1
+
--- /dev/null
+From 2b23f0c6a506942856a363a0e4f98a8285bc3267 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 10 Dec 2019 13:50:23 +0100
+Subject: s390/ftrace: save traced function caller
+
+From: Vasily Gorbik <gor@linux.ibm.com>
+
+[ Upstream commit b4adfe55915d8363e244e42386d69567db1719b9 ]
+
+A typical backtrace acquired from ftraced function currently looks like
+the following (e.g. for "path_openat"):
+
+arch_stack_walk+0x15c/0x2d8
+stack_trace_save+0x50/0x68
+stack_trace_call+0x15a/0x3b8
+ftrace_graph_caller+0x0/0x1c
+0x3e0007e3c98 <- ftraced function caller (should be do_filp_open+0x7c/0xe8)
+do_open_execat+0x70/0x1b8
+__do_execve_file.isra.0+0x7d8/0x860
+__s390x_sys_execve+0x56/0x68
+system_call+0xdc/0x2d8
+
+Note random "0x3e0007e3c98" stack value as ftraced function caller. This
+value causes either imprecise unwinder result or unwinding failure.
+That "0x3e0007e3c98" comes from r14 of ftraced function stack frame, which
+it haven't had a chance to initialize since the very first instruction
+calls ftrace code ("ftrace_caller"). (ftraced function might never
+save r14 as well). Nevertheless according to s390 ABI any function
+is called with stack frame allocated for it and r14 contains return
+address. "ftrace_caller" itself is called with "brasl %r0,ftrace_caller".
+So, to fix this issue simply always save traced function caller onto
+ftraced function stack frame.
+
+Reported-by: Sven Schnelle <svens@linux.ibm.com>
+Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/s390/kernel/mcount.S | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/arch/s390/kernel/mcount.S b/arch/s390/kernel/mcount.S
+index 83afd5b78e16..020f9aac7dc0 100644
+--- a/arch/s390/kernel/mcount.S
++++ b/arch/s390/kernel/mcount.S
+@@ -40,6 +40,7 @@ EXPORT_SYMBOL(_mcount)
+ ENTRY(ftrace_caller)
+ .globl ftrace_regs_caller
+ .set ftrace_regs_caller,ftrace_caller
++ stg %r14,(__SF_GPRS+8*8)(%r15) # save traced function caller
+ lgr %r1,%r15
+ #if !(defined(CC_USING_HOTPATCH) || defined(CC_USING_NOP_MCOUNT))
+ aghi %r0,MCOUNT_RETURN_FIXUP
+--
+2.25.1
+
--- /dev/null
+From 11738c6dc38de683ecbcd5adf07fa480ba557f27 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 12 Nov 2019 17:30:56 +0800
+Subject: scsi: hisi_sas: Check sas_port before using it
+
+From: Xiang Chen <chenxiang66@hisilicon.com>
+
+[ Upstream commit 8c39673d5474b95374df2104dc1f65205c5278b8 ]
+
+Need to check the structure sas_port before using it.
+
+Link: https://lore.kernel.org/r/1573551059-107873-2-git-send-email-john.garry@huawei.com
+Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com>
+Signed-off-by: John Garry <john.garry@huawei.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/scsi/hisi_sas/hisi_sas_main.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c
+index 33191673249c..de4f41bce8e9 100644
+--- a/drivers/scsi/hisi_sas/hisi_sas_main.c
++++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
+@@ -789,12 +789,13 @@ static void hisi_sas_port_notify_formed(struct asd_sas_phy *sas_phy)
+ struct hisi_hba *hisi_hba = sas_ha->lldd_ha;
+ struct hisi_sas_phy *phy = sas_phy->lldd_phy;
+ struct asd_sas_port *sas_port = sas_phy->port;
+- struct hisi_sas_port *port = to_hisi_sas_port(sas_port);
++ struct hisi_sas_port *port;
+ unsigned long flags;
+
+ if (!sas_port)
+ return;
+
++ port = to_hisi_sas_port(sas_port);
+ spin_lock_irqsave(&hisi_hba->lock, flags);
+ port->port_attached = 1;
+ port->id = phy->port_id;
+--
+2.25.1
+
revert-cgroup-add-memory-barriers-to-plug-cgroup_rst.patch
libnvdimm-fix-endian-conversion-issues.patch
+drm-i915-fix-port-checks-for-mst-support-on-gen-11.patch
+scsi-hisi_sas-check-sas_port-before-using-it.patch
+powerpc-powernv-avoid-re-registration-of-imc-debugfs.patch
+spi-dw-use-smp_mb-to-avoid-sending-spi-data-error.patch
+s390-ftrace-save-traced-function-caller.patch
--- /dev/null
+From de927951db4badabad0360deab59c0e11aaf3366 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 3 Jan 2020 10:52:10 +0800
+Subject: spi: dw: use "smp_mb()" to avoid sending spi data error
+
+From: Xinwei Kong <kong.kongxinwei@hisilicon.com>
+
+[ Upstream commit bfda044533b213985bc62bd7ca96f2b984d21b80 ]
+
+Because of out-of-order execution about some CPU architecture,
+In this debug stage we find Completing spi interrupt enable ->
+prodrucing TXEI interrupt -> running "interrupt_transfer" function
+will prior to set "dw->rx and dws->rx_end" data, so this patch add
+memory barrier to enable dw->rx and dw->rx_end to be visible and
+solve to send SPI data error.
+eg:
+it will fix to this following low possibility error in testing environment
+which using SPI control to connect TPM Modules
+
+kernel: tpm tpm0: Operation Timed out
+kernel: tpm tpm0: tpm_relinquish_locality: : error -1
+
+Signed-off-by: fengsheng <fengsheng5@huawei.com>
+Signed-off-by: Xinwei Kong <kong.kongxinwei@hisilicon.com>
+Link: https://lore.kernel.org/r/1578019930-55858-1-git-send-email-kong.kongxinwei@hisilicon.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/spi/spi-dw.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/drivers/spi/spi-dw.c b/drivers/spi/spi-dw.c
+index 5a47e28e38c1..6f0f6b99953d 100644
+--- a/drivers/spi/spi-dw.c
++++ b/drivers/spi/spi-dw.c
+@@ -304,6 +304,9 @@ static int dw_spi_transfer_one(struct spi_controller *master,
+ dws->len = transfer->len;
+ spin_unlock_irqrestore(&dws->buf_lock, flags);
+
++ /* Ensure dw->rx and dw->rx_end are visible */
++ smp_mb();
++
+ spi_enable_chip(dws, 0);
+
+ /* Handle per transfer options for bpw and speed */
+--
+2.25.1
+