From: "Fan, Jeff" <jeff.fan@intel.com>
To: Laszlo Ersek <lersek@redhat.com>,
"edk2-devel@ml01.01.org" <edk2-devel@ml01.01.org>
Cc: "Yao, Jiewen" <jiewen.yao@intel.com>,
"Tian, Feng" <feng.tian@intel.com>,
"Kinney, Michael D" <michael.d.kinney@intel.com>
Subject: Re: [PATCH v2 1/2] UefiCpuPkg/CpuDxe: Copy two functions from PciHostBridge
Date: Wed, 22 Feb 2017 01:31:12 +0000 [thread overview]
Message-ID: <542CF652F8836A4AB8DBFAAD40ED192A4C542900@shsmsx102.ccr.corp.intel.com> (raw)
In-Reply-To: <736649ee-27b8-067f-fea3-bff21cd6e3c6@redhat.com>
Laszlo,
For 1), I will update this typo when pushing the serial of patches. Thanks!
For2), I will do clean up on EFI_D to DEBUG_ in CpuDxe driver after Jiewen & my patches pushed.
Thanks!
Jeff
-----Original Message-----
From: Laszlo Ersek [mailto:lersek@redhat.com]
Sent: Tuesday, February 21, 2017 6:57 PM
To: Fan, Jeff; edk2-devel@ml01.01.org
Cc: Yao, Jiewen; Tian, Feng; Kinney, Michael D
Subject: Re: [PATCH v2 1/2] UefiCpuPkg/CpuDxe: Copy two functions from PciHostBridge
I have two suggestions for this patch:
On 02/21/17 04:08, Jeff Fan wrote:
> Copy AddMemoryMappedIoSpace() and AddMemoryMappedIoSpace() from
> MdeModulePkg\Bus\Pci\PciHostBridgeDxe\PciHostBridge.c.
(1) One of the two "AddMemoryMappedIoSpace" strings should be replaced with "IntersectMemoryDescriptor".
This can be done when you commit / push the patch; no need to repost just because of it.
(2) This is more of a "followup" suggestion: since this is new code, I recommend that the EFI_D_ macros be replced with DEBUG_ macros.
However, I see value in keeping the first patch as a pristine copy from the PciHostBridgeDxe driver, so I don't recommend doing the above change in patch #1. I think it can be patch #3, or a completely separate patch (later).
Series
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Regression-tested-by: Laszlo Ersek <lersek@redhat.com>
Thanks!
Laszlo
>
> https://bugzilla.tianocore.org/show_bug.cgi?id=390
>
> Cc: Laszlo Ersek <lersek@redhat.com>
> Cc: Jiewen Yao <jiewen.yao@intel.com>
> Cc: Feng Tian <feng.tian@intel.com>
> Cc: Michael D Kinney <michael.d.kinney@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Jeff Fan <jeff.fan@intel.com>
> ---
> UefiCpuPkg/CpuDxe/CpuDxe.c | 148
> +++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 148 insertions(+)
>
> diff --git a/UefiCpuPkg/CpuDxe/CpuDxe.c b/UefiCpuPkg/CpuDxe/CpuDxe.c
> index 9fb6d76..925c50f 100644
> --- a/UefiCpuPkg/CpuDxe/CpuDxe.c
> +++ b/UefiCpuPkg/CpuDxe/CpuDxe.c
> @@ -887,6 +887,154 @@ IdleLoopEventCallback (
> CpuSleep ();
> }
>
> +/**
> + Ensure the compatibility of a memory space descriptor with the MMIO aperture.
> +
> + The memory space descriptor can come from the GCD memory space map,
> + or it can represent a gap between two neighboring memory space
> + descriptors. In the latter case, the GcdMemoryType field is
> + expected to be EfiGcdMemoryTypeNonExistent.
> +
> + If the memory space descriptor already has type
> + EfiGcdMemoryTypeMemoryMappedIo, and its capabilities are a superset
> + of the required capabilities, then no action is taken -- it is by
> + definition compatible with the aperture.
> +
> + Otherwise, the intersection of the memory space descriptor is
> + calculated with the aperture. If the intersection is the empty set
> + (no overlap), no action is taken; the memory space descriptor is compatible with the aperture.
> +
> + Otherwise, the type of the descriptor is investigated again. If the
> + type is EfiGcdMemoryTypeNonExistent (representing a gap, or a
> + genuine descriptor with such a type), then an attempt is made to
> + add the intersection as MMIO space to the GCD memory space map,
> + with the specified capabilities. This ensures continuity for the
> + aperture, and the descriptor is deemed compatible with the aperture.
> +
> + Otherwise, the memory space descriptor is incompatible with the
> + MMIO aperture.
> +
> + @param[in] Base Base address of the aperture.
> + @param[in] Length Length of the aperture.
> + @param[in] Capabilities Capabilities required by the aperture.
> + @param[in] Descriptor The descriptor to ensure compatibility with the
> + aperture for.
> +
> + @retval EFI_SUCCESS The descriptor is compatible. The GCD memory
> + space map may have been updated, for
> + continuity within the aperture.
> + @retval EFI_INVALID_PARAMETER The descriptor is incompatible.
> + @return Error codes from gDS->AddMemorySpace().
> +**/
> +EFI_STATUS
> +IntersectMemoryDescriptor (
> + IN UINT64 Base,
> + IN UINT64 Length,
> + IN UINT64 Capabilities,
> + IN CONST EFI_GCD_MEMORY_SPACE_DESCRIPTOR *Descriptor
> + )
> +{
> + UINT64 IntersectionBase;
> + UINT64 IntersectionEnd;
> + EFI_STATUS Status;
> +
> + if (Descriptor->GcdMemoryType == EfiGcdMemoryTypeMemoryMappedIo &&
> + (Descriptor->Capabilities & Capabilities) == Capabilities) {
> + return EFI_SUCCESS;
> + }
> +
> + IntersectionBase = MAX (Base, Descriptor->BaseAddress);
> + IntersectionEnd = MIN (Base + Length,
> + Descriptor->BaseAddress + Descriptor->Length);
> + if (IntersectionBase >= IntersectionEnd) {
> + //
> + // The descriptor and the aperture don't overlap.
> + //
> + return EFI_SUCCESS;
> + }
> +
> + if (Descriptor->GcdMemoryType == EfiGcdMemoryTypeNonExistent) {
> + Status = gDS->AddMemorySpace (EfiGcdMemoryTypeMemoryMappedIo,
> + IntersectionBase, IntersectionEnd - IntersectionBase,
> + Capabilities);
> +
> + DEBUG ((EFI_ERROR (Status) ? EFI_D_ERROR : EFI_D_VERBOSE,
> + "%a: %a: add [%Lx, %Lx): %r\n", gEfiCallerBaseName, __FUNCTION__,
> + IntersectionBase, IntersectionEnd, Status));
> + return Status;
> + }
> +
> + DEBUG ((EFI_D_ERROR, "%a: %a: desc [%Lx, %Lx) type %u cap %Lx conflicts "
> + "with aperture [%Lx, %Lx) cap %Lx\n", gEfiCallerBaseName, __FUNCTION__,
> + Descriptor->BaseAddress, Descriptor->BaseAddress + Descriptor->Length,
> + (UINT32)Descriptor->GcdMemoryType, Descriptor->Capabilities,
> + Base, Base + Length, Capabilities));
> + return EFI_INVALID_PARAMETER;
> +}
> +
> +/**
> + Add MMIO space to GCD.
> + The routine checks the GCD database and only adds those which are
> + not added in the specified range to GCD.
> +
> + @param Base Base address of the MMIO space.
> + @param Length Length of the MMIO space.
> + @param Capabilities Capabilities of the MMIO space.
> +
> + @retval EFI_SUCCES The MMIO space was added successfully.
> +**/
> +EFI_STATUS
> +AddMemoryMappedIoSpace (
> + IN UINT64 Base,
> + IN UINT64 Length,
> + IN UINT64 Capabilities
> + )
> +{
> + EFI_STATUS Status;
> + UINTN Index;
> + UINTN NumberOfDescriptors;
> + EFI_GCD_MEMORY_SPACE_DESCRIPTOR *MemorySpaceMap;
> +
> + Status = gDS->GetMemorySpaceMap (&NumberOfDescriptors,
> + &MemorySpaceMap); if (EFI_ERROR (Status)) {
> + DEBUG ((EFI_D_ERROR, "%a: %a: GetMemorySpaceMap(): %r\n",
> + gEfiCallerBaseName, __FUNCTION__, Status));
> + return Status;
> + }
> +
> + for (Index = 0; Index < NumberOfDescriptors; Index++) {
> + Status = IntersectMemoryDescriptor (Base, Length, Capabilities,
> + &MemorySpaceMap[Index]);
> + if (EFI_ERROR (Status)) {
> + goto FreeMemorySpaceMap;
> + }
> + }
> +
> + DEBUG_CODE (
> + //
> + // Make sure there are adjacent descriptors covering [Base, Base + Length).
> + // It is possible that they have not been merged; merging can be prevented
> + // by allocation and different capabilities.
> + //
> + UINT64 CheckBase;
> + EFI_STATUS CheckStatus;
> + EFI_GCD_MEMORY_SPACE_DESCRIPTOR Descriptor;
> +
> + for (CheckBase = Base;
> + CheckBase < Base + Length;
> + CheckBase = Descriptor.BaseAddress + Descriptor.Length) {
> + CheckStatus = gDS->GetMemorySpaceDescriptor (CheckBase, &Descriptor);
> + ASSERT_EFI_ERROR (CheckStatus);
> + ASSERT (Descriptor.GcdMemoryType == EfiGcdMemoryTypeMemoryMappedIo);
> + ASSERT ((Descriptor.Capabilities & Capabilities) == Capabilities);
> + }
> + );
> +
> +FreeMemorySpaceMap:
> + FreePool (MemorySpaceMap);
> +
> + return Status;
> +}
>
> /**
> Initialize the state information for the CPU Architectural Protocol.
>
next prev parent reply other threads:[~2017-02-22 1:31 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-02-21 3:08 [PATCH v2 0/2] Add Local APIC memory mapped space in GCD Jeff Fan
2017-02-21 3:08 ` [PATCH v2 1/2] UefiCpuPkg/CpuDxe: Copy two functions from PciHostBridge Jeff Fan
2017-02-21 10:57 ` Laszlo Ersek
2017-02-22 1:31 ` Fan, Jeff [this message]
2017-02-21 3:08 ` [PATCH v2 2/2] UefiCpuPkg/CpuDxe: Add Local APIC memory mapped space in GCD Jeff Fan
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=542CF652F8836A4AB8DBFAAD40ED192A4C542900@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