Hi Star, Thank you for your feedback. I will submit a new patch with the issues addressed. Kindly ignore the v2 patch.
Regards, Sami Mujawar -----Original Message----- From: Zeng, Star <star.z...@intel.com> Sent: 19 June 2018 03:53 AM To: Sami Mujawar <sami.muja...@arm.com>; edk2-devel@lists.01.org Cc: ruiyu...@intel.com; Stephanie Hughes-Fitt <stephanie.hughes-f...@arm.com>; eric.d...@intel.com; ard.biesheu...@linaro.org; leif.lindh...@linaro.org; nd <n...@arm.com>; star.z...@intel.com Subject: Re: [edk2] [PATCH v1] MdeModulePkg: Enable SATA Controller PCI mem space Hi Sami, My feedback are inline. On 2018/6/15 21:51, Sami Mujawar wrote: > Hi Zeng, > > Please find my response marked [SAMI] below. > > Regards, > > Sami Mujawar > > -----Original Message----- > From: Zeng, Star <star.z...@intel.com> > Sent: 15 June 2018 10:42 AM > To: Sami Mujawar <sami.muja...@arm.com>; edk2-devel@lists.01.org > Cc: ruiyu...@intel.com; nd <n...@arm.com>; Stephanie Hughes-Fitt > <stephanie.hughes-f...@arm.com>; eric.d...@intel.com; > ard.biesheu...@linaro.org; leif.lindh...@linaro.org; > star.z...@intel.com > Subject: Re: [edk2] [PATCH v1] MdeModulePkg: Enable SATA Controller > PCI mem space > > Generally, the patch is good to me. > Some comments below. > > On 2018/6/14 19:38, Sami Mujawar wrote: >> The SATA controller driver crashes while accessing the PCI memory, as >> the PCI memory space is not enabled. > > The code "accessing the PCI memory" you mentioned here is the AhciReadReg in > the following code block, right? > [SAMI] Yes. >> >> Enable the PCI memory space access to prevent the SATA Controller >> driver from crashing. >> >> Contributed-under: TianoCore Contribution Agreement 1.1 >> Signed-off-by: Sami Mujawar <sami.muja...@arm.com> >> --- >> The changes can be seen at >> https://github.com/samimujawar/edk2/tree/284_sata_controler_pci_mem_f >> i >> x_v1 >> >> Notes: >> v1: >> - Fix SATA Controller driver crash >> [SAMI] >> >> MdeModulePkg/Bus/Pci/SataControllerDxe/SataController.c | 80 >> +++++++++++++++++++- >> MdeModulePkg/Bus/Pci/SataControllerDxe/SataController.h | 7 ++ >> 2 files changed, 86 insertions(+), 1 deletion(-) >> >> diff --git a/MdeModulePkg/Bus/Pci/SataControllerDxe/SataController.c >> b/MdeModulePkg/Bus/Pci/SataControllerDxe/SataController.c >> index >> a6d55c15571728eb3fd572003f383ba7c86635ae..21cc101d693f5adfd9d43f0c21a >> 0 >> 96eb59ba73b1 100644 >> --- a/MdeModulePkg/Bus/Pci/SataControllerDxe/SataController.c >> +++ b/MdeModulePkg/Bus/Pci/SataControllerDxe/SataController.c >> @@ -2,6 +2,7 @@ >> This driver module produces IDE_CONTROLLER_INIT protocol for Sata >> Controllers. >> >> Copyright (c) 2011 - 2016, Intel Corporation. All rights >> reserved.<BR> >> + Copyright (c) 2018, ARM Ltd. All rights reserved.<BR> >> This program and the accompanying materials >> are licensed and made available under the terms and conditions of the >> BSD License >> which accompanies this distribution. The full text of the >> license may be found at @@ -364,6 +365,7 @@ SataControllerStart ( >> EFI_SATA_CONTROLLER_PRIVATE_DATA *Private; >> UINT32 Data32; >> UINTN TotalCount; >> + UINT64 PciAttributes; >> >> DEBUG ((EFI_D_INFO, "SataControllerStart start\n")); >> >> @@ -406,6 +408,61 @@ SataControllerStart ( >> Private->IdeInit.CalculateMode = IdeInitCalculateMode; >> Private->IdeInit.SetTiming = IdeInitSetTiming; >> Private->IdeInit.EnumAll = SATA_ENUMER_ALL; >> + Private->PciAttributesChanged = FALSE; >> + >> + // Save original PCI attributes >> + Status = PciIo->Attributes ( >> + PciIo, >> + EfiPciIoAttributeOperationGet, >> + 0, >> + &Private->OriginalPciAttributes >> + ); >> + if (EFI_ERROR (Status)) { >> + goto Done; >> + } > > Good to me. > >> + >> + DEBUG (( >> + EFI_D_INFO, >> + "PCI Attributes = 0x%llx\n", > > How about using "Original PCI Attributes = 0x%llx\n"? > [SAMI] I will submit a patch with this fixed. > >> + Private->OriginalPciAttributes >> + )); >> + >> + if ((Private->OriginalPciAttributes & EFI_PCI_IO_ATTRIBUTE_MEMORY) == 0) { >> + Status = PciIo->Attributes ( >> + PciIo, >> + EfiPciIoAttributeOperationSupported, >> + 0, >> + &PciAttributes >> + ); >> + if (EFI_ERROR (Status)) { >> + goto Done; >> + } >> + >> + DEBUG ((EFI_D_INFO, "Supported PCI Attributes = 0x%llx\n", >> + PciAttributes)); >> + >> + if ((PciAttributes & EFI_PCI_IO_ATTRIBUTE_MEMORY) == 0) { >> + DEBUG (( >> + EFI_D_ERROR, >> + "Error: EFI_PCI_IO_ATTRIBUTE_MEMORY not supported\n" >> + )); >> + Status = EFI_UNSUPPORTED; >> + goto Done; >> + } >> + >> + PciAttributes = Private->OriginalPciAttributes | >> + EFI_PCI_IO_ATTRIBUTE_MEMORY; >> + >> + DEBUG ((EFI_D_INFO, "Enable PCI Attributes = 0x%llx\n", PciAttributes)); >> + Status = PciIo->Attributes ( >> + PciIo, >> + EfiPciIoAttributeOperationEnable, >> + PciAttributes, >> + NULL >> + ); >> + if (EFI_ERROR (Status)) { >> + goto Done; >> + } > > It is the case for enabling memory space, but there may be case to need IO > space enabling. I suggest to use the code block (same with other device > drivers). > > Status = PciIo->Attributes ( > PciIo, > EfiPciIoAttributeOperationSupported, > 0, > &Supports > ); > if (!EFI_ERROR (Status)) { > Supports &= (UINT64)EFI_PCI_DEVICE_ENABLE; > Status = PciIo->Attributes ( > PciIo, > EfiPciIoAttributeOperationEnable, > Supports, > NULL > ); > } > > [SAMI] This SATA Controller driver only uses the PCI BAR5 register space > which is the AHCI Base Address (ABAR). According to the 'Serial ATA Advanced > Host Controller Interface (AHCI) 1.3.1' specification, section 2.1.11, 'This > register allocates space for the HBA memory registers'. > The section 2.1.10, allows provision for Optional BARs which may support > either memory or I/O spaces. However, in the context of the current SATA > controller driver, which only ever access the ABAR, enabling I/O memory space > is not required. Yes, I did know AHCI has ABAR with memory space. But this SATA Controller driver also supports IDE mode that uses IO space. So I suggested to handle them both. The attributes has been reflected in Supports, the code can naturally enable the supported attributes. > >> + Private->PciAttributesChanged = TRUE; } >> >> Status = PciIo->Pci.Read ( >> PciIo, >> @@ -414,7 +471,10 @@ SataControllerStart ( >> sizeof (PciData.Hdr.ClassCode), >> PciData.Hdr.ClassCode >> ); >> - ASSERT_EFI_ERROR (Status); >> + if (EFI_ERROR (Status)) { >> + ASSERT (FALSE); >> + goto Done; >> + } >> >> if (IS_PCI_IDE (&PciData)) { >> Private->IdeInit.ChannelCount = IDE_MAX_CHANNEL; @@ -481,6 >> +541,15 @@ Done: >> if (Private->IdentifyValid != NULL) { >> FreePool (Private->IdentifyValid); >> } >> + if (Private->PciAttributesChanged) { >> + // Restore original PCI attributes > > Prefer to use > > // > // Restore original PCI attributes > // > > [SAMI] Doing this would violate the edk2 coding standard. See EDK2 Coding > Standard Specification, revision 2.20, section 6.2.3. Before we have clear direction about this to align code and CCS spec. I prefer to align with the surrounding code to use below style. // // xxxxx // > >> + PciIo->Attributes ( >> + PciIo, >> + EfiPciIoAttributeOperationSet, >> + Private->OriginalPciAttributes, >> + NULL >> + ); >> + } >> FreePool (Private); >> } >> } >> @@ -556,6 +625,15 @@ SataControllerStop ( >> if (Private->IdentifyValid != NULL) { >> FreePool (Private->IdentifyValid); >> } >> + if (Private->PciAttributesChanged) { >> + // Restore original PCI attributes > Prefer to use > > // > // Restore original PCI attributes > // > > [SAMI] Doing this would violate the edk2 coding standard. See EDK2 Coding > Standard Specification, revision 2.20, section 6.2.3. Same with above. > >> + Private->PciIo->Attributes ( >> + Private->PciIo, >> + EfiPciIoAttributeOperationSet, >> + Private->OriginalPciAttributes, >> + NULL >> + ); >> + } >> FreePool (Private); >> } >> >> diff --git a/MdeModulePkg/Bus/Pci/SataControllerDxe/SataController.h >> b/MdeModulePkg/Bus/Pci/SataControllerDxe/SataController.h >> index >> f7db3b832a14c0c8314518cfdf4198c7a4e8ef25..cb82b55763a077f5994c4a00ea4 >> 8 >> 93bfa2e07a79 100644 >> --- a/MdeModulePkg/Bus/Pci/SataControllerDxe/SataController.h >> +++ b/MdeModulePkg/Bus/Pci/SataControllerDxe/SataController.h >> @@ -2,6 +2,7 @@ >> Header file for Sata Controller driver. >> >> Copyright (c) 2011 - 2016, Intel Corporation. All rights >> reserved.<BR> >> + Copyright (c) 2017, ARM Ltd. All rights reserved.<BR> >> This program and the accompanying materials >> are licensed and made available under the terms and conditions of the >> BSD License >> which accompanies this distribution. The full text of the >> license may be found at @@ -104,6 +105,12 @@ typedef struct >> _EFI_SATA_CONTROLLER_PRIVATE_DATA { >> // >> EFI_IDENTIFY_DATA *IdentifyData; >> BOOLEAN *IdentifyValid; >> + >> + /// Track the state so that the PCI attributes that were modified >> + /// can be restored to the original value later > > Prefer to use > > // > // Track the state so that the PCI attributes that were modified // > can be restored to the original value later // > > to align with others. > [SAMI] Doing this would violate the edk2 coding standard. See EDK2 Coding > Standard Specification, revision 2.20, section 6.2.3. > Also '///' is used for documenting structure members. See EDK2 > Coding Standard Specification, revision 2.20, section 6.9. > I will submit an updated patch with '.' at the end to indicate > where the comment block ends. I was not saying using '///' is wrong here. As I know, '///' are mainly used in *public* header files. For this case, I prefer to align with the surrounding code to use below style. // // xxxxx // > >> + BOOLEAN PciAttributesChanged; >> + /// Copy of the original PCI Attributes > > Prefer to use > > // > // Copy of the original PCI Attributes // > > to align with others. > [SAMI] This would violate the edk2 coding standard. See EDK2 Coding Standard > Specification, revision 2.20, section 6.2.3. Same with above. Thanks, Star > >> + UINT64 OriginalPciAttributes; >> } EFI_SATA_CONTROLLER_PRIVATE_DATA; >> >> #define SATA_CONTROLLER_PRIVATE_DATA_FROM_THIS(a) CR(a, >> EFI_SATA_CONTROLLER_PRIVATE_DATA, IdeInit, SATA_CONTROLLER_SIGNATURE) >> _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel