From patchwork Tue Apr 23 09:50:40 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: You-Sheng Yang X-Patchwork-Id: 1089283 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.ubuntu.com (client-ip=91.189.94.19; helo=huckleberry.canonical.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=canonical.com Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 44pJck3Vtlz9sNm; Tue, 23 Apr 2019 19:51:34 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.86_2) (envelope-from ) id 1hIs5K-0003Bl-UP; Tue, 23 Apr 2019 09:51:30 +0000 Received: from mail-pf1-f195.google.com ([209.85.210.195]) by huckleberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1hIs5I-0003B4-F1 for kernel-team@lists.ubuntu.com; Tue, 23 Apr 2019 09:51:28 +0000 Received: by mail-pf1-f195.google.com with SMTP id y13so7201496pfm.11 for ; Tue, 23 Apr 2019 02:51:28 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=zCNiP6LJMMS/VcYJDMkbRh3JdvXIf+Bx6nn3YwVS8yQ=; b=RDrzhEImSaPL0dH15YHRTcONW8w9Jax+iQAAdGG8iLkTkZrT21mC7Sk0bNszksmBks MRBMxgLZzU7bCdh9osaaErjGaA157Fv9m0VOBLmwDNQoWwKklWjJ08WoDnSwHXkVm9Bl TstBOIcYpe9rsRSQfp1wyXI8roidY01g1kHfABjP2Od5hz92hbki7dI817mO+Lqfowsw IOc0Hk0jPkGLW0wtNlJVaJ3UwtC5pPZBny7GkJH8f4EKut3t4vaVGUkSBaKg2asEmNdW H9tmgCzWLcMvbDNptOa/RIGhcWxoIvOWsHhPcKm2gsTMbEakhREwoPf5c6kMF1qCuJYt jSZQ== X-Gm-Message-State: APjAAAUA0t3MoF9QtZskeZj4dWv/g1MLc4mjsoKAQ4QF4b1kUYK2GCXL Otsf9zFivFFGVCTy6QHFaJDGF4hw X-Google-Smtp-Source: APXvYqyj6ESVDvmEfV1xEDkN3r+pD2Yv/SC77VC3bV+fuUgU+h/XrM49skkxsN7Gd/fIq2s8EOWeFA== X-Received: by 2002:a63:570d:: with SMTP id l13mr23846098pgb.55.1556013086780; Tue, 23 Apr 2019 02:51:26 -0700 (PDT) Received: from momoga.taipei.internal (61-220-137-37.HINET-IP.hinet.net. [61.220.137.37]) by smtp.gmail.com with ESMTPSA id k10sm16231453pgo.82.2019.04.23.02.51.25 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 23 Apr 2019 02:51:26 -0700 (PDT) From: You-Sheng Yang To: kernel-team@lists.ubuntu.com Subject: [PATCH 1/1][SRU][B] PCI: Restore resized BAR state on resume Date: Tue, 23 Apr 2019 17:50:40 +0800 Message-Id: <20190423095040.20862-2-vicamo.yang@canonical.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190423095040.20862-1-vicamo.yang@canonical.com> References: <20190423095040.20862-1-vicamo.yang@canonical.com> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: Christian König BugLink: https://bugs.launchpad.net/bugs/1825958 Resize BARs after resume to the expected size again. BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=199959 Fixes: d6895ad39f3b ("drm/amdgpu: resize VRAM BAR for CPU access v6") Fixes: 276b738deb5b ("PCI: Add resizable BAR infrastructure") Signed-off-by: Christian König Signed-off-by: Bjorn Helgaas CC: stable@vger.kernel.org # v4.15+ (cherry picked from commit d3252ace0bc652a1a244455556b6a549f969bf99) Signed-off-by: You-Sheng Yang --- drivers/pci/pci.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 7e600b75d1865..e04b375da9f02 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -1170,6 +1170,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 @@ -1185,6 +1212,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);