summaryrefslogtreecommitdiff |
diff options
author | Kernel Build Daemon <kbuild@suse.de> | 2018-11-01 07:14:23 +0100 |
---|---|---|
committer | Kernel Build Daemon <kbuild@suse.de> | 2018-11-01 07:14:23 +0100 |
commit | 3fcf4577e49ed22129e0f5799565f85fcc7c7147 (patch) | |
tree | 8e31cc8bacc789c5a00b0646b06e96b85d26819c | |
parent | d95ffc7fe6013a6a2a62d6507acfbbf06c9aefcc (diff) | |
parent | f773242a6f6fcd2cbd2ae5d118018b81862e04a8 (diff) |
Merge branch 'SLE15' into openSUSE-15.0
25 files changed, 1152 insertions, 92 deletions
diff --git a/blacklist.conf b/blacklist.conf index 4e1f3f276c..30bec138ed 100644 --- a/blacklist.conf +++ b/blacklist.conf @@ -880,3 +880,6 @@ af424a410749ed7e0c2bffd3cedbc7c274d0ff6f # usb: dwc2: breaks kABI e7c52b84fb18f08ce49b6067ae6285aca79084a8 # kasan fix ad1a56f1bf2bd2394f98320baf9ad430f7b1534c # We don't carry the reverted patch. d60996ab430c8a6033a0944c068edc5ec5becb9b # Duplicate of 3af71f649d22f359790b4032446456a967a81742 +c894696188d5c2af1e636e458190e80c53fb893d # rtlwifi: the target function doesn't exist yet +16d571bb0fe6aa7fed82e19166ca1542026c9c06 # rt2x00: not cleanly applicable, merely optimization +d59d2f9995d28974877750f429e821324bd603c7 # r8822be: not present in SLE15 diff --git a/patches.drivers/drm-nouveau-Don-t-disable-polling-in-fallback-mode.patch b/patches.drivers/drm-nouveau-Don-t-disable-polling-in-fallback-mode.patch new file mode 100644 index 0000000000..94aa215f9b --- /dev/null +++ b/patches.drivers/drm-nouveau-Don-t-disable-polling-in-fallback-mode.patch @@ -0,0 +1,43 @@ +From 3639c381cdf5fa4340cbc2c7f34e2b526a6f6a6b Mon Sep 17 00:00:00 2001 +From: Takashi Iwai <tiwai@suse.de> +Date: Fri, 31 Aug 2018 12:03:28 +0200 +Subject: [PATCH] drm/nouveau: Don't disable polling in fallback mode +Patch-mainline: Submitted, dri-devel ML +References: bsc#1103356 + +When a fan is controlled via linear fallback without cstate, we +shouldn't stop polling. Otherwise it won't be adjusted again and +keeps running at an initial crazy pace. + +Bugzilla: https://bugzilla.suse.com/show_bug.cgi?id=1103356 +Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107447 +Reported-by: Thomas Blume <thomas.blume@suse.com> +Signed-off-by: Takashi Iwai <tiwai@suse.de> + +--- + drivers/gpu/drm/nouveau/nvkm/subdev/therm/base.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/therm/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/therm/base.c +index 3695cde669f8..07914e36939e 100644 +--- a/drivers/gpu/drm/nouveau/nvkm/subdev/therm/base.c ++++ b/drivers/gpu/drm/nouveau/nvkm/subdev/therm/base.c +@@ -132,11 +132,12 @@ nvkm_therm_update(struct nvkm_therm *therm, int mode) + duty = nvkm_therm_update_linear(therm); + break; + case NVBIOS_THERM_FAN_OTHER: +- if (therm->cstate) ++ if (therm->cstate) { + duty = therm->cstate; +- else ++ poll = false; ++ } else { + duty = nvkm_therm_update_linear_fallback(therm); +- poll = false; ++ } + break; + } + immd = false; +-- +2.18.0 + diff --git a/patches.drivers/spi-bcm-qspi-switch-back-to-reading-flash-using-smal.patch b/patches.drivers/spi-bcm-qspi-switch-back-to-reading-flash-using-smal.patch new file mode 100644 index 0000000000..51b992d9e9 --- /dev/null +++ b/patches.drivers/spi-bcm-qspi-switch-back-to-reading-flash-using-smal.patch @@ -0,0 +1,53 @@ +From 940ec770c295682993d1cccce3081fd7c74fece8 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl> +Date: Thu, 11 Oct 2018 09:42:17 +0200 +Subject: [PATCH] spi: bcm-qspi: switch back to reading flash using smaller chunks +Mime-version: 1.0 +Content-type: text/plain; charset=UTF-8 +Content-transfer-encoding: 8bit +Git-commit: 940ec770c295682993d1cccce3081fd7c74fece8 +Patch-mainline: v4.20-rc1 +References: bsc#1051510 + +Fixing/optimizing bcm_qspi_bspi_read() performance introduced two +Changes: +1) It added a loop to read all requested data using multiple BSPI ops. +2) It bumped max size of a single BSPI block request from 256 to 512 B. + +The later change resulted in occasional BSPI timeouts causing a +regression. + +For some unknown reason hardware doesn't always handle reads as expected +when using 512 B chunks. In such cases it may happen that BSPI returns +amount of requested bytes without the last 1-3 ones. It provides the +remaining bytes later but doesn't raise an interrupt until another LR +start. + +Switching back to 256 B reads fixes that problem and regression. + +Fixes: 345309fa7c0c ("spi: bcm-qspi: Fix bcm_qspi_bspi_read() performance") +Signed-off-by: Rafał Miłecki <rafal@milecki.pl> +Signed-off-by: Mark Brown <broonie@kernel.org> +Cc: stable@vger.kernel.org +Acked-by: Takashi Iwai <tiwai@suse.de> + +--- + drivers/spi/spi-bcm-qspi.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/spi/spi-bcm-qspi.c b/drivers/spi/spi-bcm-qspi.c +index eb3d67f01e8c..584bcb018a62 100644 +--- a/drivers/spi/spi-bcm-qspi.c ++++ b/drivers/spi/spi-bcm-qspi.c +@@ -89,7 +89,7 @@ + #define BSPI_BPP_MODE_SELECT_MASK BIT(8) + #define BSPI_BPP_ADDR_SELECT_MASK BIT(16) + +-#define BSPI_READ_LENGTH 512 ++#define BSPI_READ_LENGTH 256 + + /* MSPI register offsets */ + #define MSPI_SPCR0_LSB 0x000 +-- +2.19.1 + diff --git a/patches.drivers/spi-bcm63xx-hsspi-keep-pll-clk-enabled.patch b/patches.drivers/spi-bcm63xx-hsspi-keep-pll-clk-enabled.patch new file mode 100644 index 0000000000..82992195c1 --- /dev/null +++ b/patches.drivers/spi-bcm63xx-hsspi-keep-pll-clk-enabled.patch @@ -0,0 +1,115 @@ +From 0fd85869c2a9c8723a98bc1f56a876e8383649f4 Mon Sep 17 00:00:00 2001 +From: Jonas Gorski <jonas.gorski@gmail.com> +Date: Tue, 28 Aug 2018 13:44:11 +0200 +Subject: [PATCH] spi/bcm63xx-hsspi: keep pll clk enabled +Git-commit: 0fd85869c2a9c8723a98bc1f56a876e8383649f4 +Patch-mainline: v4.20-rc1 +References: bsc#1051510 + +If the pll clock needs to be enabled to get its rate, it will also need +to be enabled to provide it. So ensure it is kept enabled through the +lifetime of the device. + +Fixes: 0d7412ed1f5dc ("spi/bcm63xx-hspi: Enable the clock before calling clk_get_rate().") +Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com> +Signed-off-by: Mark Brown <broonie@kernel.org> +Acked-by: Takashi Iwai <tiwai@suse.de> + +--- + drivers/spi/spi-bcm63xx-hsspi.c | 20 ++++++++++++++++---- + 1 file changed, 16 insertions(+), 4 deletions(-) + +diff --git a/drivers/spi/spi-bcm63xx-hsspi.c b/drivers/spi/spi-bcm63xx-hsspi.c +index c23849f7aa7b..9a06ffdb73b8 100644 +--- a/drivers/spi/spi-bcm63xx-hsspi.c ++++ b/drivers/spi/spi-bcm63xx-hsspi.c +@@ -101,6 +101,7 @@ struct bcm63xx_hsspi { + + struct platform_device *pdev; + struct clk *clk; ++ struct clk *pll_clk; + void __iomem *regs; + u8 __iomem *fifo; + +@@ -332,7 +333,7 @@ static int bcm63xx_hsspi_probe(struct platform_device *pdev) + struct resource *res_mem; + void __iomem *regs; + struct device *dev = &pdev->dev; +- struct clk *clk; ++ struct clk *clk, *pll_clk = NULL; + int irq, ret; + u32 reg, rate, num_cs = HSSPI_SPI_MAX_CS; + +@@ -358,7 +359,7 @@ static int bcm63xx_hsspi_probe(struct platform_device *pdev) + + rate = clk_get_rate(clk); + if (!rate) { +- struct clk *pll_clk = devm_clk_get(dev, "pll"); ++ pll_clk = devm_clk_get(dev, "pll"); + + if (IS_ERR(pll_clk)) { + ret = PTR_ERR(pll_clk); +@@ -373,19 +374,20 @@ static int bcm63xx_hsspi_probe(struct platform_device *pdev) + clk_disable_unprepare(pll_clk); + if (!rate) { + ret = -EINVAL; +- goto out_disable_clk; ++ goto out_disable_pll_clk; + } + } + + master = spi_alloc_master(&pdev->dev, sizeof(*bs)); + if (!master) { + ret = -ENOMEM; +- goto out_disable_clk; ++ goto out_disable_pll_clk; + } + + bs = spi_master_get_devdata(master); + bs->pdev = pdev; + bs->clk = clk; ++ bs->pll_clk = pll_clk; + bs->regs = regs; + bs->speed_hz = rate; + bs->fifo = (u8 __iomem *)(bs->regs + HSSPI_FIFO_REG(0)); +@@ -440,6 +442,8 @@ static int bcm63xx_hsspi_probe(struct platform_device *pdev) + + out_put_master: + spi_master_put(master); ++out_disable_pll_clk: ++ clk_disable_unprepare(pll_clk); + out_disable_clk: + clk_disable_unprepare(clk); + return ret; +@@ -453,6 +457,7 @@ static int bcm63xx_hsspi_remove(struct platform_device *pdev) + + /* reset the hardware and block queue progress */ + __raw_writel(0, bs->regs + HSSPI_INT_MASK_REG); ++ clk_disable_unprepare(bs->pll_clk); + clk_disable_unprepare(bs->clk); + + return 0; +@@ -465,6 +470,7 @@ static int bcm63xx_hsspi_suspend(struct device *dev) + struct bcm63xx_hsspi *bs = spi_master_get_devdata(master); + + spi_master_suspend(master); ++ clk_disable_unprepare(bs->pll_clk); + clk_disable_unprepare(bs->clk); + + return 0; +@@ -480,6 +486,12 @@ static int bcm63xx_hsspi_resume(struct device *dev) + if (ret) + return ret; + ++ if (bs->pll_clk) { ++ ret = clk_prepare_enable(bs->pll_clk); ++ if (ret) ++ return ret; ++ } ++ + spi_master_resume(master); + + return 0; +-- +2.19.1 + diff --git a/patches.drivers/spi-sh-msiof-fix-deferred-probing.patch b/patches.drivers/spi-sh-msiof-fix-deferred-probing.patch new file mode 100644 index 0000000000..06fab960cb --- /dev/null +++ b/patches.drivers/spi-sh-msiof-fix-deferred-probing.patch @@ -0,0 +1,41 @@ +From f34c6e6257aa477cdfe7e9bbbecd3c5648ecda69 Mon Sep 17 00:00:00 2001 +From: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com> +Date: Fri, 12 Oct 2018 22:48:22 +0300 +Subject: [PATCH] spi: sh-msiof: fix deferred probing +Git-commit: f34c6e6257aa477cdfe7e9bbbecd3c5648ecda69 +Patch-mainline: v4.20-rc1 +References: bsc#1051510 + +Since commit 9ec36cafe43b ("of/irq: do irq resolution in platform_get_irq") +platform_get_irq() can return -EPROBE_DEFER. However, the driver overrides +an error returned by that function with -ENOENT which breaks the deferred +probing. Propagate upstream an error code returned by platform_get_irq() +and remove the bogus "platform" from the error message, while at it... + +Fixes: 9ec36cafe43b ("of/irq: do irq resolution in platform_get_irq") +Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com> +Signed-off-by: Mark Brown <broonie@kernel.org> +Acked-by: Takashi Iwai <tiwai@suse.de> + +--- + drivers/spi/spi-sh-msiof.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/spi/spi-sh-msiof.c b/drivers/spi/spi-sh-msiof.c +index 101cd6aae2ea..30ea0a2068e0 100644 +--- a/drivers/spi/spi-sh-msiof.c ++++ b/drivers/spi/spi-sh-msiof.c +@@ -1343,8 +1343,8 @@ static int sh_msiof_spi_probe(struct platform_device *pdev) + + i = platform_get_irq(pdev, 0); + if (i < 0) { +- dev_err(&pdev->dev, "cannot get platform IRQ\n"); +- ret = -ENOENT; ++ dev_err(&pdev->dev, "cannot get IRQ\n"); ++ ret = i; + goto err1; + } + +-- +2.19.1 + diff --git a/patches.fixes/0001-drm-amdgpu-powerplay-fix-missing-break-in-switch-sta.patch b/patches.fixes/0001-drm-amdgpu-powerplay-fix-missing-break-in-switch-sta.patch index e48edf5d75..02da211c31 100644 --- a/patches.fixes/0001-drm-amdgpu-powerplay-fix-missing-break-in-switch-sta.patch +++ b/patches.fixes/0001-drm-amdgpu-powerplay-fix-missing-break-in-switch-sta.patch @@ -3,8 +3,7 @@ From: Colin Ian King <colin.king@canonical.com> Date: Mon, 8 Oct 2018 17:22:28 +0100 Subject: drm/amdgpu/powerplay: fix missing break in switch statements Git-commit: 14b284832e7dea6f54f0adfd7bed105548b94e57 -Git-repo: git://anongit.freedesktop.org/drm/drm-misc -Patch-mainline: Queued in subsystem maintainer repository +Patch-mainline: v4.20-rc1 References: bsc#1113722 There are several switch statements that are missing break statements. diff --git a/patches.fixes/0001-drm-amdgpu-update-tmr-mc-address.patch b/patches.fixes/0001-drm-amdgpu-update-tmr-mc-address.patch index a3c0e294d7..b7df52a28c 100644 --- a/patches.fixes/0001-drm-amdgpu-update-tmr-mc-address.patch +++ b/patches.fixes/0001-drm-amdgpu-update-tmr-mc-address.patch @@ -2,8 +2,8 @@ From 435198f33b56d7b875a8173a0227ddf0de285aa1 Mon Sep 17 00:00:00 2001 From: James Zhu <jzhums@gmail.com> Date: Fri, 10 Aug 2018 00:31:39 +0800 Subject: [PATCH] drm/amdgpu: update tmr mc address -References: bsc#1100132 -Patch-mainline: v4.18-rc7 +References: bsc#1106110 +Patch-mainline: v4.19-rc1 Git-commit: 435198f33b56d7b875a8173a0227ddf0de285aa1 Update tmr mc address with firmware loading address diff --git a/patches.fixes/0001-drm-hisilicon-hibmc-Do-not-carry-error-code-in-HiBMC.patch b/patches.fixes/0001-drm-hisilicon-hibmc-Do-not-carry-error-code-in-HiBMC.patch index 97ae2d8eca..0fb9b3daaa 100644 --- a/patches.fixes/0001-drm-hisilicon-hibmc-Do-not-carry-error-code-in-HiBMC.patch +++ b/patches.fixes/0001-drm-hisilicon-hibmc-Do-not-carry-error-code-in-HiBMC.patch @@ -4,8 +4,7 @@ Date: Sat, 22 Sep 2018 01:25:25 +0800 Subject: drm/hisilicon: hibmc: Do not carry error code in HiBMC framebuffer pointer Git-commit: 331d880b35a76b5de0eec8cbcecbf615d758a5f9 -Git-repo: git://anongit.freedesktop.org/drm/drm-misc -Patch-mainline: Queued in subsystem maintainer repository +Patch-mainline: v4.20-rc1 References: bsc#1113722 In hibmc_drm_fb_create(), when the call to hibmc_framebuffer_init() fails diff --git a/patches.fixes/0001-drm-hisilicon-hibmc-Don-t-overwrite-fb-helper-surfac.patch b/patches.fixes/0001-drm-hisilicon-hibmc-Don-t-overwrite-fb-helper-surfac.patch index e9a82d4ec0..702f9d11c7 100644 --- a/patches.fixes/0001-drm-hisilicon-hibmc-Don-t-overwrite-fb-helper-surfac.patch +++ b/patches.fixes/0001-drm-hisilicon-hibmc-Don-t-overwrite-fb-helper-surfac.patch @@ -3,8 +3,7 @@ From: John Garry <john.garry@huawei.com> Date: Sat, 22 Sep 2018 01:25:26 +0800 Subject: drm/hisilicon: hibmc: Don't overwrite fb helper surface depth Git-commit: 0ff9f49646353ce31312411e7e7bd2281492a40e -Git-repo: git://anongit.freedesktop.org/drm/drm-misc -Patch-mainline: Queued in subsystem maintainer repository +Patch-mainline: v4.20-rc1 References: bsc#1113722 Currently the driver overwrites the surface depth provided by the fb diff --git a/patches.fixes/0001-drm-i915-audio-Hook-up-component-bindings-even-if-di.patch b/patches.fixes/0001-drm-i915-audio-Hook-up-component-bindings-even-if-di.patch index 58fce69ed7..0482da221c 100644 --- a/patches.fixes/0001-drm-i915-audio-Hook-up-component-bindings-even-if-di.patch +++ b/patches.fixes/0001-drm-i915-audio-Hook-up-component-bindings-even-if-di.patch @@ -4,8 +4,7 @@ Date: Fri, 17 Aug 2018 11:02:41 +0100 Subject: drm/i915/audio: Hook up component bindings even if displays are disabled Git-commit: 35a5fd9ebfa93758ca579e30f337b6c9126d995b -Git-repo: git://anongit.freedesktop.org/drm/drm-misc -Patch-mainline: Queued in subsystem maintainer repository +Patch-mainline: v4.20-rc1 References: bsc#1113722 If the display has been disabled by modparam, we still want to connect diff --git a/patches.fixes/0001-drm-i915-gen9-Fix-initial-readout-for-Y-tiled-frameb.patch b/patches.fixes/0001-drm-i915-gen9-Fix-initial-readout-for-Y-tiled-frameb.patch index ee7c94ee5b..a8baf99390 100644 --- a/patches.fixes/0001-drm-i915-gen9-Fix-initial-readout-for-Y-tiled-frameb.patch +++ b/patches.fixes/0001-drm-i915-gen9-Fix-initial-readout-for-Y-tiled-frameb.patch @@ -6,8 +6,7 @@ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Git-commit: d9a515867bdba59ebf196a6ade10faae8e8be36a -Git-repo: git://anongit.freedesktop.org/drm/drm-misc -Patch-mainline: Queued in subsystem maintainer repository +Patch-mainline: v4.20-rc1 References: bsc#1113722 If BIOS configured a Y tiled FB we failed to set up the backing object diff --git a/patches.fixes/0001-drm-sti-do-not-remove-the-drm_bridge-that-was-never-.patch b/patches.fixes/0001-drm-sti-do-not-remove-the-drm_bridge-that-was-never-.patch index 27cb2c1653..f6e9581e09 100644 --- a/patches.fixes/0001-drm-sti-do-not-remove-the-drm_bridge-that-was-never-.patch +++ b/patches.fixes/0001-drm-sti-do-not-remove-the-drm_bridge-that-was-never-.patch @@ -3,8 +3,7 @@ From: Peter Rosin <peda@axentia.se> Date: Mon, 6 Aug 2018 08:19:09 +0200 Subject: drm/sti: do not remove the drm_bridge that was never added Git-commit: 66e31a72dc38543b2d9d1ce267dc78ba9beebcfd -Git-repo: git://anongit.freedesktop.org/drm/drm-misc -Patch-mainline: Queued in subsystem maintainer repository +Patch-mainline: v4.20-rc1 References: bsc#1113722 Removing the drm_bridge_remove call should avoid a NULL dereference diff --git a/patches.fixes/0001-drm-virtio-fix-bounds-check-in-virtio_gpu_cmd_get_ca.patch b/patches.fixes/0001-drm-virtio-fix-bounds-check-in-virtio_gpu_cmd_get_ca.patch index f12f9191bf..c3f3505f42 100644 --- a/patches.fixes/0001-drm-virtio-fix-bounds-check-in-virtio_gpu_cmd_get_ca.patch +++ b/patches.fixes/0001-drm-virtio-fix-bounds-check-in-virtio_gpu_cmd_get_ca.patch @@ -3,8 +3,7 @@ From: Dan Carpenter <dan.carpenter@oracle.com> Date: Wed, 4 Jul 2018 12:42:50 +0300 Subject: drm/virtio: fix bounds check in virtio_gpu_cmd_get_capset() Git-commit: 09c4b49457434fa74749ad6194ef28464d9f5df9 -Git-repo: git://anongit.freedesktop.org/drm/drm-misc -Patch-mainline: Queued in subsystem maintainer repository +Patch-mainline: v4.20-rc1 References: bsc#1113722 This doesn't affect runtime because in the current code "idx" is always diff --git a/patches.fixes/0001-x86-boot-KASLR-Work-around-firmware-bugs-by-excludin.patch b/patches.fixes/0001-x86-boot-KASLR-Work-around-firmware-bugs-by-excludin.patch new file mode 100644 index 0000000000..de9ac5767f --- /dev/null +++ b/patches.fixes/0001-x86-boot-KASLR-Work-around-firmware-bugs-by-excludin.patch @@ -0,0 +1,126 @@ +From 0982adc746736a313dac9cb8cc936ca51ca3741a Mon Sep 17 00:00:00 2001 +From: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com> +Date: Mon, 28 Aug 2017 16:30:59 +0900 +Subject: [PATCH] x86/boot/KASLR: Work around firmware bugs by excluding + EFI_BOOT_SERVICES_* and EFI_LOADER_* from KASLR's choice +Git-commit: 0982adc746736a313dac9cb8cc936ca51ca3741a +Patch-mainline: v4.14-rc1 +References: bnc#1112878 + +There's a potential bug in how we select the KASLR kernel address n +the early boot code. + +The KASLR boot code currently chooses the kernel image's physical memory +location from E820_TYPE_RAM regions by walking over all e820 entries. + +E820_TYPE_RAM includes EFI_BOOT_SERVICES_CODE and EFI_BOOT_SERVICES_DATA +as well, so those regions can end up hosting the kernel image. According to +the UEFI spec, all memory regions marked as EfiBootServicesCode and +EfiBootServicesData are available as free memory after the first call +to ExitBootServices(). I.e. so such regions should be usable for the +kernel, per spec. + +In real life however, we have workarounds for broken x86 firmware, +where we keep such regions reserved until SetVirtualAddressMap() is done. + +See the following code in should_map_region(): + + static bool should_map_region(efi_memory_desc_t *md) + { + ... + /* + * Map boot services regions as a workaround for buggy + * firmware that accesses them even when they shouldn't. + * + * See efi_{reserve,free}_boot_services(). + */ + if (md->type =3D=3D EFI_BOOT_SERVICES_CODE || + md->type =3D=3D EFI_BOOT_SERVICES_DATA) + return false; + +This workaround suppressed a boot crash, but potential issues still +remain because no one prevents the regions from overlapping with kernel +image by KASLR. + +So let's make sure that EFI_BOOT_SERVICES_{CODE|DATA} regions are never +chosen as kernel memory for the workaround to work fine. + +Furthermore, EFI_LOADER_{CODE|DATA} regions are also excluded because +they can be used after ExitBootServices() as defined in EFI spec. + +As a result, we choose kernel address only from EFI_CONVENTIONAL_MEMORY +which is the only memory type we know to be safely free. + +Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com> +Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> +Cc: Baoquan He <bhe@redhat.com> +Cc: Junichi Nomura <j-nomura@ce.jp.nec.com> +Cc: Kees Cook <keescook@chromium.org> +Cc: Linus Torvalds <torvalds@linux-foundation.org> +Cc: Matt Fleming <matt@codeblueprint.co.uk> +Cc: Peter Zijlstra <peterz@infradead.org> +Cc: Thomas Garnier <thgarnie@google.com> +Cc: Thomas Gleixner <tglx@linutronix.de> +Cc: fanc.fnst@cn.fujitsu.com +Cc: izumi.taku@jp.fujitsu.com +Link: http://lkml.kernel.org/r/20170828074444.GC23181@hori1.linux.bs1.fc.nec.co.jp +[ Rewrote/fixed/clarified the changelog and the in code comments. ] +Signed-off-by: Ingo Molnar <mingo@kernel.org> +Acked-by: Lee, Chun-Yi <jlee@suse.com> +--- + arch/x86/boot/compressed/kaslr.c | 40 ++++++++++++++++++++++++++++++--------- + 1 file changed, 31 insertions(+), 9 deletions(-) + +--- a/arch/x86/boot/compressed/kaslr.c ++++ b/arch/x86/boot/compressed/kaslr.c +@@ -619,19 +619,41 @@ process_efi_entries(unsigned long minimu + for (i = 0; i < nr_desc; i++) { + md = efi_early_memdesc_ptr(pmap, e->efi_memdesc_size, i); + if (md->attribute & EFI_MEMORY_MORE_RELIABLE) { +- region.start = md->phys_addr; +- region.size = md->num_pages << EFI_PAGE_SHIFT; +- process_mem_region(®ion, minimum, image_size); + efi_mirror_found = true; +- +- if (slot_area_index == MAX_SLOT_AREA) { +- debug_putstr("Aborted EFI scan (slot_areas full)!\n"); +- break; +- } ++ break; + } + } + +- return efi_mirror_found; ++ for (i = 0; i < nr_desc; i++) { ++ md = efi_early_memdesc_ptr(pmap, e->efi_memdesc_size, i); ++ ++ /* ++ * Here we are more conservative in picking free memory than ++ * the EFI spec allows: ++ * ++ * According to the spec, EFI_BOOT_SERVICES_{CODE|DATA} are also ++ * free memory and thus available to place the kernel image into, ++ * but in practice there's firmware where using that memory leads ++ * to crashes. ++ * ++ * Only EFI_CONVENTIONAL_MEMORY is guaranteed to be free. ++ */ ++ if (md->type != EFI_CONVENTIONAL_MEMORY) ++ continue; ++ ++ if (efi_mirror_found && ++ !(md->attribute & EFI_MEMORY_MORE_RELIABLE)) ++ continue; ++ ++ region.start = md->phys_addr; ++ region.size = md->num_pages << EFI_PAGE_SHIFT; ++ process_mem_region(®ion, minimum, image_size); ++ if (slot_area_index == MAX_SLOT_AREA) { ++ debug_putstr("Aborted EFI scan (slot_areas full)!\n"); ++ break; ++ } ++ } ++ return true; + } + #else + static inline bool diff --git a/patches.fixes/libnvdimm-dimm-maximize-label-transfer-size.patch b/patches.fixes/libnvdimm-dimm-maximize-label-transfer-size.patch new file mode 100644 index 0000000000..e1194a8b8b --- /dev/null +++ b/patches.fixes/libnvdimm-dimm-maximize-label-transfer-size.patch @@ -0,0 +1,71 @@ +From: Dan Williams <dan.j.williams@intel.com> +Date: Wed, 10 Oct 2018 16:38:24 -0700 +Subject: libnvdimm, dimm: Maximize label transfer size +Git-commit: d11cf4a7321b538563b0ab30dc0d1f18f9c56226 +Patch-mainline: v4.20-rc1 +References: bsc#1111921, bsc#1113408, FATE#326765, bsc#1113972 + +Use kvzalloc() to bypass the arbitrary PAGE_SIZE limit of label transfer +operations. Given the expense of calling into firmware, maximize the +amount of label data we transfer per call to be up to the total label +space if allowed by the firmware. + +Instead of limiting based on PAGE_SIZE we can instead simply limit the +maximum size based on either the config_size int he case of the get +operation, or the length of the write based on the set operation. + +On a system with 24 NVDIMM modules each with a config_size of 128K and a +maximum transfer size of 64K - 4, this patch reduces the init time for the +label data from around 24 seconds down to between 4-5 seconds. + +Reviewed-by: Toshi Kani <toshi.kani@hpe.com> +Signed-off-by: Alexander Duyck <alexander.h.duyck@linux.intel.com> +Signed-off-by: Dan Williams <dan.j.williams@intel.com> +Acked-by: Johannes Thumshirn <jthumshirn@suse.de> +--- + drivers/nvdimm/dimm_devs.c | 13 ++++++------- + 1 file changed, 6 insertions(+), 7 deletions(-) + +--- a/drivers/nvdimm/dimm_devs.c ++++ b/drivers/nvdimm/dimm_devs.c +@@ -110,8 +110,8 @@ int nvdimm_init_config_data(struct nvdim + if (!ndd->data) + return -ENOMEM; + +- max_cmd_size = min_t(u32, PAGE_SIZE, ndd->nsarea.max_xfer); +- cmd = kzalloc(max_cmd_size + sizeof(*cmd), GFP_KERNEL); ++ max_cmd_size = min_t(u32, ndd->nsarea.config_size, ndd->nsarea.max_xfer); ++ cmd = kvzalloc(max_cmd_size + sizeof(*cmd), GFP_KERNEL); + if (!cmd) + return -ENOMEM; + +@@ -133,7 +133,7 @@ int nvdimm_init_config_data(struct nvdim + memcpy(ndd->data + offset, cmd->out_buf, cmd->in_length); + } + dev_dbg(ndd->dev, "%s: len: %zu rc: %d\n", __func__, offset, rc); +- kfree(cmd); ++ kvfree(cmd); + + return rc; + } +@@ -156,9 +156,8 @@ int nvdimm_set_config_data(struct nvdimm + if (offset + len > ndd->nsarea.config_size) + return -ENXIO; + +- max_cmd_size = min_t(u32, PAGE_SIZE, len); +- max_cmd_size = min_t(u32, max_cmd_size, ndd->nsarea.max_xfer); +- cmd = kzalloc(max_cmd_size + sizeof(*cmd) + sizeof(u32), GFP_KERNEL); ++ max_cmd_size = min_t(u32, len, ndd->nsarea.max_xfer); ++ cmd = kvzalloc(max_cmd_size + sizeof(*cmd) + sizeof(u32), GFP_KERNEL); + if (!cmd) + return -ENOMEM; + +@@ -182,7 +181,7 @@ int nvdimm_set_config_data(struct nvdimm + break; + } + } +- kfree(cmd); ++ kvfree(cmd); + + return rc; + } diff --git a/patches.fixes/libnvdimm-label-change-nvdimm_num_label_slots-per-uefi-2-7.patch b/patches.fixes/libnvdimm-label-change-nvdimm_num_label_slots-per-uefi-2-7.patch new file mode 100644 index 0000000000..2f7a23858b --- /dev/null +++ b/patches.fixes/libnvdimm-label-change-nvdimm_num_label_slots-per-uefi-2-7.patch @@ -0,0 +1,79 @@ +From: Toshi Kani <toshi.kani@hpe.com> +Date: Fri, 23 Feb 2018 14:59:22 -0700 +Subject: libnvdimm, label: change nvdimm_num_label_slots per UEFI 2.7 +Git-commit: 9e694d9c18dde0fa57ec067043b581bd57c9fb65 +Patch-mainline: v4.17-rc1 +References: bsc#1111921, bsc#1113408, FATE#326765, bsc#1113972 + +sizeof_namespace_index() fails when NVDIMM devices have the minimum +1024 bytes label storage area. nvdimm_num_label_slots() returns 3 +slots while the area is only big enough for 2 slots. + +Change nvdimm_num_label_slots() to calculate a number of label slots +according to UEFI 2.7 spec. + +Signed-off-by: Toshi Kani <toshi.kani@hpe.com> +Signed-off-by: Dan Williams <dan.j.williams@intel.com> +Acked-by: Johannes Thumshirn <jthumshirn@suse.de> +--- + drivers/nvdimm/label.c | 34 ++++++++++++++++++++++++---------- + 1 file changed, 24 insertions(+), 10 deletions(-) + +diff --git a/drivers/nvdimm/label.c b/drivers/nvdimm/label.c +index c858cfadea40..1d28cd656536 100644 +--- a/drivers/nvdimm/label.c ++++ b/drivers/nvdimm/label.c +@@ -45,9 +45,27 @@ unsigned sizeof_namespace_label(struct nvdimm_drvdata *ndd) + return ndd->nslabel_size; + } + ++static size_t __sizeof_namespace_index(u32 nslot) ++{ ++ return ALIGN(sizeof(struct nd_namespace_index) + DIV_ROUND_UP(nslot, 8), ++ NSINDEX_ALIGN); ++} ++ ++static int __nvdimm_num_label_slots(struct nvdimm_drvdata *ndd, ++ size_t index_size) ++{ ++ return (ndd->nsarea.config_size - index_size * 2) / ++ sizeof_namespace_label(ndd); ++} ++ + int nvdimm_num_label_slots(struct nvdimm_drvdata *ndd) + { +- return ndd->nsarea.config_size / (sizeof_namespace_label(ndd) + 1); ++ u32 tmp_nslot, n; ++ ++ tmp_nslot = ndd->nsarea.config_size / sizeof_namespace_label(ndd); ++ n = __sizeof_namespace_index(tmp_nslot) / NSINDEX_ALIGN; ++ ++ return __nvdimm_num_label_slots(ndd, NSINDEX_ALIGN * n); + } + + size_t sizeof_namespace_index(struct nvdimm_drvdata *ndd) +@@ -55,18 +73,14 @@ size_t sizeof_namespace_index(struct nvdimm_drvdata *ndd) + u32 nslot, space, size; + + /* +- * The minimum index space is 512 bytes, with that amount of +- * index we can describe ~1400 labels which is less than a byte +- * of overhead per label. Round up to a byte of overhead per +- * label and determine the size of the index region. Yes, this +- * starts to waste space at larger config_sizes, but it's +- * unlikely we'll ever see anything but 128K. ++ * Per UEFI 2.7, the minimum size of the Label Storage Area is large ++ * enough to hold 2 index blocks and 2 labels. The minimum index ++ * block size is 256 bytes, and the minimum label size is 256 bytes. + */ + nslot = nvdimm_num_label_slots(ndd); + space = ndd->nsarea.config_size - nslot * sizeof_namespace_label(ndd); +- size = ALIGN(sizeof(struct nd_namespace_index) + DIV_ROUND_UP(nslot, 8), +- NSINDEX_ALIGN) * 2; +- if (size <= space) ++ size = __sizeof_namespace_index(nslot) * 2; ++ if (size <= space && nslot >= 2) + return size / 2; + + dev_err(ndd->dev, "label area (%d) too small to host (%d byte) labels\n", + diff --git a/patches.fixes/libnvdimm-label-fix-sparse-warning.patch b/patches.fixes/libnvdimm-label-fix-sparse-warning.patch new file mode 100644 index 0000000000..2dfa8f3626 --- /dev/null +++ b/patches.fixes/libnvdimm-label-fix-sparse-warning.patch @@ -0,0 +1,46 @@ +From: Dan Williams <dan.j.williams@intel.com> +Date: Thu, 11 Oct 2018 18:25:20 -0700 +Subject: libnvdimm, label: Fix sparse warning +Git-commit: 97052c1c31d5bcf08823ce1ea272447edd2d52de +Patch-mainline: v4.20-rc1 +References: bsc#1111921, bsc#1113408, FATE#326765, bsc#1113972 + +The kbuild robot reports: + +drivers/nvdimm/label.c:500:32: warning: restricted __le32 degrades to integer + +...read 'nslot' into a local u32. + +Reported-by: kbuild test robot <lkp@intel.com> +Acked-by: Alexander Duyck <alexander.h.duyck@linux.intel.com> +Signed-off-by: Dan Williams <dan.j.williams@intel.com> +Acked-by: Johannes Thumshirn <jthumshirn@suse.de> +--- + drivers/nvdimm/label.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/nvdimm/label.c b/drivers/nvdimm/label.c +index 7f03d117824f..750dbaa6ce82 100644 +--- a/drivers/nvdimm/label.c ++++ b/drivers/nvdimm/label.c +@@ -424,6 +424,7 @@ int nd_label_data_init(struct nvdimm_drvdata *ndd) + struct nd_namespace_index *nsindex; + unsigned int i; + int rc = 0; ++ u32 nslot; + + if (ndd->data) + return 0; +@@ -495,9 +496,10 @@ int nd_label_data_init(struct nvdimm_drvdata *ndd) + + /* Determine starting offset for label data */ + offset = __le64_to_cpu(nsindex->labeloff); ++ nslot = __le32_to_cpu(nsindex->nslot); + + /* Loop through the free list pulling in any active labels */ +- for (i = 0; i < nsindex->nslot; i++, offset += ndd->nslabel_size) { ++ for (i = 0; i < nslot; i++, offset += ndd->nslabel_size) { + size_t label_read_size; + + /* zero out the unused labels */ + diff --git a/patches.fixes/nvdimm-clarify-comment-in-sizeof_namespace_index.patch b/patches.fixes/nvdimm-clarify-comment-in-sizeof_namespace_index.patch new file mode 100644 index 0000000000..df9ac85d50 --- /dev/null +++ b/patches.fixes/nvdimm-clarify-comment-in-sizeof_namespace_index.patch @@ -0,0 +1,40 @@ +From: Alexander Duyck <alexander.h.duyck@linux.intel.com> +Date: Wed, 10 Oct 2018 16:38:55 -0700 +Subject: nvdimm: Clarify comment in sizeof_namespace_index +Git-commit: 1cfeb66e8e137be8e01b88bb4d416e987abda4a4 +Patch-mainline: v4.20-rc1 +References: bsc#1111921, bsc#1113408, FATE#326765, bsc#1113972 + +When working on the label code I found it rather confusing to see several +spots that reference a minimum label size of 256 while working with labels +that are 128 bytes in size. + +This patch is meant to provide a clarification on one of the comments that +was at the heart of the issue. Specifically for version 1.2 and later of +the namespace specification the minimum label size is 256, prior to that +the minimum label size was 128. So we should state that as such to avoid +confusion. + +Reviewed-by: Toshi Kani <toshi.kani@hpe.com> +Signed-off-by: Alexander Duyck <alexander.h.duyck@linux.intel.com> +Signed-off-by: Dan Williams <dan.j.williams@intel.com> +Acked-by: Johannes Thumshirn <jthumshirn@suse.de> +--- + drivers/nvdimm/label.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/nvdimm/label.c b/drivers/nvdimm/label.c +index 1f5842509dbc..bb813b8e8ace 100644 +--- a/drivers/nvdimm/label.c ++++ b/drivers/nvdimm/label.c +@@ -75,7 +75,8 @@ size_t sizeof_namespace_index(struct nvdimm_drvdata *ndd) + /* + * Per UEFI 2.7, the minimum size of the Label Storage Area is large + * enough to hold 2 index blocks and 2 labels. The minimum index +- * block size is 256 bytes, and the minimum label size is 256 bytes. ++ * block size is 256 bytes. The label size is 128 for namespaces ++ * prior to version 1.2 and at minimum 256 for version 1.2 and later. + */ + nslot = nvdimm_num_label_slots(ndd); + space = ndd->nsarea.config_size - nslot * sizeof_namespace_label(ndd); + diff --git a/patches.fixes/nvdimm-remove-empty-if-statement.patch b/patches.fixes/nvdimm-remove-empty-if-statement.patch new file mode 100644 index 0000000000..59914d4a43 --- /dev/null +++ b/patches.fixes/nvdimm-remove-empty-if-statement.patch @@ -0,0 +1,38 @@ +From: Alexander Duyck <alexander.h.duyck@linux.intel.com> +Date: Wed, 10 Oct 2018 16:39:06 -0700 +Subject: nvdimm: Remove empty if statement +Git-commit: 19418b024427ec60ba6084addf691a8d93670398 +Patch-mainline: v4.20-rc1 +References: bsc#1111921, bsc#1113408, FATE#326765, bsc#1113972 + +This patch removes an empty statement from an if expression and promotes +the else statement to the if expression with the expression logic reversed. + +I feel this is more readable as the empty statement can lead to issues if +any additional logic was ever added. + +Reviewed-by: Toshi Kani <toshi.kani@hpe.com> +Signed-off-by: Alexander Duyck <alexander.h.duyck@linux.intel.com> +Signed-off-by: Dan Williams <dan.j.williams@intel.com> +Acked-by: Johannes Thumshirn <jthumshirn@suse.de> +--- + drivers/nvdimm/label.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/drivers/nvdimm/label.c b/drivers/nvdimm/label.c +index bb813b8e8ace..43bad0d5bdb6 100644 +--- a/drivers/nvdimm/label.c ++++ b/drivers/nvdimm/label.c +@@ -261,9 +261,8 @@ int nd_label_validate(struct nvdimm_drvdata *ndd) + void nd_label_copy(struct nvdimm_drvdata *ndd, struct nd_namespace_index *dst, + struct nd_namespace_index *src) + { +- if (dst && src) +- /* pass */; +- else ++ /* just exit if either destination or source is NULL */ ++ if (!dst || !src) + return; + + memcpy(dst, src, sizeof_namespace_index(ndd)); + diff --git a/patches.fixes/nvdimm-sanity-check-labeloff.patch b/patches.fixes/nvdimm-sanity-check-labeloff.patch new file mode 100644 index 0000000000..9b784ab70b --- /dev/null +++ b/patches.fixes/nvdimm-sanity-check-labeloff.patch @@ -0,0 +1,36 @@ +From: Alexander Duyck <alexander.h.duyck@linux.intel.com> +Date: Wed, 10 Oct 2018 16:38:41 -0700 +Subject: nvdimm: Sanity check labeloff +Git-commit: d86d4d63d88861107d3bfc84be7294552231ecd0 +Patch-mainline: v4.20-rc1 +References: bsc#1111921, bsc#1113408, FATE#326765, bsc#1113972 + +This patch adds validation for the labeloff field in the indexes. + +Reviewed-by: Toshi Kani <toshi.kani@hpe.com> +Signed-off-by: Alexander Duyck <alexander.h.duyck@linux.intel.com> +Signed-off-by: Dan Williams <dan.j.williams@intel.com> +Acked-by: Johannes Thumshirn <jthumshirn@suse.de> +--- + drivers/nvdimm/label.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/drivers/nvdimm/label.c b/drivers/nvdimm/label.c +index 1d28cd656536..1f5842509dbc 100644 +--- a/drivers/nvdimm/label.c ++++ b/drivers/nvdimm/label.c +@@ -183,6 +183,13 @@ static int __nd_label_validate(struct nvdimm_drvdata *ndd) + __le64_to_cpu(nsindex[i]->otheroff)); + continue; + } ++ if (__le64_to_cpu(nsindex[i]->labeloff) ++ != 2 * sizeof_namespace_index(ndd)) { ++ dev_dbg(dev, "nsindex%d labeloff: %#llx invalid\n", ++ i, (unsigned long long) ++ __le64_to_cpu(nsindex[i]->labeloff)); ++ continue; ++ } + + size = __le64_to_cpu(nsindex[i]->mysize); + if (size > sizeof_namespace_index(ndd) + diff --git a/patches.fixes/nvdimm-split-label-init-out-from-the-logic-for-getting-config-data.patch b/patches.fixes/nvdimm-split-label-init-out-from-the-logic-for-getting-config-data.patch new file mode 100644 index 0000000000..b74d58adf0 --- /dev/null +++ b/patches.fixes/nvdimm-split-label-init-out-from-the-logic-for-getting-config-data.patch @@ -0,0 +1,199 @@ +From: Alexander Duyck <alexander.h.duyck@linux.intel.com> +Date: Wed, 10 Oct 2018 16:39:20 -0700 +Subject: nvdimm: Split label init out from the logic for getting config data +Git-commit: 2d657d17f72d2ae70c02f0d0ea6a04ad0f016b57 +Patch-mainline: v4.20-rc1 +References: bsc#1111921, bsc#1113408, FATE#326765, bsc#1113972 + +This patch splits the initialization of the label data into two functions. +One for doing the init, and another for reading the actual configuration +data. The idea behind this is that by doing this we create a symmetry +between the getting and setting of config data in that we have a function +for both. In addition it will make it easier for us to identify the bits +that are related to init versus the pieces that are a wrapper for reading +data from the ACPI interface. + +So for example by splitting things out like this it becomes much more +obvious that we were performing checks that weren't necessarily related to +the set/get operations such as relying on ndd->data being present when the +set and get ops should not care about a locally cached copy of the label +area. + +Reviewed-by: Toshi Kani <toshi.kani@hpe.com> +Signed-off-by: Alexander Duyck <alexander.h.duyck@linux.intel.com> +Signed-off-by: Dan Williams <dan.j.williams@intel.com> +Acked-by: Johannes Thumshirn <jthumshirn@suse.de> +--- + drivers/nvdimm/dimm.c | 2 - + drivers/nvdimm/dimm_devs.c | 49 +++++++++++++++++---------------------------- + drivers/nvdimm/label.c | 38 ++++++++++++++++++++++++++++++++++ + drivers/nvdimm/label.h | 1 + drivers/nvdimm/nd.h | 2 + + 5 files changed, 61 insertions(+), 31 deletions(-) + +--- a/drivers/nvdimm/dimm.c ++++ b/drivers/nvdimm/dimm.c +@@ -54,7 +54,7 @@ static int nvdimm_probe(struct device *d + if (rc) + goto err; + +- rc = nvdimm_init_config_data(ndd); ++ rc = nd_label_data_init(ndd); + if (rc == -EACCES) + nvdimm_set_locked(dev); + if (rc) +--- a/drivers/nvdimm/dimm_devs.c ++++ b/drivers/nvdimm/dimm_devs.c +@@ -84,55 +84,47 @@ int nvdimm_init_nsarea(struct nvdimm_drv + return cmd_rc; + } + +-int nvdimm_init_config_data(struct nvdimm_drvdata *ndd) ++int nvdimm_get_config_data(struct nvdimm_drvdata *ndd, void *buf, ++ size_t offset, size_t len) + { + struct nvdimm_bus *nvdimm_bus = walk_to_nvdimm_bus(ndd->dev); ++ struct nvdimm_bus_descriptor *nd_desc = nvdimm_bus->nd_desc; + int rc = validate_dimm(ndd), cmd_rc = 0; + struct nd_cmd_get_config_data_hdr *cmd; +- struct nvdimm_bus_descriptor *nd_desc; +- u32 max_cmd_size, config_size; +- size_t offset; ++ size_t max_cmd_size, buf_offset; + + if (rc) + return rc; + +- if (ndd->data) +- return 0; +- +- if (ndd->nsarea.status || ndd->nsarea.max_xfer == 0 +- || ndd->nsarea.config_size < ND_LABEL_MIN_SIZE) { +- dev_dbg(ndd->dev, "failed to init config data area: (%d:%d)\n", +- ndd->nsarea.max_xfer, ndd->nsarea.config_size); ++ if (offset + len > ndd->nsarea.config_size) + return -ENXIO; +- } +- +- ndd->data = kvmalloc(ndd->nsarea.config_size, GFP_KERNEL); +- if (!ndd->data) +- return -ENOMEM; + +- max_cmd_size = min_t(u32, ndd->nsarea.config_size, ndd->nsarea.max_xfer); ++ max_cmd_size = min_t(u32, len, ndd->nsarea.max_xfer); + cmd = kvzalloc(max_cmd_size + sizeof(*cmd), GFP_KERNEL); + if (!cmd) + return -ENOMEM; + +- nd_desc = nvdimm_bus->nd_desc; +- for (config_size = ndd->nsarea.config_size, offset = 0; +- config_size; config_size -= cmd->in_length, +- offset += cmd->in_length) { +- cmd->in_length = min(config_size, max_cmd_size); +- cmd->in_offset = offset; ++ for (buf_offset = 0; len; ++ len -= cmd->in_length, buf_offset += cmd->in_length) { ++ size_t cmd_size; ++ ++ cmd->in_offset = offset + buf_offset; ++ cmd->in_length = min(max_cmd_size, len); ++ ++ cmd_size = sizeof(*cmd) + cmd->in_length; ++ + rc = nd_desc->ndctl(nd_desc, to_nvdimm(ndd->dev), +- ND_CMD_GET_CONFIG_DATA, cmd, +- cmd->in_length + sizeof(*cmd), &cmd_rc); ++ ND_CMD_GET_CONFIG_DATA, cmd, cmd_size, &cmd_rc); + if (rc < 0) + break; + if (cmd_rc < 0) { + rc = cmd_rc; + break; + } +- memcpy(ndd->data + offset, cmd->out_buf, cmd->in_length); ++ ++ /* out_buf should be valid, copy it into our output buffer */ ++ memcpy(buf + buf_offset, cmd->out_buf, cmd->in_length); + } +- dev_dbg(ndd->dev, "%s: len: %zu rc: %d\n", __func__, offset, rc); + kvfree(cmd); + + return rc; +@@ -150,9 +142,6 @@ int nvdimm_set_config_data(struct nvdimm + if (rc) + return rc; + +- if (!ndd->data) +- return -ENXIO; +- + if (offset + len > ndd->nsarea.config_size) + return -ENXIO; + +--- a/drivers/nvdimm/label.c ++++ b/drivers/nvdimm/label.c +@@ -422,6 +422,44 @@ int nd_label_reserve_dpa(struct nvdimm_d + return 0; + } + ++int nd_label_data_init(struct nvdimm_drvdata *ndd) ++{ ++ size_t config_size, read_size; ++ int rc = 0; ++ ++ if (ndd->data) ++ return 0; ++ ++ if (ndd->nsarea.status || ndd->nsarea.max_xfer == 0) { ++ dev_dbg(ndd->dev, "failed to init config data area: (%u:%u)\n", ++ ndd->nsarea.max_xfer, ndd->nsarea.config_size); ++ return -ENXIO; ++ } ++ ++ /* ++ * We need to determine the maximum index area as this is the section ++ * we must read and validate before we can start processing labels. ++ * ++ * If the area is too small to contain the two indexes and 2 labels ++ * then we abort. ++ * ++ * Start at a label size of 128 as this should result in the largest ++ * possible namespace index size. ++ */ ++ ndd->nslabel_size = 128; ++ read_size = sizeof_namespace_index(ndd) * 2; ++ if (!read_size) ++ return -ENXIO; ++ ++ /* Allocate config data */ ++ config_size = ndd->nsarea.config_size; ++ ndd->data = kvzalloc(config_size, GFP_KERNEL); ++ if (!ndd->data) ++ return -ENOMEM; ++ ++ return nvdimm_get_config_data(ndd, ndd->data, 0, config_size); ++} ++ + int nd_label_active_count(struct nvdimm_drvdata *ndd) + { + struct nd_namespace_index *nsindex; +--- a/drivers/nvdimm/label.h ++++ b/drivers/nvdimm/label.h +@@ -141,6 +141,7 @@ struct nvdimm_drvdata; + int nd_label_validate(struct nvdimm_drvdata *ndd); + void nd_label_copy(struct nvdimm_drvdata *ndd, struct nd_namespace_index *dst, + struct nd_namespace_index *src); ++int nd_label_data_init(struct nvdimm_drvdata *ndd); + size_t sizeof_namespace_index(struct nvdimm_drvdata *ndd); + int nd_label_active_count(struct nvdimm_drvdata *ndd); + struct nd_namespace_label *nd_label_active(struct nvdimm_drvdata *ndd, int n); +--- a/drivers/nvdimm/nd.h ++++ b/drivers/nvdimm/nd.h +@@ -247,6 +247,8 @@ struct nvdimm_drvdata *to_ndd(struct nd_ + int nvdimm_check_config_data(struct device *dev); + int nvdimm_init_nsarea(struct nvdimm_drvdata *ndd); + int nvdimm_init_config_data(struct nvdimm_drvdata *ndd); ++int nvdimm_get_config_data(struct nvdimm_drvdata *ndd, void *buf, ++ size_t offset, size_t len); + int nvdimm_set_config_data(struct nvdimm_drvdata *ndd, size_t offset, + void *buf, size_t len); + long nvdimm_clear_poison(struct device *dev, phys_addr_t phys, diff --git a/patches.fixes/nvdimm-use-namespace-index-data-to-reduce-number-of-label-reads-needed.patch b/patches.fixes/nvdimm-use-namespace-index-data-to-reduce-number-of-label-reads-needed.patch new file mode 100644 index 0000000000..baaf360b8b --- /dev/null +++ b/patches.fixes/nvdimm-use-namespace-index-data-to-reduce-number-of-label-reads-needed.patch @@ -0,0 +1,181 @@ +From: Alexander Duyck <alexander.h.duyck@linux.intel.com> +Date: Wed, 10 Oct 2018 16:39:35 -0700 +Subject: nvdimm: Use namespace index data to reduce number of label reads + needed +Git-commit: 7d47aad4570e5e6e9a8162bb417ca9b74132f27c +Patch-mainline: v4.20-rc1 +References: bsc#1111921, bsc#1113408, FATE#326765, bsc#1113972 + +This patch adds logic that is meant to make use of the namespace index data +to reduce the number of reads that are needed to initialize a given +namespace. The general idea is that once we have enough data to validate +the namespace index we do so and then proceed to fetch only those labels +that are not listed as being "free". By doing this I am seeing a total time +reduction from about 4-5 seconds to 2-3 seconds for 24 NVDIMM modules each +with 128K of label config area. + +Reviewed-by: Toshi Kani <toshi.kani@hpe.com> +Signed-off-by: Alexander Duyck <alexander.h.duyck@linux.intel.com> +Signed-off-by: Dan Williams <dan.j.williams@intel.com> +Acked-by: Johannes Thumshirn <jthumshirn@suse.de> +--- + drivers/nvdimm/dimm.c | 4 --- + drivers/nvdimm/label.c | 93 +++++++++++++++++++++++++++++++++++++++++++++++--- + drivers/nvdimm/label.h | 3 -- + 3 files changed, 88 insertions(+), 12 deletions(-) + +diff --git a/drivers/nvdimm/dimm.c b/drivers/nvdimm/dimm.c +index 07bf96948553..9899c97138a3 100644 +--- a/drivers/nvdimm/dimm.c ++++ b/drivers/nvdimm/dimm.c +@@ -84,10 +84,6 @@ static int nvdimm_probe(struct device *dev) + dev_dbg(dev, "config data size: %d\n", ndd->nsarea.config_size); + + nvdimm_bus_lock(dev); +- ndd->ns_current = nd_label_validate(ndd); +- ndd->ns_next = nd_label_next_nsindex(ndd->ns_current); +- nd_label_copy(ndd, to_next_namespace_index(ndd), +- to_current_namespace_index(ndd)); + if (ndd->ns_current >= 0) { + rc = nd_label_reserve_dpa(ndd); + if (rc == 0) +diff --git a/drivers/nvdimm/label.c b/drivers/nvdimm/label.c +index 563f24af01b5..7f03d117824f 100644 +--- a/drivers/nvdimm/label.c ++++ b/drivers/nvdimm/label.c +@@ -235,7 +235,7 @@ static int __nd_label_validate(struct nvdimm_drvdata *ndd) + return -1; + } + +-int nd_label_validate(struct nvdimm_drvdata *ndd) ++static int nd_label_validate(struct nvdimm_drvdata *ndd) + { + /* + * In order to probe for and validate namespace index blocks we +@@ -258,8 +258,9 @@ int nd_label_validate(struct nvdimm_drvdata *ndd) + return -1; + } + +-void nd_label_copy(struct nvdimm_drvdata *ndd, struct nd_namespace_index *dst, +- struct nd_namespace_index *src) ++static void nd_label_copy(struct nvdimm_drvdata *ndd, ++ struct nd_namespace_index *dst, ++ struct nd_namespace_index *src) + { + /* just exit if either destination or source is NULL */ + if (!dst || !src) +@@ -419,7 +420,9 @@ int nd_label_reserve_dpa(struct nvdimm_drvdata *ndd) + + int nd_label_data_init(struct nvdimm_drvdata *ndd) + { +- size_t config_size, read_size; ++ size_t config_size, read_size, max_xfer, offset; ++ struct nd_namespace_index *nsindex; ++ unsigned int i; + int rc = 0; + + if (ndd->data) +@@ -452,7 +455,87 @@ int nd_label_data_init(struct nvdimm_drvdata *ndd) + if (!ndd->data) + return -ENOMEM; + +- return nvdimm_get_config_data(ndd, ndd->data, 0, config_size); ++ /* ++ * We want to guarantee as few reads as possible while conserving ++ * memory. To do that we figure out how much unused space will be left ++ * in the last read, divide that by the total number of reads it is ++ * going to take given our maximum transfer size, and then reduce our ++ * maximum transfer size based on that result. ++ */ ++ max_xfer = min_t(size_t, ndd->nsarea.max_xfer, config_size); ++ if (read_size < max_xfer) { ++ /* trim waste */ ++ max_xfer -= ((max_xfer - 1) - (config_size - 1) % max_xfer) / ++ DIV_ROUND_UP(config_size, max_xfer); ++ /* make certain we read indexes in exactly 1 read */ ++ if (max_xfer < read_size) ++ max_xfer = read_size; ++ } ++ ++ /* Make our initial read size a multiple of max_xfer size */ ++ read_size = min(DIV_ROUND_UP(read_size, max_xfer) * max_xfer, ++ config_size); ++ ++ /* Read the index data */ ++ rc = nvdimm_get_config_data(ndd, ndd->data, 0, read_size); ++ if (rc) ++ goto out_err; ++ ++ /* Validate index data, if not valid assume all labels are invalid */ ++ ndd->ns_current = nd_label_validate(ndd); ++ if (ndd->ns_current < 0) ++ return 0; ++ ++ /* Record our index values */ ++ ndd->ns_next = nd_label_next_nsindex(ndd->ns_current); ++ ++ /* Copy "current" index on top of the "next" index */ ++ nsindex = to_current_namespace_index(ndd); ++ nd_label_copy(ndd, to_next_namespace_index(ndd), nsindex); ++ ++ /* Determine starting offset for label data */ ++ offset = __le64_to_cpu(nsindex->labeloff); ++ ++ /* Loop through the free list pulling in any active labels */ ++ for (i = 0; i < nsindex->nslot; i++, offset += ndd->nslabel_size) { ++ size_t label_read_size; ++ ++ /* zero out the unused labels */ ++ if (test_bit_le(i, nsindex->free)) { ++ memset(ndd->data + offset, 0, ndd->nslabel_size); ++ continue; ++ } ++ ++ /* if we already read past here then just continue */ ++ if (offset + ndd->nslabel_size <= read_size) ++ continue; ++ ++ /* if we haven't read in a while reset our read_size offset */ ++ if (read_size < offset) ++ read_size = offset; ++ ++ /* determine how much more will be read after this next call. */ ++ label_read_size = offset + ndd->nslabel_size - read_size; ++ label_read_size = DIV_ROUND_UP(label_read_size, max_xfer) * ++ max_xfer; ++ ++ /* truncate last read if needed */ ++ if (read_size + label_read_size > config_size) ++ label_read_size = config_size - read_size; ++ ++ /* Read the label data */ ++ rc = nvdimm_get_config_data(ndd, ndd->data + read_size, ++ read_size, label_read_size); ++ if (rc) ++ goto out_err; ++ ++ /* push read_size to next read offset */ ++ read_size += label_read_size; ++ } ++ ++ dev_dbg(ndd->dev, "len: %zu rc: %d\n", offset, rc); ++out_err: ++ return rc; + } + + int nd_label_active_count(struct nvdimm_drvdata *ndd) +diff --git a/drivers/nvdimm/label.h b/drivers/nvdimm/label.h +index 685afb3de0fe..e9a2ad3c2150 100644 +--- a/drivers/nvdimm/label.h ++++ b/drivers/nvdimm/label.h +@@ -138,9 +138,6 @@ static inline int nd_label_next_nsindex(int index) + } + + struct nvdimm_drvdata; +-int nd_label_validate(struct nvdimm_drvdata *ndd); +-void nd_label_copy(struct nvdimm_drvdata *ndd, struct nd_namespace_index *dst, +- struct nd_namespace_index *src); + int nd_label_data_init(struct nvdimm_drvdata *ndd); + size_t sizeof_namespace_index(struct nvdimm_drvdata *ndd); + int nd_label_active_count(struct nvdimm_drvdata *ndd); + diff --git a/patches.suse/Revert-drm-nouveau-drm-therm-fan-add-a-fallback-if-n b/patches.suse/Revert-drm-nouveau-drm-therm-fan-add-a-fallback-if-n deleted file mode 100644 index 3253b65a10..0000000000 --- a/patches.suse/Revert-drm-nouveau-drm-therm-fan-add-a-fallback-if-n +++ /dev/null @@ -1,66 +0,0 @@ -From: Takashi Iwai <tiwai@suse.de> -Subject: [PATCH] Revert "drm/nouveau/drm/therm/fan: add a fallback if no fan control is specified in the vbios" -References: bsc#1103356 -Patch-mainline: Never, a temporary workaround - -This reverts commit 800efb4c2857ec543fdc33585bbcb1fd5ef28337. -Since it is confirmed to be rather harmful, just revert it until the -problem gets addressed properly in the upstream. - -Signed-off-by: Takashi Iwai <tiwai@suse.de> - ---- - .../gpu/drm/nouveau/nvkm/subdev/therm/base.c | 22 +++---------------- - 1 file changed, 3 insertions(+), 19 deletions(-) - -diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/therm/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/therm/base.c -index 3695cde669f8..699dad03bc5d 100644 ---- a/drivers/gpu/drm/nouveau/nvkm/subdev/therm/base.c -+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/therm/base.c -@@ -65,9 +65,10 @@ nvkm_therm_update_trip(struct nvkm_therm *therm) - } - - static int --nvkm_therm_compute_linear_duty(struct nvkm_therm *therm, u8 linear_min_temp, -- u8 linear_max_temp) -+nvkm_therm_update_linear(struct nvkm_therm *therm) - { -+ u8 linear_min_temp = therm->fan->bios.linear_min_temp; -+ u8 linear_max_temp = therm->fan->bios.linear_max_temp; - u8 temp = therm->func->temp_get(therm); - u16 duty; - -@@ -85,21 +86,6 @@ nvkm_therm_compute_linear_duty(struct nvkm_therm *therm, u8 linear_min_temp, - return duty; - } - --static int --nvkm_therm_update_linear(struct nvkm_therm *therm) --{ -- u8 min = therm->fan->bios.linear_min_temp; -- u8 max = therm->fan->bios.linear_max_temp; -- return nvkm_therm_compute_linear_duty(therm, min, max); --} -- --static int --nvkm_therm_update_linear_fallback(struct nvkm_therm *therm) --{ -- u8 max = therm->bios_sensor.thrs_fan_boost.temp; -- return nvkm_therm_compute_linear_duty(therm, 30, max); --} -- - static void - nvkm_therm_update(struct nvkm_therm *therm, int mode) - { -@@ -134,8 +120,6 @@ nvkm_therm_update(struct nvkm_therm *therm, int mode) - case NVBIOS_THERM_FAN_OTHER: - if (therm->cstate) - duty = therm->cstate; -- else -- duty = nvkm_therm_update_linear_fallback(therm); - poll = false; - break; - } --- -2.18.0 - diff --git a/patches.suse/drm-i915-CFL-NVMe-breakage-workaround.patch b/patches.suse/drm-i915-CFL-NVMe-breakage-workaround.patch new file mode 100644 index 0000000000..27134da0ae --- /dev/null +++ b/patches.suse/drm-i915-CFL-NVMe-breakage-workaround.patch @@ -0,0 +1,50 @@ +From: Takashi Iwai <tiwai@suse.de> +Subject: Workaround for mysterious NVMe breakage with i915 CFL +Patch-mainline: Never, a temporary workaround +References: bsc#1111040 + +A temporary workaround for a new CFL that breaks NVMe by some reason +at detecting the non-existing HDMI-3 port. + +This should be removed once when it gets fixed properly in the upstream +code. + +Signed-off-by: Takashi Iwai <tiwai@suse.de> + +--- + drivers/gpu/drm/i915/intel_hdmi.c | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +--- a/drivers/gpu/drm/i915/intel_hdmi.c ++++ b/drivers/gpu/drm/i915/intel_hdmi.c +@@ -1629,21 +1629,27 @@ intel_hdmi_set_edid(struct drm_connector + static enum drm_connector_status + intel_hdmi_detect(struct drm_connector *connector, bool force) + { +- enum drm_connector_status status; ++ enum drm_connector_status status = connector_status_disconnected; + struct drm_i915_private *dev_priv = to_i915(connector->dev); ++ struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector); ++ struct intel_encoder *encoder = &hdmi_to_dig_port(intel_hdmi)->base; ++ struct pci_dev *pdev = dev_priv->drm.pdev; + + DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", + connector->base.id, connector->name); + + intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS); + ++ if (pdev->device == 0x3e98 && ++ !intel_digital_port_connected(encoder)) ++ goto out; ++ + intel_hdmi_unset_edid(connector); + + if (intel_hdmi_set_edid(connector)) + status = connector_status_connected; +- else +- status = connector_status_disconnected; + ++out: + intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS); + + return status; diff --git a/series.conf b/series.conf index 54422b4a26..c6815bab45 100644 --- a/series.conf +++ b/series.conf @@ -5126,6 +5126,7 @@ patches.suse/0003-x86-boot-KASLR-Rename-process_e820_entry-into-proces.patch patches.suse/efi-Introduce-efi_early_memdesc_ptr-to-get-pointer-t.patch patches.arch/x86-boot-KASLR-Prefer-mirrored-memory-regions-for-th.patch + patches.fixes/0001-x86-boot-KASLR-Work-around-firmware-bugs-by-excludin.patch patches.arch/x86-cpu-amd-limit-cpu_core_id-fixup-to-families-older-than-f17h.patch patches.fixes/x86-cpu-amd-derive-l3-shared_cpu_map-from-cpu_llc_shared_mask.patch patches.arch/0001-x86-nmi-Use-raw-lock.patch @@ -14963,6 +14964,7 @@ patches.drivers/rtc-hctosys-Ensure-system-time-doesn-t-overflow-time patches.drivers/rtc-snvs-Fix-usage-of-snvs_rtc_enable patches.drivers/libnvdimm-label-change-min-label-storage-size-per-uefi-2.7.patch + patches.fixes/libnvdimm-label-change-nvdimm_num_label_slots-per-uefi-2-7.patch patches.drivers/nfit-skip-region-registration-for-incomplete-control-regions.patch patches.fixes/0001-acpi-nfit-rework-NVDIMM-leaf-method-detection.patch patches.drivers/nfit-fix-region-registration-vs-block-data-window-ra @@ -18183,6 +18185,9 @@ patches.fixes/cdrom-fix-improper-type-cast-which-can-leat-to-infor.patch patches.fixes/nvme_fc-add-nvme_discovery-sysfs-attribute-to-fc-tra.patch patches.fixes/nvme-call-nvme_complete_rq-when-nvmf_check_ready-fai.patch + patches.drivers/spi-bcm-qspi-switch-back-to-reading-flash-using-smal.patch + patches.drivers/spi-sh-msiof-fix-deferred-probing.patch + patches.drivers/spi-bcm63xx-hsspi-keep-pll-clk-enabled.patch patches.drivers/ACPI-processor-Fix-the-return-value-of-acpi_processo.patch patches.drivers/iwlwifi-mvm-send-BCAST-management-frames-to-the-righ.patch patches.drivers/iwlwifi-dbg-don-t-crash-if-the-firmware-crashes-in-t.patch @@ -18198,6 +18203,13 @@ patches.fixes/jbd2-fix-use-after-free-in-jbd2_log_do_checkpoint.patch patches.fixes/Documentation-l1tf-Fix-small-spelling-typo.patch patches.drivers/mfd-arizona-Correct-calling-of-runtime_put_sync.patch + patches.fixes/libnvdimm-dimm-maximize-label-transfer-size.patch + patches.fixes/nvdimm-sanity-check-labeloff.patch + patches.fixes/nvdimm-clarify-comment-in-sizeof_namespace_index.patch + patches.fixes/nvdimm-remove-empty-if-statement.patch + patches.fixes/nvdimm-split-label-init-out-from-the-logic-for-getting-config-data.patch + patches.fixes/nvdimm-use-namespace-index-data-to-reduce-number-of-label-reads-needed.patch + patches.fixes/libnvdimm-label-fix-sparse-warning.patch patches.drivers/PCI-ASPM-Fix-link_state-teardown-on-device-removal.patch patches.drivers/scsi-qla2xxx-Fix-process-response-queue-for-ISP26XX-.patch patches.drivers/scsi-qla2xxx-Fix-incorrect-port-speed-being-set-for-.patch @@ -18289,10 +18301,17 @@ patches.arch/powerpc-pseries-Disable-CPU-hotplug-across-migration.patch patches.arch/powerpc-fadump-re-register-firmware-assisted-dump-if.patch patches.arch/powerpc-rtas-Fix-a-potential-race-between-CPU-Offlin.patch + patches.fixes/0001-drm-sti-do-not-remove-the-drm_bridge-that-was-never-.patch patches.fixes/0001-drm-cirrus-Use-drm_framebuffer_put-to-avoid-kernel-o.patch + patches.fixes/0001-drm-virtio-fix-bounds-check-in-virtio_gpu_cmd_get_ca.patch patches.drivers/drm-i915-cfl-Add-a-new-CFL-PCI-ID + patches.fixes/0001-drm-i915-audio-Hook-up-component-bindings-even-if-di.patch + patches.fixes/0001-drm-hisilicon-hibmc-Do-not-carry-error-code-in-HiBMC.patch + patches.fixes/0001-drm-hisilicon-hibmc-Don-t-overwrite-fb-helper-surfac.patch + patches.fixes/0001-drm-amdgpu-powerplay-fix-missing-break-in-switch-sta.patch patches.drivers/drm-i915-Restore-vblank-interrupts-earlier.patch patches.drivers/drm-i915-dp-Link-train-Fallback-on-eDP-only-if-fallb.patch + patches.fixes/0001-drm-i915-gen9-Fix-initial-readout-for-Y-tiled-frameb.patch patches.drivers/iio-adc-imx25-gcq-Fix-leak-of-device_node-in-mx25_gc.patch patches.drivers/iio-adc-at91-fix-acking-DRDY-irq-on-simple-conversio.patch patches.drivers/iio-adc-at91-fix-wrong-channel-number-in-triggered-b.patch @@ -18319,15 +18338,6 @@ patches.suse/0005-MODSIGN-Allow-the-db-UEFI-variable-to-be-suppressed.patch patches.suse/0006-modsign-Use-secondary-trust-keyring-for-module-signi.patch - # git://anongit.freedesktop.org/drm/drm-misc.git drm-misc-next - patches.fixes/0001-drm-sti-do-not-remove-the-drm_bridge-that-was-never-.patch - patches.fixes/0001-drm-virtio-fix-bounds-check-in-virtio_gpu_cmd_get_ca.patch - patches.fixes/0001-drm-i915-audio-Hook-up-component-bindings-even-if-di.patch - patches.fixes/0001-drm-hisilicon-hibmc-Do-not-carry-error-code-in-HiBMC.patch - patches.fixes/0001-drm-hisilicon-hibmc-Don-t-overwrite-fb-helper-surfac.patch - patches.fixes/0001-drm-amdgpu-powerplay-fix-missing-break-in-switch-sta.patch - patches.fixes/0001-drm-i915-gen9-Fix-initial-readout-for-Y-tiled-frameb.patch - # out-of-tree patches ######################################################## # end of sorted patches @@ -18775,7 +18785,9 @@ patches.arch/drm-hibmc-Use-set_busid-function-from-drm-core.patch patches.drivers/drm-hibmc-initialize-the-hibmc_bo_driver_io_mem_pfn.patch - patches.suse/Revert-drm-nouveau-drm-therm-fan-add-a-fallback-if-n + + patches.drivers/drm-nouveau-Don-t-disable-polling-in-fallback-mode.patch + patches.suse/drm-i915-CFL-NVMe-breakage-workaround.patch +disable patches.drivers/drm-Add-DRM-client-cap-for-aspect-ratio +disable patches.drivers/drm-Handle-aspect-ratio-info-in-legacy-modeset-path |