Received: by 2002:a19:f614:0:0:0:0:0 with SMTP id x20csp25934lfe; Fri, 15 Apr 2022 17:46:57 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz4osbNMbEIEqSMJgX5R9+RFqBhEryJafgHPoK/vfx34cJXpRkKBf0kv9lu3ict7dLSR+Sv X-Received: by 2002:a17:902:a987:b0:158:b020:e5b8 with SMTP id bh7-20020a170902a98700b00158b020e5b8mr1534968plb.103.1650070017016; Fri, 15 Apr 2022 17:46:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1650070017; cv=none; d=google.com; s=arc-20160816; b=qqZ5KF5eExKXTpDO9NwYhKgZM4B8adoaI9yHffQZgK+xgv6ecV1VfdP+x10vg4RdWU sWBNqIu2DuSXPXFYd8Lm0Fsyza6b/K+Hh965SSOtQmgKlDvO2FVkcckHS32N5SkRicP8 jeoNlnkqq6Ix3JEHdwaEgSY4CenADj6WQ03WTDyziwv812Gob/H5JK6y0AjPIFjX9aXJ UUxEJ4UODn3hKTXWa6T2A0ZuLLm5hcv1HxRH/pgcXYhdmmUS5mdPfFEGKNcXv+MTTXdb xUzrXUf8PonUn0KSqKZ6bYLf2puQvgamdnlphK6x/lqprOHPxPx7aYtM+KM6gLhMPUpc a82w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=vLhomrpooyVkCPnT/V3GspH1VkT6rkdcQOEP4TxU1jc=; b=RWpA0N2XYd1mnPMrxwmIk0DAxLJiNmrwW74VuHMD1sz0EEOJGVwhlJx1j+WDU3UNRW GgtqNA9vN3Gsfancksy1XlTSNxcEyM8o9P8vejZIi7YEHdLKeLYq8E+HI97flD+7oxvL BxhEFb6CXvgaVdWGJbSps9/8CYF9jG1mzJ5xKRAlC1geJSyc51bZvbLJ2Uy8IMuMSy1u PDl/qAQw0x5PGrlo7pH8NDeXKVSYcgGNz4rFXEQXcZ0SD+GxPm/2tJqbOKTaWM4Qe47l i4q5Av4AyS2Zct4kpR/BvUtJAkwexTZR5Bbc3hpljnIvHufQU/kn3pxvMnZJbxHunhwq g2Uw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b="Xwr79i/r"; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id d13-20020aa78e4d000000b005056d85e53dsi2595137pfr.163.2022.04.15.17.46.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 Apr 2022 17:46:57 -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=@google.com header.s=20210112 header.b="Xwr79i/r"; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id D2D40FC10D; Fri, 15 Apr 2022 17:38:10 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240552AbiDNXS4 (ORCPT + 99 others); Thu, 14 Apr 2022 19:18:56 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40510 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1345759AbiDNXSu (ORCPT ); Thu, 14 Apr 2022 19:18:50 -0400 Received: from mail-pj1-x102e.google.com (mail-pj1-x102e.google.com [IPv6:2607:f8b0:4864:20::102e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7C751AC908 for ; Thu, 14 Apr 2022 16:16:24 -0700 (PDT) Received: by mail-pj1-x102e.google.com with SMTP id mm4-20020a17090b358400b001cb93d8b137so10555303pjb.2 for ; Thu, 14 Apr 2022 16:16:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=vLhomrpooyVkCPnT/V3GspH1VkT6rkdcQOEP4TxU1jc=; b=Xwr79i/rtcdMWZfT7X4gLtn/vh+8ejYnbNEzZrzwPEZQJl3GxaqMmrDWnIP06UETWf QO6k2kmSdAsNnxYgt5BIdG2EfI3eWsFLzQeSK+jjRh9x9Y4Ioih9qk0/4ccMmDO9ZGTP EkpiuIOmmyUG5xn/9MPYjBUzbjrx0E+jWGo4iZCqvaBK2YXRzbgBSN0AmU/0CHsAwf9+ IF01Mv0mvybjqpC+tQ4CafC4sv+hVw5uKhFGwj3DUjqowV5+8pMXD7VHKN6TvZnrX5Vb 1PCwm0BXhEAlX8VODN06SyLQVUhJsM3g/UH1w0Vi8Obymk11oeN6R/gTjqo3gv7a6mpE t4bQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=vLhomrpooyVkCPnT/V3GspH1VkT6rkdcQOEP4TxU1jc=; b=RFqzaPxSCFJkYLokDcfeUj/ZWCmOYDXHyRxahiwFSioRpi7dsHs74kYss4Dz+n8Vjk 5sxI4dNeNWg29MLJ8mNfi7A5WT60AN3rQ8REPgphU1vvqgG3ZqWDhKPSpUqRWEYcETli q/lc4PktCoCe+ca2bVRUJXv/7Nz4iOhZ9Q3n0CmXd0Nz/R8hj+cIAMHPB4uF5cUrWqSp eDT40Da2tiCqBTqkaRqTyhe6VwTTYwTZV+awEsmEWscxsJQnDZCs49NZ49RiZDE//qas eU4GByBToOZOrFzGIT29FZmPrBD74sW7Gi/bTGv/d5/aphbUgU00WWDNSJvhjCImL+CA i/dw== X-Gm-Message-State: AOAM530ICYq/3EbesqA6kCW/eZXHERAc0q6IxQAZdKY3r9qIzB8+cMRv 1ZmkpCfz9xFBwd4jYYx/SBkDG0oGm+sZUYXfh43ZJw== X-Received: by 2002:a17:90b:164f:b0:1c7:8d20:ff6d with SMTP id il15-20020a17090b164f00b001c78d20ff6dmr1006092pjb.64.1649978183669; Thu, 14 Apr 2022 16:16:23 -0700 (PDT) MIME-Version: 1.0 References: <20220325184609.4059963-1-rajatja@google.com> <20220407191715.GA254460@bhelgaas> In-Reply-To: <20220407191715.GA254460@bhelgaas> From: Rajat Jain Date: Thu, 14 Apr 2022 16:15:47 -0700 Message-ID: Subject: Re: [PATCH v5 1/2] PCI: ACPI: Support Microsoft's "DmaProperty" To: Bjorn Helgaas Cc: "Rafael J. Wysocki" , Len Brown , linux-pci@vger.kernel.org, Mika Westerberg , Greg Kroah-Hartman , Bjorn Helgaas , ACPI Devel Maling List , Linux Kernel Mailing List , Rajat Jain , Dmitry Torokhov , Jesse Barnes , Jean-Philippe Brucker , Pavel Machek , "Oliver O'Halloran" , Joerg Roedel , Will Deacon , David Woodhouse , Lu Baolu , iommu@lists.linux-foundation.org Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-9.5 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE, USER_IN_DEF_DKIM_WL autolearn=no 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 Hello Bjorn, On Thu, Apr 7, 2022 at 12:17 PM Bjorn Helgaas wrote: > > In subject, > > PCI/ACPI: ... > > would be consistent with previous history (at least things coming > through the PCI tree :)). Will do. > > On Fri, Mar 25, 2022 at 11:46:08AM -0700, Rajat Jain wrote: > > The "DmaProperty" is supported and documented by Microsoft here: > > https://docs.microsoft.com/en-us/windows-hardware/drivers/pci/dsd-for-pcie-root-ports > > Here's a more specific link (could probably be referenced below to > avoid cluttering the text here): > > https://docs.microsoft.com/en-us/windows-hardware/drivers/pci/dsd-for-pcie-root-ports#identifying-internal-pcie-ports-accessible-to-users-and-requiring-dma-protection Will do. > > > They use this property for DMA protection: > > https://docs.microsoft.com/en-us/windows/security/information-protection/kernel-dma-protection-for-thunderbolt > > > > Support the "DmaProperty" with the same semantics. This is useful for > > internal PCI devices that do not hang off a PCIe rootport, but offer > > an attack surface for DMA attacks (e.g. internal network devices). > > Same semantics as what? Er, I meant the same semantics as the "DmaProperty". Please also see below. > > The MS description of "ExternalFacingPort" says: > > This ACPI object enables the operating system to identify externally > exposed PCIe hierarchies, such as Thunderbolt. > No, my patch doesn't have to do with this one. > and "DmaProperty" says: > > This ACPI object enables the operating system to identify internal > PCIe hierarchies that are easily accessible by users (such as, > Laptop M.2 PCIe slots accessible by way of a latch) and require > protection by the OS Kernel DMA Protection mechanism. Yes, this is the property that my patch uses. Microsoft has agreed to update this documentation (in a sideband thread that I also copied you on), with the updated semantics that this property can be used to identify any PCI devices that require Kernel DMA protection. i.e. the property is not restricted to identify "internal PCIe hierarchies" (starting at root port), but to "any PCI device". > > I don't really understand why they called out "laptop M.2 PCIe slots" > here. Is the idea that those are more accessible than a standard > internal PCIe slot? Seems like a pretty small distinction to me. > > I can understand your example of internal network devices adding an > attack surface. But I don't see how "DmaProperty" helps identify > those. Wouldn't a NIC in a standard internal PCIe slot add the same > attack surface? Yes it would. The attack surface is the same. They probably only thought of devices external to the SoC (starting from a root port) when designing this property and thus called out internal M.2 PCI slots. But nowhave realized that this could be opened to any PCI device. > > > Signed-off-by: Rajat Jain > > Reviewed-by: Mika Westerberg > > --- > > v5: * Reorder the patches in the series > > v4: * Add the GUID. > > * Update the comment and commitlog. > > v3: * Use Microsoft's documented property "DmaProperty" > > * Resctrict to ACPI only > > > > drivers/acpi/property.c | 3 +++ > > drivers/pci/pci-acpi.c | 16 ++++++++++++++++ > > 2 files changed, 19 insertions(+) > > > > diff --git a/drivers/acpi/property.c b/drivers/acpi/property.c > > index d0986bda2964..20603cacc28d 100644 > > --- a/drivers/acpi/property.c > > +++ b/drivers/acpi/property.c > > @@ -48,6 +48,9 @@ static const guid_t prp_guids[] = { > > /* Storage device needs D3 GUID: 5025030f-842f-4ab4-a561-99a5189762d0 */ > > GUID_INIT(0x5025030f, 0x842f, 0x4ab4, > > 0xa5, 0x61, 0x99, 0xa5, 0x18, 0x97, 0x62, 0xd0), > > + /* DmaProperty for PCI devices GUID: 70d24161-6dd5-4c9e-8070-705531292865 */ > > + GUID_INIT(0x70d24161, 0x6dd5, 0x4c9e, > > + 0x80, 0x70, 0x70, 0x55, 0x31, 0x29, 0x28, 0x65), > > }; > > > > /* ACPI _DSD data subnodes GUID: dbb8e3e6-5886-4ba6-8795-1319f52a966b */ > > diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c > > index 1f15ab7eabf8..378e05096c52 100644 > > --- a/drivers/pci/pci-acpi.c > > +++ b/drivers/pci/pci-acpi.c > > @@ -1350,12 +1350,28 @@ static void pci_acpi_set_external_facing(struct pci_dev *dev) > > dev->external_facing = 1; > > } > > > > +static void pci_acpi_check_for_dma_protection(struct pci_dev *dev) > > I try to avoid function names like *_check_*() because they don't give > any hint about whether there's a side effect or what direction things > are going. I prefer things that return a value or make sense when > used as a predicate. Maybe something like this? > > int pci_dev_has_dma_property(struct pci_dev *dev) > > dev->untrusted |= pci_dev_has_dma_property(pci_dev); > OK, will do. > > +{ > > + u8 val; > > + > > + /* > > + * Property also used by Microsoft Windows for same purpose, > > + * (to implement DMA protection from a device, using the IOMMU). > > + */ > > + if (device_property_read_u8(&dev->dev, "DmaProperty", &val)) > > The MS web page says a _DSD with this property must be implemented in > the Root Port device scope, but we don't enforce that here. We *do* > enforce it in pci_acpi_set_untrusted(). Shouldn't we do the same > here? No, the whole point of doing this (please refer to the discussion on the previous versions of this patch) was that we want to have a property that is NOT limited to the root ports only. And we have reached an agreement with Microsoft about that. > > We currently look at three properties from the same _DSD: > > DmaProperty > ExternalFacingPort > HotPlugSupportInD3 > > For "HotPlugSupportInD3", we check that "value == 1". For > "ExternalFacingPort", we check that it's non-zero. The MS doc isn't > explicit about the values, but shows "1" in the sample ASL. I think > we should handle all three cases the same. I think we can handle all three cases with "value==1". I will send a separate patch for the ExternalFacingPort, and will fixup this patch too). > > The first two use device_property_read_u8(); the last uses > acpi_dev_get_property(). Again, I think they should all be the same. > > acpi_dev_get_property() is easier for me to read because there are > slightly fewer layers of abstraction between _DSD and > acpi_dev_get_property(). I'd prefer that too, and can change it to acpi_dev_get_property. > > But IIUC, device_property_read_u8() works for either ACPI or DT > properties, and maybe there is interest in using this for DT systems. > None of these appear in any in-tree DTs, but maybe it is important to > handle these in DTs? > > If that's the case, this code would no longer be specific to ACPI and > should be moved to somewhere that's compiled even when CONFIG_ACPI > isn't set. I think unifying ACPI and GPIO systems to use the same code / function to read the properties might be more work/investigation, because reading the properties for ACPI system happens much later than DT systems (For acpi systems, it happens in pci_acpi_setup() which is called much later). Given that no one wants to use this for DT systems, I'd prefer for this to be ACPI specific for now, and then we can solve it for DT once someone needs it. WDYT? Thanks & Best regards, Rajat > > > + return; > > + > > + if (val) > > + dev->untrusted = 1; > > +} > > + > > void pci_acpi_setup(struct device *dev, struct acpi_device *adev) > > { > > struct pci_dev *pci_dev = to_pci_dev(dev); > > > > pci_acpi_optimize_delay(pci_dev, adev->handle); > > pci_acpi_set_external_facing(pci_dev); > > + pci_acpi_check_for_dma_protection(pci_dev); > > pci_acpi_add_edr_notifier(pci_dev); > > > > pci_acpi_add_pm_notifier(adev, pci_dev); > > -- > > 2.35.1.1021.g381101b075-goog > >