From: "Yao, Jiewen" <jiewen.yao@intel.com>
To: "Zeng, Star" <star.zeng@intel.com>,
"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Subject: Re: [PATCH V2 2/2] IntelSiliconPkg/VtdPeiSample: Add premem support.
Date: Fri, 27 Oct 2017 12:30:37 +0000 [thread overview]
Message-ID: <74D8A39837DF1E4DA445A8C0B3885C503AA07475@shsmsx102.ccr.corp.intel.com> (raw)
In-Reply-To: <0C09AFA07DD0434D9E2A0C6AEB0483103B9AEF1A@shsmsx102.ccr.corp.intel.com>
Good feedback. I fixed all these in V3.
Why the wrong size does not cause problem?
The reason is that the garbage data is skipped in the while loop of DRHD or RMRR structure.
Thank you
Yao Jiewen
> -----Original Message-----
> From: Zeng, Star
> Sent: Friday, October 27, 2017 4:47 PM
> To: Yao, Jiewen <jiewen.yao@intel.com>; edk2-devel@lists.01.org
> Cc: Zeng, Star <star.zeng@intel.com>
> Subject: RE: [edk2] [PATCH V2 2/2] IntelSiliconPkg/VtdPeiSample: Add premem
> support.
>
> Another comment.
>
> sizeof(MY_VTD_INFO_PPI) is used in mPlatformVTdNoIgdSample, that seems
> wrong and should be sizeof(MY_VTD_INFO_NO_IGD_PPI), right?
> Why it does not cause problem with the code.
>
>
> Thanks,
> Star
> -----Original Message-----
> From: Zeng, Star
> Sent: Friday, October 27, 2017 2:56 PM
> To: Yao, Jiewen <jiewen.yao@intel.com>; edk2-devel@lists.01.org
> Cc: Zeng, Star <star.zeng@intel.com>
> Subject: RE: [edk2] [PATCH V2 2/2] IntelSiliconPkg/VtdPeiSample: Add premem
> support.
>
> Could you update the function comments of InitDmar() and
> SiliconInitializedPpiNotifyCallback()?
> There are two lines of " DEBUG ((DEBUG_INFO, "MchBar - %x\n", MchBar)) " in
> InitDmar(), are they added on purpose?
>
> Thanks,
> Star
> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Jiewen
> Yao
> Sent: Friday, October 27, 2017 1:41 PM
> To: edk2-devel@lists.01.org
> Cc: Zeng, Star <star.zeng@intel.com>
> Subject: [edk2] [PATCH V2 2/2] IntelSiliconPkg/VtdPeiSample: Add premem
> support.
>
> Before memory is ready, this sample produces one VTd engine.
> After memory and silicon is initialized, this sample produces both IGD VTd engine
> and all-rest VTd engine by reinstall the FV_INFO_PPI.
>
> This update is to demonstrate how to support pre-mem VTd usage.
>
> Cc: Star Zeng <star.zeng@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Jiewen Yao <jiewen.yao@intel.com>
> ---
>
> IntelSiliconPkg/Feature/VTd/PlatformVTdInfoSamplePei/PlatformVTdInfoSample
> Pei.c | 234 +++++++++++++++++---
>
> IntelSiliconPkg/Feature/VTd/PlatformVTdInfoSamplePei/PlatformVTdInfoSample
> Pei.inf | 2 +-
> 2 files changed, 202 insertions(+), 34 deletions(-)
>
> diff --git
> a/IntelSiliconPkg/Feature/VTd/PlatformVTdInfoSamplePei/PlatformVTdInfoSam
> plePei.c
> b/IntelSiliconPkg/Feature/VTd/PlatformVTdInfoSamplePei/PlatformVTdInfoSam
> plePei.c
> index 6267da7..921daef 100644
> ---
> a/IntelSiliconPkg/Feature/VTd/PlatformVTdInfoSamplePei/PlatformVTdInfoSam
> plePei.c
> +++ b/IntelSiliconPkg/Feature/VTd/PlatformVTdInfoSamplePei/PlatformVTdIn
> +++ foSamplePei.c
> @@ -20,6 +20,7 @@
> #include <Library/DebugLib.h>
> #include <Library/PciLib.h>
> #include <Library/IoLib.h>
> +#include <Library/MemoryAllocationLib.h>
>
> #define R_SA_MCHBAR (0x48)
> #define R_SA_GGC (0x50)
> @@ -33,6 +34,8 @@
> #define R_SA_MCHBAR_VTD1_OFFSET 0x5400 ///< HW UNIT for IGD
> #define R_SA_MCHBAR_VTD2_OFFSET 0x5410 ///< HW UNIT for all other -
> PEG, USB, SATA etc
>
> +EFI_GUID gEdkiiSiliconInitializedPpiGuid = {0x82a72dc8, 0x61ec, 0x403e,
> +{0xb1, 0x5a, 0x8d, 0x7a, 0x3a, 0x71, 0x84, 0x98}};
> +
> typedef struct {
> EFI_ACPI_DMAR_HEADER DmarHeader;
> //
> @@ -131,50 +134,190 @@ EFI_PEI_PPI_DESCRIPTOR
> mPlatformVTdInfoSampleDesc = {
> &mPlatformVTdSample
> };
>
> +typedef struct {
> + EFI_ACPI_DMAR_HEADER DmarHeader;
> + //
> + // VTd engine 2 - all rest
> + //
> + EFI_ACPI_DMAR_DRHD_HEADER Drhd2;
> +} MY_VTD_INFO_NO_IGD_PPI;
> +
> +MY_VTD_INFO_NO_IGD_PPI mPlatformVTdNoIgdSample = {
> + { // DmarHeader
> + { // Header
> + EFI_ACPI_4_0_DMA_REMAPPING_TABLE_SIGNATURE,
> + sizeof(MY_VTD_INFO_PPI),
> + EFI_ACPI_DMAR_REVISION,
> + },
> + 0x26, // HostAddressWidth
> + },
> +
> + { // Drhd2
> + { // Header
> + EFI_ACPI_DMAR_TYPE_DRHD,
> + sizeof(EFI_ACPI_DMAR_DRHD_HEADER)
> + },
> + EFI_ACPI_DMAR_DRHD_FLAGS_INCLUDE_PCI_ALL, // Flags
> + 0, // Reserved
> + 0, // SegmentNumber
> + 0xFED91000 // RegisterBaseAddress -- TO BE PATCHED
> + },
> +};
> +
> +EFI_PEI_PPI_DESCRIPTOR mPlatformVTdNoIgdInfoSampleDesc = {
> + (EFI_PEI_PPI_DESCRIPTOR_PPI |
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
> + &gEdkiiVTdInfoPpiGuid,
> + &mPlatformVTdNoIgdSample
> +};
> +
> /**
> Patch Graphic UMA address in RMRR and base address.
> **/
> VOID
> -PatchDmar (
> +InitDmar (
> VOID
> )
> {
> UINT32 MchBar;
> - UINT16 IgdMode;
> - UINT16 GttMode;
> - UINT32 IgdMemSize;
> - UINT32 GttMemSize;
> -
> - ///
> - /// Calculate IGD memsize
> - ///
> - IgdMode = ((PciRead16 (PCI_LIB_ADDRESS(0, 0, 0, R_SA_GGC)) &
> B_SKL_SA_GGC_GMS_MASK) >> N_SKL_SA_GGC_GMS_OFFSET) & 0xFF;
> - if (IgdMode < 0xF0) {
> - IgdMemSize = IgdMode * 32 * (1024) * (1024);
> +
> + DEBUG ((DEBUG_INFO, "InitDmar\n"));
> +
> + MchBar = PciRead32 (PCI_LIB_ADDRESS(0, 0, 0, R_SA_MCHBAR)) & ~BIT0;
> + DEBUG ((DEBUG_INFO, "MchBar - %x\n", MchBar));
> +
> + PciWrite32 (PCI_LIB_ADDRESS(0, 0, 0, R_SA_MCHBAR), 0xFED10000 |
> + BIT0); DEBUG ((DEBUG_INFO, "MchBar - %x\n", MchBar));
> +
> + DEBUG ((DEBUG_INFO, "VTd2 - %x\n", (MmioRead32 (MchBar +
> +R_SA_MCHBAR_VTD2_OFFSET) &~1)));
> + MmioWrite32 (MchBar + R_SA_MCHBAR_VTD2_OFFSET,
> +(UINT32)mPlatformVTdSample.Drhd2.RegisterBaseAddress | 1);
> + DEBUG ((DEBUG_INFO, "VTd2 - %x\n", (MmioRead32 (MchBar +
> +R_SA_MCHBAR_VTD2_OFFSET) &~1))); }
> +
> +/**
> + Patch Graphic UMA address in RMRR and base address.
> +**/
> +EFI_PEI_PPI_DESCRIPTOR *
> +PatchDmar (
> + VOID
> + )
> +{
> + UINT32 MchBar;
> + UINT16 IgdMode;
> + UINT16 GttMode;
> + UINT32 IgdMemSize;
> + UINT32 GttMemSize;
> + MY_VTD_INFO_PPI *PlatformVTdSample;
> + EFI_PEI_PPI_DESCRIPTOR *PlatformVTdInfoSampleDesc;
> + MY_VTD_INFO_NO_IGD_PPI *PlatformVTdNoIgdSample;
> + EFI_PEI_PPI_DESCRIPTOR *PlatformVTdNoIgdInfoSampleDesc;
> +
> + DEBUG ((DEBUG_INFO, "PatchDmar\n"));
> +
> + if (PciRead16 (PCI_LIB_ADDRESS(0, 2, 0, 0)) != 0xFFFF) {
> + PlatformVTdSample = AllocateCopyPool (sizeof(MY_VTD_INFO_PPI),
> &mPlatformVTdSample);
> + ASSERT(PlatformVTdSample != NULL);
> + PlatformVTdInfoSampleDesc = AllocateCopyPool
> (sizeof(EFI_PEI_PPI_DESCRIPTOR), &mPlatformVTdInfoSampleDesc);
> + ASSERT(PlatformVTdInfoSampleDesc != NULL);
> + PlatformVTdInfoSampleDesc->Ppi = PlatformVTdSample;
> +
> + ///
> + /// Calculate IGD memsize
> + ///
> + IgdMode = ((PciRead16 (PCI_LIB_ADDRESS(0, 0, 0, R_SA_GGC)) &
> B_SKL_SA_GGC_GMS_MASK) >> N_SKL_SA_GGC_GMS_OFFSET) & 0xFF;
> + if (IgdMode < 0xF0) {
> + IgdMemSize = IgdMode * 32 * (1024) * (1024);
> + } else {
> + IgdMemSize = 4 * (IgdMode - 0xF0 + 1) * (1024) * (1024);
> + }
> +
> + ///
> + /// Calculate GTT mem size
> + ///
> + GttMemSize = 0;
> + GttMode = (PciRead16 (PCI_LIB_ADDRESS(0, 0, 0, R_SA_GGC)) &
> B_SKL_SA_GGC_GGMS_MASK) >> N_SKL_SA_GGC_GGMS_OFFSET;
> + if (GttMode <= V_SKL_SA_GGC_GGMS_8MB) {
> + GttMemSize = (1 << GttMode) * (1024) * (1024);
> + }
> +
> + PlatformVTdSample->Rmrr1.ReservedMemoryRegionBaseAddress =
> (PciRead32 (PCI_LIB_ADDRESS(0, 0, 0, R_SA_TOLUD)) & ~(0x01)) - IgdMemSize -
> GttMemSize;
> + PlatformVTdSample->Rmrr1.ReservedMemoryRegionLimitAddress =
> + PlatformVTdSample->Rmrr1.ReservedMemoryRegionBaseAddress +
> IgdMemSize
> + + GttMemSize - 1;
> +
> + ///
> + /// Update DRHD structures of DmarTable
> + ///
> + MchBar = PciRead32 (PCI_LIB_ADDRESS(0, 0, 0, R_SA_MCHBAR)) & ~BIT0;
> +
> + DEBUG ((DEBUG_INFO, "VTd1 - %x\n", (MmioRead32 (MchBar +
> R_SA_MCHBAR_VTD1_OFFSET))));
> + if ((MmioRead32 (MchBar + R_SA_MCHBAR_VTD1_OFFSET) &~1) != 0) {
> + PlatformVTdSample->Drhd1.RegisterBaseAddress = (MmioRead32
> (MchBar + R_SA_MCHBAR_VTD1_OFFSET) &~1);
> + } else {
> + MmioWrite32 (MchBar + R_SA_MCHBAR_VTD1_OFFSET,
> (UINT32)PlatformVTdSample->Drhd1.RegisterBaseAddress | 1);
> + }
> +
> + DEBUG ((DEBUG_INFO, "VTd2 - %x\n", (MmioRead32 (MchBar +
> R_SA_MCHBAR_VTD2_OFFSET))));
> + if ((MmioRead32 (MchBar + R_SA_MCHBAR_VTD2_OFFSET) &~1) != 0) {
> + PlatformVTdSample->Drhd2.RegisterBaseAddress = (MmioRead32
> (MchBar + R_SA_MCHBAR_VTD2_OFFSET) &~1);
> + } else {
> + MmioWrite32 (MchBar + R_SA_MCHBAR_VTD2_OFFSET,
> (UINT32)PlatformVTdSample->Drhd2.RegisterBaseAddress | 1);
> + }
> +
> + return PlatformVTdInfoSampleDesc;
> } else {
> - IgdMemSize = 4 * (IgdMode - 0xF0 + 1) * (1024) * (1024);
> - }
> + PlatformVTdNoIgdSample = AllocateCopyPool
> (sizeof(MY_VTD_INFO_NO_IGD_PPI), &mPlatformVTdNoIgdSample);
> + ASSERT(PlatformVTdNoIgdSample != NULL);
> + PlatformVTdNoIgdInfoSampleDesc = AllocateCopyPool
> (sizeof(EFI_PEI_PPI_DESCRIPTOR), &mPlatformVTdNoIgdInfoSampleDesc);
> + ASSERT(PlatformVTdNoIgdInfoSampleDesc != NULL);
> + PlatformVTdNoIgdInfoSampleDesc->Ppi = PlatformVTdNoIgdSample;
> +
> + ///
> + /// Update DRHD structures of DmarTable
> + ///
> + MchBar = PciRead32 (PCI_LIB_ADDRESS(0, 0, 0, R_SA_MCHBAR)) & ~BIT0;
>
> - ///
> - /// Calculate GTT mem size
> - ///
> - GttMemSize = 0;
> - GttMode = (PciRead16 (PCI_LIB_ADDRESS(0, 0, 0, R_SA_GGC)) &
> B_SKL_SA_GGC_GGMS_MASK) >> N_SKL_SA_GGC_GGMS_OFFSET;
> - if (GttMode <= V_SKL_SA_GGC_GGMS_8MB) {
> - GttMemSize = (1 << GttMode) * (1024) * (1024);
> + DEBUG ((DEBUG_INFO, "VTd2 - %x\n", (MmioRead32 (MchBar +
> R_SA_MCHBAR_VTD2_OFFSET))));
> + if ((MmioRead32 (MchBar + R_SA_MCHBAR_VTD2_OFFSET) &~1) != 0) {
> + PlatformVTdNoIgdSample->Drhd2.RegisterBaseAddress = (MmioRead32
> (MchBar + R_SA_MCHBAR_VTD2_OFFSET) &~1);
> + } else {
> + MmioWrite32 (MchBar + R_SA_MCHBAR_VTD2_OFFSET,
> (UINT32)PlatformVTdNoIgdSample->Drhd2.RegisterBaseAddress | 1);
> + }
> +
> + return PlatformVTdNoIgdInfoSampleDesc;
> }
> +}
>
> - mPlatformVTdSample.Rmrr1.ReservedMemoryRegionBaseAddress =
> (PciRead32 (PCI_LIB_ADDRESS(0, 0, 0, R_SA_TOLUD)) & ~(0x01)) - IgdMemSize -
> GttMemSize;
> - mPlatformVTdSample.Rmrr1.ReservedMemoryRegionLimitAddress =
> mPlatformVTdSample.Rmrr1.ReservedMemoryRegionBaseAddress +
> IgdMemSize + GttMemSize - 1;
> +/**
> + Install Firmware Volume Hob's once there is main memory
>
> - ///
> - /// Update DRHD structures of DmarTable
> - ///
> - MchBar = PciRead32 (PCI_LIB_ADDRESS(0, 0, 0, R_SA_MCHBAR)) & ~BIT0;
> - mPlatformVTdSample.Drhd1.RegisterBaseAddress = (MmioRead32 (MchBar +
> R_SA_MCHBAR_VTD1_OFFSET) &~1);
> - mPlatformVTdSample.Drhd2.RegisterBaseAddress = (MmioRead32 (MchBar +
> R_SA_MCHBAR_VTD2_OFFSET) &~1);
> + @param[in] PeiServices General purpose services available to every
> PEIM.
> + @param[in] NotifyDescriptor Notify that this module published.
> + @param[in] Ppi PPI that was installed.
> +
> + @retval EFI_SUCCESS The function completed successfully.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SiliconInitializedPpiNotifyCallback (
> + IN CONST EFI_PEI_SERVICES **PeiServices,
> + IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor,
> + IN VOID *Ppi
> + )
> +{
> + EFI_STATUS Status;
> + EFI_PEI_PPI_DESCRIPTOR *PpiDesc;
> +
> + PpiDesc = PatchDmar ();
> +
> + Status = PeiServicesReInstallPpi (&mPlatformVTdNoIgdInfoSampleDesc,
> + PpiDesc); ASSERT_EFI_ERROR (Status); return EFI_SUCCESS;
> }
>
> +EFI_PEI_NOTIFY_DESCRIPTOR mSiliconInitializedNotifyList = {
> + (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK |
> +EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
> + &gEdkiiSiliconInitializedPpiGuid,
> + (EFI_PEIM_NOTIFY_ENTRY_POINT) SiliconInitializedPpiNotifyCallback
> +};
> +
> /**
> Platform VTd Info sample driver.
>
> @@ -190,12 +333,37 @@ PlatformVTdInfoSampleInitialize (
> IN CONST EFI_PEI_SERVICES **PeiServices
> )
> {
> - EFI_STATUS Status;
> + EFI_STATUS Status;
> + BOOLEAN SiliconInitialized;
> + VOID *SiliconInitializedPpi;
> + EFI_PEI_PPI_DESCRIPTOR *PpiDesc;
> +
> + SiliconInitialized = FALSE;
> + //
> + // Check if silicon is initialized.
> + //
> + Status = PeiServicesLocatePpi (
> + &gEdkiiSiliconInitializedPpiGuid,
> + 0,
> + NULL,
> + &SiliconInitializedPpi
> + );
> + if (!EFI_ERROR(Status)) {
> + SiliconInitialized = TRUE;
> + }
> + DEBUG ((DEBUG_INFO, "SiliconInitialized - %x\n",
> + SiliconInitialized)); if (!SiliconInitialized) {
> + Status = PeiServicesNotifyPpi (&mSiliconInitializedNotifyList);
> + InitDmar ();
>
> - PatchDmar ();
> + Status = PeiServicesInstallPpi (&mPlatformVTdNoIgdInfoSampleDesc);
> + ASSERT_EFI_ERROR (Status);
> + } else {
> + PpiDesc = PatchDmar ();
>
> - Status = PeiServicesInstallPpi (&mPlatformVTdInfoSampleDesc);
> - ASSERT_EFI_ERROR (Status);
> + Status = PeiServicesInstallPpi (PpiDesc);
> + ASSERT_EFI_ERROR (Status);
> + }
>
> return Status;
> }
> diff --git
> a/IntelSiliconPkg/Feature/VTd/PlatformVTdInfoSamplePei/PlatformVTdInfoSam
> plePei.inf
> b/IntelSiliconPkg/Feature/VTd/PlatformVTdInfoSamplePei/PlatformVTdInfoSam
> plePei.inf
> index 96adb70..a4ffe51 100644
> ---
> a/IntelSiliconPkg/Feature/VTd/PlatformVTdInfoSamplePei/PlatformVTdInfoSam
> plePei.inf
> +++ b/IntelSiliconPkg/Feature/VTd/PlatformVTdInfoSamplePei/PlatformVTdIn
> +++ foSamplePei.inf
> @@ -47,7 +47,7 @@
> gEdkiiVTdInfoPpiGuid ## PRODUCES
>
> [Depex]
> - gEfiPeiMemoryDiscoveredPpiGuid
> + gEfiPeiMasterBootModePpiGuid
>
> [UserExtensions.TianoCore."ExtraFiles"]
> PlatformVTdInfoSamplePeiExtra.uni
> --
> 2.7.4.windows.1
>
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel
prev parent reply other threads:[~2017-10-27 12:26 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-10-27 5:40 [PATCH V2 0/2] IntelSiliconPkg: Add Pre-Memory DMA protection in PEI Jiewen Yao
2017-10-27 5:40 ` [PATCH V2 1/2] IntelSiliconPkg/VtdPmrPei: Add premem support Jiewen Yao
2017-10-27 6:53 ` Zeng, Star
2017-10-27 5:40 ` [PATCH V2 2/2] IntelSiliconPkg/VtdPeiSample: " Jiewen Yao
2017-10-27 6:55 ` Zeng, Star
2017-10-27 8:47 ` Zeng, Star
2017-10-27 12:30 ` Yao, Jiewen [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=74D8A39837DF1E4DA445A8C0B3885C503AA07475@shsmsx102.ccr.corp.intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox