From 580efad9d9792f16bc4b0cc7820f0e4055c86dc7 Mon Sep 17 00:00:00 2001 From: Arne Hoch Date: Mon, 9 Jul 2018 13:57:53 +0200 Subject: [PATCH] FIX: amdpgu suspend/resume Signed-off-by: Arne Hoch --- ...estoring-resized-BAR-state-on-resume.patch | 46 +++++++++++++++++++ trunk/PKGBUILD | 9 +++- 2 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 trunk/0004-PCI-fix-restoring-resized-BAR-state-on-resume.patch diff --git a/trunk/0004-PCI-fix-restoring-resized-BAR-state-on-resume.patch b/trunk/0004-PCI-fix-restoring-resized-BAR-state-on-resume.patch new file mode 100644 index 0000000..c62249c --- /dev/null +++ b/trunk/0004-PCI-fix-restoring-resized-BAR-state-on-resume.patch @@ -0,0 +1,46 @@ +diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c +index bd6f156dc3cf..d4685090378b 100644 +--- a/drivers/pci/pci.c ++++ b/drivers/pci/pci.c +@@ -1159,6 +1159,33 @@ static void pci_restore_config_space(struct pci_dev *pdev) + } + } + ++static void pci_restore_rebar_state(struct pci_dev *pdev) ++{ ++ unsigned int pos, nbars, i; ++ u32 ctrl; ++ ++ pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_REBAR); ++ if (!pos) ++ return; ++ ++ pci_read_config_dword(pdev, pos + PCI_REBAR_CTRL, &ctrl); ++ nbars = (ctrl & PCI_REBAR_CTRL_NBAR_MASK) >> ++ PCI_REBAR_CTRL_NBAR_SHIFT; ++ ++ for (i = 0; i < nbars; i++, pos += 8) { ++ struct resource *res; ++ int bar_idx, size; ++ ++ pci_read_config_dword(pdev, pos + PCI_REBAR_CTRL, &ctrl); ++ bar_idx = ctrl & PCI_REBAR_CTRL_BAR_IDX; ++ res = pdev->resource + bar_idx; ++ size = order_base_2((resource_size(res) >> 20) | 1) - 1; ++ ctrl &= ~PCI_REBAR_CTRL_BAR_SIZE; ++ ctrl |= size << 8; ++ pci_write_config_dword(pdev, pos + PCI_REBAR_CTRL, ctrl); ++ } ++} ++ + /** + * pci_restore_state - Restore the saved state of a PCI device + * @dev: - PCI device that we're dealing with +@@ -1174,6 +1201,7 @@ void pci_restore_state(struct pci_dev *dev) + pci_restore_pri_state(dev); + pci_restore_ats_state(dev); + pci_restore_vc_state(dev); ++ pci_restore_rebar_state(dev); + + pci_cleanup_aer_error_status_regs(dev); + diff --git a/trunk/PKGBUILD b/trunk/PKGBUILD index 5a79ec1..9f01256 100644 --- a/trunk/PKGBUILD +++ b/trunk/PKGBUILD @@ -6,7 +6,7 @@ pkgbase=linux # Build stock -ARCH kernel #pkgbase=linux-custom # Build kernel with a different name _srcname=linux-4.17 pkgver=4.17.5 -pkgrel=1 +pkgrel=2 arch=('x86_64') url="https://www.kernel.org/" license=('GPL2') @@ -22,6 +22,7 @@ source=( 0001-add-sysctl-to-disallow-unprivileged-CLONE_NEWUSER-by.patch 0002-Revert-drm-i915-edp-Allow-alternate-fixed-mode-for-e.patch 0003-ACPI-watchdog-Prefer-iTCO_wdt-always-when-WDAT-table.patch + 0004-PCI-fix-restoring-resized-BAR-state-on-resume.patch ) validpgpkeys=( 'ABAF11C65A2970B130ABE3C479BE3E4300411886' # Linus Torvalds @@ -37,7 +38,8 @@ sha256sums=('9faa1dd896eaea961dc6e886697c0b3301277102e5bc976b2758f9a62d3ccd13' 'ad6344badc91ad0630caacde83f7f9b97276f80d26a20619a87952be65492c65' 'e3c08f9b91611186e5ec579187ecea2a0143e5c2dc7ffc30ac6ea6e2b6d130fd' '5403dead9161344b2c01027526146a250147680f4a2d32a54d40c55fc1becc8a' - 'd55e7de60b12bca26ded4c1bb8eb5860a9092374914a201a0f6a0ed2849d099f') + 'd55e7de60b12bca26ded4c1bb8eb5860a9092374914a201a0f6a0ed2849d099f' + '1f903326f3f0b4e072e43d7b14030daf571f612b91919baff44966899b98ce32') _kernelname=${pkgbase#linux} : ${_kernelname:=-ARCH} @@ -60,6 +62,9 @@ prepare() { # https://bugs.archlinux.org/task/56780 patch -Np1 -i ../0003-ACPI-watchdog-Prefer-iTCO_wdt-always-when-WDAT-table.patch + # https://bugs.archlinux.org/task/59271 + patch -Np1 -i ../0004-PCI-fix-restoring-resized-BAR-state-on-resume.patch + cat ../config - >.config <