Received: by 2002:a05:6a10:6d10:0:0:0:0 with SMTP id gq16csp807751pxb; Tue, 12 Apr 2022 14:01:43 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxjERNxlZDoYGY4ET952GmtySpuOTWlhsdy29nUW/lxCVHeI6BOBj52KeILLXh0lYN+3Ltx X-Received: by 2002:a17:902:b941:b0:14d:af72:3f23 with SMTP id h1-20020a170902b94100b0014daf723f23mr40196013pls.6.1649797303337; Tue, 12 Apr 2022 14:01:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649797303; cv=none; d=google.com; s=arc-20160816; b=BISI2SJhq44LgUMMWsmZU5QvPpd9NFCF1AAHX1Ex866Lj2xTczvnlYHMXVHNnLAjUx HUgRcBBG3QY0zOPsC/iWTkwI7NJevMnlkY3cfq1rDzNvGsBQrT0381bgd/6QVkoQJA5w pakpnHYOPHc+QsLMo1C9nxx/wXIFGgoUvDkdRjxz1eNNZU0s3bN0r8g63+WhFpl/aPNd TytnIA6wG0ICSpWvp0LwO8q5r78jG9owvbIgVhtiUnZdx8M5pV5I1m5j7DEii5BnSY/6 LcXtyqR6pLIqZDIrTjB/xWmPR19E65OeOKp1fwEh43ySYtNFlmS6lf8SRsnOyApNGbzO IRvQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :message-id:subject:cc:to:from:date:dkim-signature; bh=9sC+5POUR1qk39PWK2Vb8cLmQZkDelyxHcGyM2r1wUQ=; b=ZRHt5mdWiheW34MLIVk6tUliCksrYCuDVuKWj8AEzRzkX4ZO2JMwM/Byf8ir3pS9Jb t18Mx+nNrDkCvaqHdThw7IKoYkQBdzoGcCPL9nT+ruQQYoUQ2F9ERpABg5b1YcV2jHyZ MrdwZW1x4HGqOXh3mFzAC6Ta5GyVXxMfjivRkHPWLpnUVH1DizykFA56YHCExASIVMna N6f46sRaVolyu5WzoFD16eY59pb7j/oPSaXorHaAY8BVlVgyQ0tOKyBGRfkJ4OlguGrZ TcO3unsAYrjA/yNh17mmt0cykQNkkEixucShSKATzbherAiM4LWyCGfJhyUXmn3YsWIV bLbQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=KOyoiOYg; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id ca24-20020a056a00419800b0050603f643b9si1802652pfb.103.2022.04.12.14.01.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Apr 2022 14:01:43 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=KOyoiOYg; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 0EB3CD5EB8; Tue, 12 Apr 2022 13:23:22 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233426AbiDKTMr (ORCPT + 99 others); Mon, 11 Apr 2022 15:12:47 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53622 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1349545AbiDKTMi (ORCPT ); Mon, 11 Apr 2022 15:12:38 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 468261EECB; Mon, 11 Apr 2022 12:10:23 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id D37F56146F; Mon, 11 Apr 2022 19:10:22 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id EE0A9C385A3; Mon, 11 Apr 2022 19:10:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1649704222; bh=9O9lMuq+VYGLjiYdPSNFx3ZzewzReFiujsIsDEEGTOU=; h=Date:From:To:Cc:Subject:In-Reply-To:From; b=KOyoiOYgtsPQe8CLrIxswda+TPXOcKCfpaMkl3lFMCDNhAtBBla+nNmSnMN5Ph/iV HRA5OQ1/s5X1EaOBZ5+gbMXT1G9uHx2kN7W9T9oGzfxHIZCVflt7zl4fYbcqoTtgzj KKzwOX5J6StC7+56BSJobiQcp0fgvaajyUu1j8knAcCSXmH1gC0ZRn1Ox3SJ93RtUg 7fzungoi4XlDv0qVAoag2X6Pg3ZrzLiIVnlSDVYHMO/W/HOcXyhq488Xcg3rDa6gsz xTxx5fwn8wVq7i+J4KzN492eWKHRX0VD/qZoLu7mrH10sJ9EqmVfzZDLqcSv3mk6oF x4iMEIhSR56MA== Date: Mon, 11 Apr 2022 14:10:20 -0500 From: Bjorn Helgaas To: Shlomo Pongratz Cc: linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, andrew.maier@eideticom.com, logang@deltatee.com, bhelgaas@google.com, jgg@nvidia.com, Shlomo Pongratz Subject: Re: [PATCH V7 1/1] Intel Sky Lake-E host root ports check. Message-ID: <20220411191020.GA530971@bhelgaas> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20220410105213.690-2-shlomop@pliops.com> X-Spam-Status: No, score=-2.3 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,MAILING_LIST_MULTI, RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sun, Apr 10, 2022 at 01:52:13PM +0300, Shlomo Pongratz wrote: > In commit 7b94b53db34f ("PCI/P2PDMA: Add Intel Sky Lake-E Root Ports B, C, > D to the whitelist") > Andrew Maier added the Sky Lake-E additional devices > 2031, 2032 and 2033 root ports to the already existing 2030 device. > > The Intel devices 2030, 2031, 2032 and 2033 which are root ports A, B, C > and D, respectively and if all exist they will occupy slots 0 till 3 in > that order. > > The original code handled only the case where the devices in the whitelist > are host bridges and assumed that they will be found on slot 0. > > Since this assumption doesn't hold for root ports, add a test to cover this > case. > > Signed-off-by: Shlomo Pongratz Applied to pci/p2pdma as below, thanks! > --- > drivers/pci/p2pdma.c | 31 ++++++++++++++++++++++--------- > 1 file changed, 22 insertions(+), 9 deletions(-) > > diff --git a/drivers/pci/p2pdma.c b/drivers/pci/p2pdma.c > index 30b1df3c9d2f..187047be83a0 100644 > --- a/drivers/pci/p2pdma.c > +++ b/drivers/pci/p2pdma.c > @@ -327,15 +327,19 @@ static const struct pci_p2pdma_whitelist_entry { > > /* > * This lookup function tries to find the PCI device corresponding to a given > - * host bridge. > + * host bridge or a root port. > * > * It assumes the host bridge device is the first PCI device in the > - * bus->devices list and that the devfn is 00.0. These assumptions should hold > - * for all the devices in the whitelist above. > + * bus->devices list and that the devfn is 00.0. The first assumption should > + * hold for all the devices in the whitelist above, however the second > + * assumption doesn't always hold for root ports. > + * For example for Intel Skylake devices 2030, 2031, 2032 and 2033, > + * which are root ports (A, B, C and D respectively). > + * So the function checks explicitly that the device is a root port. > * > - * This function is equivalent to pci_get_slot(host->bus, 0), however it does > - * not take the pci_bus_sem lock seeing __host_bridge_whitelist() must not > - * sleep. > + * This function is equivalent to pci_get_slot(host->bus, 0) (except for > + * the root port test), however it does not take the pci_bus_sem lock seeing > + * __host_bridge_whitelist() must not sleep. > * > * For this to be safe, the caller should hold a reference to a device on the > * bridge, which should ensure the host_bridge device will not be freed > @@ -350,10 +354,19 @@ static struct pci_dev *pci_host_bridge_dev(struct pci_host_bridge *host) > > if (!root) > return NULL; > - if (root->devfn != PCI_DEVFN(0, 0)) > - return NULL; > > - return root; > + /* Verify that the device is a host bridge or a root port > + * It is assumed that host bridges have a 0 devfn, (common practice) > + * but some of the entries in the whitelist are root ports that can > + * have any devfn > + */ > + if (root->devfn == PCI_DEVFN(0, 0)) > + return root; > + > + if (pci_pcie_type(root) == PCI_EXP_TYPE_ROOT_PORT) > + return root; > + > + return NULL; > } > > static bool __host_bridge_whitelist(struct pci_host_bridge *host, commit 1af7c26c59eb ("PCI/P2PDMA: Whitelist Intel Skylake-E Root Ports at any devfn") Author: Shlomo Pongratz Date: Sun Apr 10 13:52:13 2022 +0300 PCI/P2PDMA: Whitelist Intel Skylake-E Root Ports at any devfn In 7b94b53db34f ("PCI/P2PDMA: Add Intel Sky Lake-E Root Ports B, C, D to the whitelist"), Andrew Maier added Skylake-E 2031, 2032, and 2033 Root Ports to the pci_p2pdma_whitelist[], so we assume P2PDMA between devices below these ports works. Previously we only checked the whitelist for a device at devfn 00.0 on the root bus, which is often a "host bridge". But these Skylake Root Ports may be at any devfn and there may be no "host bridge" device. Generalize pci_host_bridge_dev() so we check the first device on the root bus, whether it is devfn 00.0 or a PCIe Root Port, against the whitelist. [bhelgaas: commit log, comment] Link: https://lore.kernel.org/r/20220410105213.690-2-shlomop@pliops.com Tested-by: Maor Gottlieb Signed-off-by: Shlomo Pongratz Signed-off-by: Bjorn Helgaas Cc: Andrew Maier diff --git a/drivers/pci/p2pdma.c b/drivers/pci/p2pdma.c index 30b1df3c9d2f..462b429ad243 100644 --- a/drivers/pci/p2pdma.c +++ b/drivers/pci/p2pdma.c @@ -326,15 +326,16 @@ static const struct pci_p2pdma_whitelist_entry { }; /* - * This lookup function tries to find the PCI device corresponding to a given - * host bridge. + * If the first device on host's root bus is either devfn 00.0 or a PCIe + * Root Port, return it. Otherwise return NULL. * - * It assumes the host bridge device is the first PCI device in the - * bus->devices list and that the devfn is 00.0. These assumptions should hold - * for all the devices in the whitelist above. + * We often use a devfn 00.0 "host bridge" in the pci_p2pdma_whitelist[] + * (though there is no PCI/PCIe requirement for such a device). On some + * platforms, e.g., Intel Skylake, there is no such host bridge device, and + * pci_p2pdma_whitelist[] may contain a Root Port at any devfn. * - * This function is equivalent to pci_get_slot(host->bus, 0), however it does - * not take the pci_bus_sem lock seeing __host_bridge_whitelist() must not + * This function is similar to pci_get_slot(host->bus, 0), but it does + * not take the pci_bus_sem lock since __host_bridge_whitelist() must not * sleep. * * For this to be safe, the caller should hold a reference to a device on the @@ -350,10 +351,14 @@ static struct pci_dev *pci_host_bridge_dev(struct pci_host_bridge *host) if (!root) return NULL; - if (root->devfn != PCI_DEVFN(0, 0)) - return NULL; - return root; + if (root->devfn == PCI_DEVFN(0, 0)) + return root; + + if (pci_pcie_type(root) == PCI_EXP_TYPE_ROOT_PORT) + return root; + + return NULL; } static bool __host_bridge_whitelist(struct pci_host_bridge *host,