From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2EE0B35AC28 for ; Sat, 28 Feb 2026 18:18:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772302714; cv=none; b=i0TMP+I2o2ywEKVeJ5+NBD3ZbVZa/a+AxRb+yG7k1EXtK3CQZToMTCXJLOl35mScyGIT0YtATisP6jN2VMP7u7734iUUPyj12gzSmvVVrZeh0mWboxWUvppgxuXSFLBZlqFHoistfCNzK52mveuYZMppAo9/usjXAPMyMKTYxoY= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772302714; c=relaxed/simple; bh=DdhXHWxHnu2IUqT9aHXBsMpPh0OaPjyjsXqvpInEGfw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=j8xOhx5bsd5ZeCquWBSRe3cyrl0dPTiAI5eZwm4/pTY6nP6Sh9OutddHSfQVNsltz6f3d7BhFcRiyWssfBsHNALoBaYEEv9tGMX+2nsu8EW4has82MDyzHKnNbOp79XYAtTUxBuKLz4goEuL0mswrACM/Q/wKixzfyklkr25eHM= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=nn0gkwvy; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="nn0gkwvy" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 964FBC19423; Sat, 28 Feb 2026 18:18:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1772302714; bh=DdhXHWxHnu2IUqT9aHXBsMpPh0OaPjyjsXqvpInEGfw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=nn0gkwvyYDiN/nyw8BsGdzH5QUmzZB3iPBlESB5QAGYRxqhilOE9Pc9o4FD4zJ2kf bLNopaSExi58Ydf7tPtBRAry3yzJ/jRQ8yJn+hT3H9CJ0Zok8kw1fdncTTWnepP2n9 QHaigf5D7sDNSCy8YYRAdGjCTyu+p5EVzFF9M0lj4vgH1ZnNIquU2Gc3A2DtwLixjh TcJmHyzTSCWT3mvS4wEG4BWkREWL2pJdoixCOW+MnTV1J1II80scG2Tmzh6zuJivPw CAwncsioTs9WNzm9QV0E38hwoEja0BPg7YPFXooq9B0Hm3dveXnIkbK8uEmzhGl1uR PIa5OgDs4KFHw== From: Sasha Levin To: patches@lists.linux.dev Cc: =?UTF-8?q?H=C3=A5kon=20Bugge?= , Bjorn Helgaas , Sasha Levin Subject: [PATCH 5.10 073/147] PCI: Initialize RCB from pci_configure_device() Date: Sat, 28 Feb 2026 13:16:21 -0500 Message-ID: <20260228181736.1605592-73-sashal@kernel.org> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260228181736.1605592-1-sashal@kernel.org> References: <20260228181736.1605592-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: patches@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit From: Håkon Bugge [ Upstream commit 1a6845aaa6de81f95959b380b45de8f10d6a8502 ] Commit e42010d8207f ("PCI: Set Read Completion Boundary to 128 iff Root Port supports it (_HPX)") worked around a bogus _HPX type 2 record, which caused program_hpx_type2() to set the RCB in an endpoint even though the Root Port did not have the RCB bit set. e42010d8207f fixed that by setting the RCB in the endpoint only when it was set in the Root Port. In retrospect, program_hpx_type2() is intended for AER-related settings, and the RCB should be configured elsewhere so it doesn't depend on the presence or contents of an _HPX record. Explicitly program the RCB from pci_configure_device() so it matches the Root Port's RCB. The Root Port may not be visible to virtualized guests; in that case, leave RCB alone. Fixes: e42010d8207f ("PCI: Set Read Completion Boundary to 128 iff Root Port supports it (_HPX)") Signed-off-by: Håkon Bugge Signed-off-by: Bjorn Helgaas Link: https://patch.msgid.link/20260129175237.727059-2-haakon.bugge@oracle.com Signed-off-by: Sasha Levin --- drivers/pci/probe.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 50a7fd09b068e..c8dc988df4c39 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -2244,6 +2244,37 @@ static void pci_configure_serr(struct pci_dev *dev) } } +static void pci_configure_rcb(struct pci_dev *dev) +{ + struct pci_dev *rp; + u16 rp_lnkctl; + + /* + * Per PCIe r7.0, sec 7.5.3.7, RCB is only meaningful in Root Ports + * (where it is read-only), Endpoints, and Bridges. It may only be + * set for Endpoints and Bridges if it is set in the Root Port. For + * Endpoints, it is 'RsvdP' for Virtual Functions. + */ + if (!pci_is_pcie(dev) || + pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT || + pci_pcie_type(dev) == PCI_EXP_TYPE_UPSTREAM || + pci_pcie_type(dev) == PCI_EXP_TYPE_DOWNSTREAM || + pci_pcie_type(dev) == PCI_EXP_TYPE_RC_EC || + dev->is_virtfn) + return; + + /* Root Port often not visible to virtualized guests */ + rp = pcie_find_root_port(dev); + if (!rp) + return; + + pcie_capability_read_word(rp, PCI_EXP_LNKCTL, &rp_lnkctl); + pcie_capability_clear_and_set_word(dev, PCI_EXP_LNKCTL, + PCI_EXP_LNKCTL_RCB, + (rp_lnkctl & PCI_EXP_LNKCTL_RCB) ? + PCI_EXP_LNKCTL_RCB : 0); +} + static void pci_configure_device(struct pci_dev *dev) { pci_configure_mps(dev); @@ -2252,6 +2283,7 @@ static void pci_configure_device(struct pci_dev *dev) pci_configure_ltr(dev); pci_configure_eetlp_prefix(dev); pci_configure_serr(dev); + pci_configure_rcb(dev); pci_acpi_program_hp_params(dev); } -- 2.51.0