From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=192.55.52.93; helo=mga11.intel.com; envelope-from=jiewen.yao@intel.com; receiver=edk2-devel@lists.01.org Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 02F0321C913AE for ; Mon, 6 Nov 2017 18:40:16 -0800 (PST) Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 06 Nov 2017 18:44:15 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.44,355,1505804400"; d="scan'208";a="1215077480" Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by fmsmga001.fm.intel.com with ESMTP; 06 Nov 2017 18:44:15 -0800 Received: from fmsmsx154.amr.corp.intel.com (10.18.116.70) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.319.2; Mon, 6 Nov 2017 18:44:15 -0800 Received: from shsmsx152.ccr.corp.intel.com (10.239.6.52) by FMSMSX154.amr.corp.intel.com (10.18.116.70) with Microsoft SMTP Server (TLS) id 14.3.319.2; Mon, 6 Nov 2017 18:44:15 -0800 Received: from shsmsx102.ccr.corp.intel.com ([169.254.2.175]) by SHSMSX152.ccr.corp.intel.com ([169.254.6.93]) with mapi id 14.03.0319.002; Tue, 7 Nov 2017 10:44:13 +0800 From: "Yao, Jiewen" To: "Ni, Ruiyu" , "edk2-devel@lists.01.org" CC: "Kinney, Michael D" , Michael Turner Thread-Topic: [edk2] [PATCH v2] MdeModulePkg/PciBus: Disable BME of all devices when entering RT Thread-Index: AQHTUsy8FPP4aUiq90Gn5zeUm5tcaKMHt9SAgACHESA= Date: Tue, 7 Nov 2017 02:44:12 +0000 Message-ID: <74D8A39837DF1E4DA445A8C0B3885C503AA127BB@shsmsx102.ccr.corp.intel.com> References: <20171101044839.1772-1-ruiyu.ni@intel.com> <734D49CCEBEEF84792F5B80ED585239D5BAB53FA@SHSMSX104.ccr.corp.intel.com> In-Reply-To: <734D49CCEBEEF84792F5B80ED585239D5BAB53FA@SHSMSX104.ccr.corp.intel.com> Accept-Language: zh-CN, en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiMGU2YzkzZWItOTYzMi00ODJiLTgxNGEtNTIxN2JjMWEwNTk3IiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX0lDIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjIuNS4xOCIsIlRydXN0ZWRMYWJlbEhhc2giOiJEZ1djcmxodEhOQ3lTQjI4QitxaWlJc1oyQmV3cjl1dkRJcjVFYTNvdFJ1aFJROE9jWWhoWXRXY1RSY1RyTmFSIn0= x-ctpclassification: CTP_IC dlp-product: dlpe-windows dlp-version: 11.0.0.116 dlp-reaction: no-action x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Subject: Re: [PATCH v2] MdeModulePkg/PciBus: Disable BME of all devices when entering RT X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 07 Nov 2017 02:40:17 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Looks good. Reviewed-by: Jiewen.yao@intel.com > -----Original Message----- > From: Ni, Ruiyu > Sent: Tuesday, November 7, 2017 10:40 AM > To: Ni, Ruiyu ; edk2-devel@lists.01.org > Cc: Kinney, Michael D ; Michael Turner > ; Yao, Jiewen > Subject: RE: [edk2] [PATCH v2] MdeModulePkg/PciBus: Disable BME of all de= vices > when entering RT >=20 > Jiewen, > Any comments? >=20 > Thanks/Ray >=20 > > -----Original Message----- > > From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of > > Ruiyu Ni > > Sent: Wednesday, November 1, 2017 12:49 PM > > To: edk2-devel@lists.01.org > > Cc: Kinney, Michael D ; Michael Turner > > ; Yao, Jiewen > > Subject: [edk2] [PATCH v2] MdeModulePkg/PciBus: Disable BME of all > > devices when entering RT > > > > The patch ensures all DMA transactions are blocked after ExitBootServic= e. > > If a platform enables IOMMU before and needs disable IOMMU after > > ExitBootService, the IOMMU should be disabled after PCI bus driver disa= bles > > BME. > > > > Contributed-under: TianoCore Contribution Agreement 1.1 > > Signed-off-by: Michael Turner > > Signed-off-by: Ruiyu Ni > > Cc: Michael D Kinney > > Cc: Jiewen Yao > > Cc: Jeff Fan > > --- > > MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h | 2 + > > MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf | 3 + > > MdeModulePkg/Bus/Pci/PciBusDxe/PciDeviceSupport.c | 86 > > +++++++++++++++++++++++ > > 3 files changed, 91 insertions(+) > > > > diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h > > b/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h > > index 55eb3a5a80..79b5b71082 100644 > > --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h > > +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h > > @@ -18,6 +18,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY > > KIND, EITHER EXPRESS OR IMPLIED. > > > > #include > > > > +#include > > + > > #include > > #include > > #include > > diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf > > b/MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf > > index 97608bfcf2..d5b8fab3ca 100644 > > --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf > > +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf > > @@ -80,6 +80,9 @@ [LibraryClasses] > > DebugLib > > PeCoffLib > > > > +[Guids] > > + gEfiEventExitBootServicesGuid ## > SOMETIMES_CONSUMES ## > > Event > > + > > [Protocols] > > gEfiPciHotPlugRequestProtocolGuid ## > SOMETIMES_PRODUCES > > gEfiPciIoProtocolGuid ## BY_START > > diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciDeviceSupport.c > > b/MdeModulePkg/Bus/Pci/PciBusDxe/PciDeviceSupport.c > > index 97bb971a59..004f2a3b5b 100644 > > --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciDeviceSupport.c > > +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciDeviceSupport.c > > @@ -21,6 +21,72 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY > > KIND, EITHER EXPRESS OR IMPLIED. > > LIST_ENTRY mPciDevicePool; > > > > /** > > + Disable Bus Master Enable bit in all devices in the list. > > + > > + @param Devices A device list. > > +**/ > > +VOID > > +DisableBmeOnTree ( > > + IN LIST_ENTRY *Devices > > + ) > > +{ > > + LIST_ENTRY *Link; > > + PCI_IO_DEVICE *PciIoDevice; > > + UINT16 Command; > > + > > + for ( Link =3D GetFirstNode (Devices) > > + ; !IsNull (Devices, Link) > > + ; Link =3D GetNextNode (Devices, Link) > > + ) { > > + PciIoDevice =3D PCI_IO_DEVICE_FROM_LINK (Link); > > + // > > + // Turn off all children's Bus Master, if any > > + // > > + DisableBmeOnTree (&PciIoDevice->ChildList); > > + > > + // > > + // If this is a device that supports BME, disable BME on this devi= ce. > > + // > > + if ((PciIoDevice->Supports & EFI_PCI_IO_ATTRIBUTE_BUS_MASTER) !=3D= 0) > > { > > + PCI_READ_COMMAND_REGISTER(PciIoDevice, &Command); > > + if ((Command & EFI_PCI_COMMAND_BUS_MASTER) !=3D 0) { > > + Command &=3D ~EFI_PCI_COMMAND_BUS_MASTER; > > + PCI_SET_COMMAND_REGISTER (PciIoDevice, Command); > > + DEBUG (( > > + DEBUG_INFO," %02x %02x %02x %04x\n", > > + PciIoDevice->BusNumber, PciIoDevice->DeviceNumber, > PciIoDevice- > > >FunctionNumber, > > + Command > > + )); > > + } > > + } > > + } > > +} > > + > > +/** > > + Exit Boot Services Event notification handler. > > + > > + Disable Bus Master on any that were enabled during BDS. > > + > > + @param[in] Event Event whose notification function is being > invoked. > > + @param[in] Context Pointer to the notification function's context= . > > + > > +**/ > > +VOID > > +EFIAPI > > +OnExitBootServices ( > > + IN EFI_EVENT Event, > > + IN VOID *Context > > + ) > > +{ > > + DEBUG (( > > + DEBUG_INFO, > > + "PciBus: Disable Bus Master of all devices...\n" > > + " Bus# Device# Function# NewCommand\n" > > + )); > > + DisableBmeOnTree(&mPciDevicePool); > > +} > > + > > +/** > > Initialize the PCI devices pool. > > > > **/ > > @@ -29,7 +95,27 @@ InitializePciDevicePool ( > > VOID > > ) > > { > > + EFI_EVENT ExitBootServicesEvent; > > + EFI_STATUS Status; > > + > > InitializeListHead (&mPciDevicePool); > > + > > + // > > + // DisableBME on ExitBootServices should be synchonized with any > > IOMMU ExitBootServices routine. > > + // DisableBME should be run before the IOMMU protections are disable= d. > > + // One way to do this is to ensure that the IOMMU ExitBootServices > > callback runs at TPL_CALLBACK. > > + // > > + Status =3D gBS->CreateEventEx ( > > + EVT_NOTIFY_SIGNAL, > > + TPL_NOTIFY, > > + OnExitBootServices, > > + NULL, > > + &gEfiEventExitBootServicesGuid, > > + &ExitBootServicesEvent > > + ); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "PciBus: Unable to hook ExitBootServices even= t > > + - %r\n", Status)); } > > } > > > > /** > > -- > > 2.12.2.windows.2 > > > > _______________________________________________ > > edk2-devel mailing list > > edk2-devel@lists.01.org > > https://lists.01.org/mailman/listinfo/edk2-devel