On 09/21/15 03:15, Tian, Feng wrote: > Hi, Laszlo > > There is a macro EFI_PCI_DEVICE_ENABLE, which is (EFI_PCI_IO_ATTRIBUTE_IO | > EFI_PCI_IO_ATTRIBUTE_MEMORY | EFI_PCI_IO_ATTRIBUTE_BUS_MASTER) > > Suggest to use this macro. Others look good to me. Reviewed-by: Feng Tian > <[email protected]>
Good idea. I'll fix it up at commit time. Thanks! Laszlo > > Thanks > Feng > > -----Original Message----- > From: edk2-devel [mailto:[email protected]] On Behalf Of Laszlo > Ersek > Sent: Wednesday, September 16, 2015 10:57 > To: [email protected] > Cc: Tian, Feng; Justen, Jordan L; Gabriel L. Somlo; Alexander Graf; Hannes > Reinecke; Reza Jelveh > Subject: [edk2] [PATCH v4 05/10] OvmfPkg: SataControllerDxe: enable IO / mem > access and DMA when binding > > When we bind the SATA controller in SataControllerStart(), we read the NP > ("Number of Ports") bitfield from the CAP ("HBA Capabilities") register of > the controller. (See the AHCI 1.3.1 spec.) > > This register is memory mapped. If we'd like to access it, we must at least > enable memory space access for the device. In addition, Feng Tian recommended > enabling Bus Master DMA in > <http://thread.gmane.org/gmane.comp.bios.tianocore.devel/10545/focus=10659>. > We also enable IO space access for completeness. > > Further, because we change the PCI attributes of the device with the above > when binding it, we must also restore its original PCI attributes when > unbinding it. See the Driver Writer's Guide for UEFI 2.3.1 v1.01, section > 18.3 "PCI drivers" | 18.3.2 "Start() and Stop()". > > (OvmfPkg's copy of SataControllerDxe must differ from the same in DuetPkg > because Duet inherits a pre-configured SATA controller from the BIOS, as > explained by Feng.) > > Cc: Alexander Graf <[email protected]> > Cc: Reza Jelveh <[email protected]> > Cc: Jordan Justen <[email protected]> > Cc: Hannes Reinecke <[email protected]> > Cc: Gabriel L. Somlo <[email protected]> > Cc: Feng Tian <[email protected]> > Suggested-by: Feng Tian <[email protected]> > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Laszlo Ersek <[email protected]> > --- > OvmfPkg/SataControllerDxe/SataController.h | 5 +++ > OvmfPkg/SataControllerDxe/SataController.c | 39 +++++++++++++++++++- > 2 files changed, 43 insertions(+), 1 deletion(-) > > diff --git a/OvmfPkg/SataControllerDxe/SataController.h > b/OvmfPkg/SataControllerDxe/SataController.h > index a6c6c16..e5b719e 100644 > --- a/OvmfPkg/SataControllerDxe/SataController.h > +++ b/OvmfPkg/SataControllerDxe/SataController.h > @@ -86,6 +86,11 @@ typedef struct _EFI_SATA_CONTROLLER_PRIVATE_DATA { > EFI_PCI_IO_PROTOCOL *PciIo; > > // > + // Original PCI attributes > + // > + UINT64 OriginalPciAttributes; > + > + // > // The number of devices that are supported by this channel > // > UINT8 DeviceCount; > diff --git a/OvmfPkg/SataControllerDxe/SataController.c > b/OvmfPkg/SataControllerDxe/SataController.c > index 5e7e23b..275b527 100644 > --- a/OvmfPkg/SataControllerDxe/SataController.c > +++ b/OvmfPkg/SataControllerDxe/SataController.c > @@ -390,6 +390,7 @@ SataControllerStart ( { > EFI_STATUS Status; > EFI_PCI_IO_PROTOCOL *PciIo; > + UINT64 OriginalPciAttributes; > PCI_TYPE00 PciData; > EFI_SATA_CONTROLLER_PRIVATE_DATA *SataPrivateData; > UINT32 Data32; > @@ -415,12 +416,33 @@ SataControllerStart ( > } > > // > + // Save original PCI attributes, and enable IO space access, memory > + space // access, and Bus Master (DMA). > + // > + Status = PciIo->Attributes (PciIo, EfiPciIoAttributeOperationGet, 0, > + &OriginalPciAttributes); if (EFI_ERROR (Status)) { > + goto ClosePciIo; > + } > + Status = PciIo->Attributes ( > + PciIo, > + EfiPciIoAttributeOperationEnable, > + (EFI_PCI_IO_ATTRIBUTE_IO | > + EFI_PCI_IO_ATTRIBUTE_MEMORY | > + EFI_PCI_IO_ATTRIBUTE_BUS_MASTER), > + NULL > + ); > + if (EFI_ERROR (Status)) { > + goto ClosePciIo; > + } > + > + // > // Allocate Sata Private Data structure > // > SataPrivateData = AllocateZeroPool (sizeof > (EFI_SATA_CONTROLLER_PRIVATE_DATA)); > if (SataPrivateData == NULL) { > Status = EFI_OUT_OF_RESOURCES; > - goto ClosePciIo; > + goto RestorePciAttributes; > } > > // > @@ -428,6 +450,7 @@ SataControllerStart ( > // > SataPrivateData->Signature = SATA_CONTROLLER_SIGNATURE; > SataPrivateData->PciIo = PciIo; > + SataPrivateData->OriginalPciAttributes = OriginalPciAttributes; > SataPrivateData->IdeInit.GetChannelInfo = IdeInitGetChannelInfo; > SataPrivateData->IdeInit.NotifyPhase = IdeInitNotifyPhase; > SataPrivateData->IdeInit.SubmitData = IdeInitSubmitData; @@ -512,6 +535,10 > @@ FreeDisqualifiedModes: > FreeSataPrivateData: > FreePool (SataPrivateData); > > +RestorePciAttributes: > + PciIo->Attributes (PciIo, EfiPciIoAttributeOperationSet, > + OriginalPciAttributes, NULL); > + > ClosePciIo: > gBS->CloseProtocol ( > Controller, > @@ -595,6 +622,16 @@ SataControllerStop ( > } > > // > + // Restore original PCI attributes > + // > + SataPrivateData->PciIo->Attributes ( > + SataPrivateData->PciIo, > + EfiPciIoAttributeOperationSet, > + SataPrivateData->OriginalPciAttributes, > + NULL > + ); > + > + // > // Close protocols opened by Sata Controller driver > // > return gBS->CloseProtocol ( > -- > 1.8.3.1 > > > _______________________________________________ > edk2-devel mailing list > [email protected] > https://lists.01.org/mailman/listinfo/edk2-devel > _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

