Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp3289947ybt; Mon, 29 Jun 2020 21:53:33 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwJszMtrt8HnpfEYqQ4gZYGkAtISDOBJ084e5oyteLFXNqAdNhyZHDzpSpDC0JFb5zxZu42 X-Received: by 2002:a17:906:19c7:: with SMTP id h7mr16379499ejd.403.1593492813182; Mon, 29 Jun 2020 21:53:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1593492813; cv=none; d=google.com; s=arc-20160816; b=HGk+VY0jxyEOR/fTnN8rWhi/uc1pL6lGYc2h/Zk0zSBvObbTHDnaXUiUL9OuazOXbJ hVtINOgb06Ls4nTEFTNh9WpuqfllF8LRz0/0DT0E/7E1tu33FVJFefGgJRtyPlcEG75G n8vur2AW7wFmTcwKwg3Cepw6xvSOGVSOnv7a5tVeLKHT8PlMqN0Xtb9y0xtHCaUUjwxV I8aihW1NX19BP4rrT42zq2UnwO/ipBf96RFcBR2lkLhxSGMk7wRoHJhd9yYjupw0qF66 7h6a6SjYu5IplU77/NdD42Rmre41GB8uUD5Ydpbpo9O8daQ2Lk+hyF0sPusDaFH06rhV 1zGQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:from:subject:references :mime-version:message-id:in-reply-to:date:dkim-signature; bh=p5jMb0OYXUjKEO09icbDu9vKB8mUnjKS7ldJrGg6Yyk=; b=s6JcxS1ios+3GgqRVsqnFpPULSGnQqQo53bPXNdmMx70SrSEPoDta+QRPs/IJReZ46 i/dcNf0U9Q7eNjvtw2ih0faEeO9Kp67x3kST/9zVd1LiuTc20Cjx/i/Z98JPRJ+eBsCG AK6ftygQOXYs2wK9UKPWXEO5pSYmjg8GJ3+2uLcqYil9wf/3YWaop9YD36Xm3XNEXSg8 aHeI8ciNevZLYiw2XDzyk29c31BeCSVK4TJ9DNwovUhIcD7Fm4iJ0dp3g3sNPlMJHi80 YdR4e67oLivaULLlIclNF7HY5KZoqkKuDDp4VQtXq0Ire/PNgTuaBcFzpwJS6S6iETxN //1Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=Gm5cJgnN; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id o11si1015830ejr.391.2020.06.29.21.53.10; Mon, 29 Jun 2020 21:53:33 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=Gm5cJgnN; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729525AbgF3EuV (ORCPT + 99 others); Tue, 30 Jun 2020 00:50:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48840 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729365AbgF3Etw (ORCPT ); Tue, 30 Jun 2020 00:49:52 -0400 Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 30E6AC03E979 for ; Mon, 29 Jun 2020 21:49:52 -0700 (PDT) Received: by mail-yb1-xb49.google.com with SMTP id c17so21194634ybf.7 for ; Mon, 29 Jun 2020 21:49:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=p5jMb0OYXUjKEO09icbDu9vKB8mUnjKS7ldJrGg6Yyk=; b=Gm5cJgnNdA4j8KoD0JqCp92eh1dOmKyWbRuaafAkp7j4Tiyi/4VrofOQLz3gqmH/1f vlpldBL1WmCe+59Bk7L3+Bu45rxpdaClWinZYlTrS4AghzmPY4sSK8SDAvo4ZHE4nVF8 dD1LOwsfjMTY6dYL4PT5+7wRAPaZZTfGFryosjGQCzjr3GjbXbC0q8rP7WwUrkKK+129 6iRr7B/3o9dNgxc+2YqyrOnydhVzjrhZ3STLNNjon1ze+cF/JTDek3hPTlrAhpXvbTf/ RbztkalEnybqiFRfvvrtExkKkmnoIKChXrimpwJ7RbEd0qnfPPsRFLzGD/3RV9k79OtQ wxvQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=p5jMb0OYXUjKEO09icbDu9vKB8mUnjKS7ldJrGg6Yyk=; b=KxJFgxvWBhjF27OkVlhm/QKBc7awwJgpy1EiHA/C1oTUnrZaGXvPTRVGiIgKdSiAnD rDnSBElQ8AP6SuiYE3zwT23unhsiTD+7O2rOZeQ4pqjDqGARdBb4V7WfSi1zNGel74Ax sPvlg71AqKZrUWINBGIyffpfhCSG+PTsZucwfDpd8omTtiu2gxWalHFcxhzrXri9lPTT z4b9UARLl4vgpVaSOwnieOwQKvj8e4pY3qN/cVlVOVYWChd+VsYCdXpHRsGbisya4Akh m4VZsCfKI2aLwgID3N5rtmsht4nwzIZ7F98ixwImTM20+Kw3OvDhVl4/784tkzOYwrp0 IwQg== X-Gm-Message-State: AOAM531sPArXWiRScP0M9gTKnbVonyFY7D/9SexuNnw1r4T5nJGdfF+f Kwdy8O4+A+7zqIIx/9jT6RdhTn6pjosJ X-Received: by 2002:a25:dfd2:: with SMTP id w201mr25555433ybg.230.1593492591375; Mon, 29 Jun 2020 21:49:51 -0700 (PDT) Date: Mon, 29 Jun 2020 21:49:38 -0700 In-Reply-To: <20200630044943.3425049-1-rajatja@google.com> Message-Id: <20200630044943.3425049-3-rajatja@google.com> Mime-Version: 1.0 References: <20200630044943.3425049-1-rajatja@google.com> X-Mailer: git-send-email 2.27.0.212.ge8ba1cc988-goog Subject: [PATCH v2 2/7] PCI: Set "untrusted" flag for truly external devices only From: Rajat Jain To: David Woodhouse , Lu Baolu , Joerg Roedel , Bjorn Helgaas , "Rafael J. Wysocki" , Len Brown , iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org, linux-acpi@vger.kernel.org, Raj Ashok , lalithambika.krishnakumar@intel.com, Mika Westerberg , Jean-Philippe Brucker , Prashant Malani , Benson Leung , Todd Broch , Alex Levin , Mattias Nissler , Rajat Jain , Bernie Keany , Aaron Durbin , Diego Rivas , Duncan Laurie , Furquan Shaikh , Jesse Barnes , Christian Kellner , Alex Williamson , Greg Kroah-Hartman , oohall@gmail.com, Saravana Kannan , Suzuki K Poulose , Arnd Bergmann , Heikki Krogerus Cc: Rajat Jain Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The "ExternalFacing" devices (root ports) are still internal devices that sit on the internal system fabric and thus trusted. Currently they were being marked untrusted. This patch uses the platform flag to identify the external facing devices and then use it to mark any downstream devices as "untrusted". The external-facing devices themselves are left as "trusted". This was discussed here: https://lkml.org/lkml/2020/6/10/1049 Signed-off-by: Rajat Jain --- v2: cosmetic changes in commit log drivers/iommu/intel/iommu.c | 2 +- drivers/pci/of.c | 2 +- drivers/pci/pci-acpi.c | 13 +++++++------ drivers/pci/probe.c | 2 +- include/linux/pci.h | 8 ++++++++ 5 files changed, 18 insertions(+), 9 deletions(-) diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c index d759e7234e982..1ccb224f82496 100644 --- a/drivers/iommu/intel/iommu.c +++ b/drivers/iommu/intel/iommu.c @@ -4743,7 +4743,7 @@ static inline bool has_untrusted_dev(void) struct pci_dev *pdev = NULL; for_each_pci_dev(pdev) - if (pdev->untrusted) + if (pdev->untrusted || pdev->external_facing) return true; return false; diff --git a/drivers/pci/of.c b/drivers/pci/of.c index 27839cd2459f6..22727fc9558df 100644 --- a/drivers/pci/of.c +++ b/drivers/pci/of.c @@ -42,7 +42,7 @@ void pci_set_bus_of_node(struct pci_bus *bus) } else { node = of_node_get(bus->self->dev.of_node); if (node && of_property_read_bool(node, "external-facing")) - bus->self->untrusted = true; + bus->self->external_facing = true; } bus->dev.of_node = node; diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c index 7224b1e5f2a83..492c07805caf8 100644 --- a/drivers/pci/pci-acpi.c +++ b/drivers/pci/pci-acpi.c @@ -1213,22 +1213,23 @@ static void pci_acpi_optimize_delay(struct pci_dev *pdev, ACPI_FREE(obj); } -static void pci_acpi_set_untrusted(struct pci_dev *dev) +static void pci_acpi_set_external_facing(struct pci_dev *dev) { u8 val; - if (pci_pcie_type(dev) != PCI_EXP_TYPE_ROOT_PORT) + if (pci_pcie_type(dev) != PCI_EXP_TYPE_ROOT_PORT && + pci_pcie_type(dev) != PCI_EXP_TYPE_DOWNSTREAM) return; if (device_property_read_u8(&dev->dev, "ExternalFacingPort", &val)) return; /* - * These root ports expose PCIe (including DMA) outside of the - * system so make sure we treat them and everything behind as + * These root/down ports expose PCIe (including DMA) outside of the + * system so make sure we treat everything behind them as * untrusted. */ if (val) - dev->untrusted = 1; + dev->external_facing = 1; } static void pci_acpi_setup(struct device *dev) @@ -1240,7 +1241,7 @@ static void pci_acpi_setup(struct device *dev) return; pci_acpi_optimize_delay(pci_dev, adev->handle); - pci_acpi_set_untrusted(pci_dev); + pci_acpi_set_external_facing(pci_dev); pci_acpi_add_edr_notifier(pci_dev); pci_acpi_add_pm_notifier(adev, pci_dev); diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 6d87066a5ecc5..8c40c00413e74 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -1552,7 +1552,7 @@ static void set_pcie_untrusted(struct pci_dev *dev) * untrusted as well. */ parent = pci_upstream_bridge(dev); - if (parent && parent->untrusted) + if (parent && (parent->untrusted || parent->external_facing)) dev->untrusted = true; } diff --git a/include/linux/pci.h b/include/linux/pci.h index a26be5332bba6..fe1bc603fda40 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -432,6 +432,14 @@ struct pci_dev { * mappings to make sure they cannot access arbitrary memory. */ unsigned int untrusted:1; + /* + * Devices are marked as external-facing using info from platform + * (ACPI / devicetree). An external-facing device is still an internal + * trusted device, but it faces external untrusted devices. Thus any + * devices enumerated downstream an external-facing device is marked + * as untrusted. + */ + unsigned int external_facing:1; unsigned int broken_intx_masking:1; /* INTx masking can't be used */ unsigned int io_window_1k:1; /* Intel bridge 1K I/O windows */ unsigned int irq_managed:1; -- 2.27.0.212.ge8ba1cc988-goog