Dummy implementation of Legacy Region 2 Protocol.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9483 6f19259b-4bc3-4df7-8a09-765794883524
diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc
index e767387..be9392b 100644
--- a/MdeModulePkg/MdeModulePkg.dsc
+++ b/MdeModulePkg/MdeModulePkg.dsc
@@ -320,6 +320,7 @@
   MdeModulePkg/Universal/Acpi/AcpiPlatformDxe/AcpiPlatformDxe.inf

   MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf

   MdeModulePkg/Universal/HiiResourcesSampleDxe/HiiResourcesSampleDxe.inf

+  MdeModulePkg/Universal/LegacyRegion2Dxe/LegacyRegion2Dxe.inf

 

 [Components.IA32, Components.X64]

   MdeModulePkg/Universal/DebugSupportDxe/DebugSupportDxe.inf

diff --git a/MdeModulePkg/Universal/LegacyRegion2Dxe/LegacyRegion2.c b/MdeModulePkg/Universal/LegacyRegion2Dxe/LegacyRegion2.c
new file mode 100644
index 0000000..80de38c
--- /dev/null
+++ b/MdeModulePkg/Universal/LegacyRegion2Dxe/LegacyRegion2.c
@@ -0,0 +1,249 @@
+/** @file

+  Dummy implementation of Legacy Region 2 Protocol.

+

+  This generic implementation of the Legacy Region 2 Protocol does not actually 

+  perform any lock/unlock operations.  This module may be used on platforms 

+  that do not provide HW locking of the legacy memory regions.  It can also 

+  be used as a template driver for implementing the Legacy Region 2 Protocol on

+  a platform that does support HW locking of the legacy memory regions.

+

+Copyright (c) 2009, Intel Corporation

+All rights reserved. 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

+http://opensource.org/licenses/bsd-license.php

+

+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,

+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

+

+**/

+

+#include <LegacyRegion2.h>

+

+EFI_HANDLE   mLegacyRegion2Handle = NULL;

+

+EFI_LEGACY_REGION2_PROTOCOL  mLegacyRegion2 = {

+  LegacyRegion2Decode,

+  LegacyRegion2Lock,

+  LegacyRegion2BootLock,

+  LegacyRegion2Unlock,

+  LegacyRegionGetInfo

+};

+

+/**

+  Modify the hardware to allow (decode) or disallow (not decode) memory reads in a region.

+

+  If the On parameter evaluates to TRUE, this function enables memory reads in the address range 

+  Start to (Start + Length - 1).

+  If the On parameter evaluates to FALSE, this function disables memory reads in the address range 

+  Start to (Start + Length - 1).

+

+  @param  This[in]              Indicates the EFI_LEGACY_REGION_PROTOCOL instance.

+  @param  Start[in]             The beginning of the physical address of the region whose attributes

+                                should be modified.

+  @param  Length[in]            The number of bytes of memory whose attributes should be modified.

+                                The actual number of bytes modified may be greater than the number

+                                specified.

+  @param  Granularity[out]      The number of bytes in the last region affected. This may be less

+                                than the total number of bytes affected if the starting address

+                                was not aligned to a region's starting address or if the length

+                                was greater than the number of bytes in the first region.

+  @param  On[in]                Decode / Non-Decode flag.

+

+  @retval EFI_SUCCESS           The region's attributes were successfully modified.

+  @retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region.

+

+**/

+EFI_STATUS

+EFIAPI

+LegacyRegion2Decode (

+  IN  EFI_LEGACY_REGION2_PROTOCOL  *This,

+  IN  UINT32                       Start,

+  IN  UINT32                       Length,

+  OUT UINT32                       *Granularity,

+  IN  BOOLEAN                      *On

+  )

+{

+  ASSERT (Granularity != NULL);

+  *Granularity = 0;

+  return EFI_SUCCESS;

+}

+

+/**

+  Modify the hardware to disallow memory writes in a region.

+

+  This function changes the attributes of a memory range to not allow writes.

+

+  @param  This[in]              Indicates the EFI_LEGACY_REGION_PROTOCOL instance.

+  @param  Start[in]             The beginning of the physical address of the region whose

+                                attributes should be modified.

+  @param  Length[in]            The number of bytes of memory whose attributes should be modified.

+                                The actual number of bytes modified may be greater than the number

+                                specified.

+  @param  Granularity[out]      The number of bytes in the last region affected. This may be less

+                                than the total number of bytes affected if the starting address was

+                                not aligned to a region's starting address or if the length was

+                                greater than the number of bytes in the first region.

+

+  @retval EFI_SUCCESS           The region's attributes were successfully modified.

+  @retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region.

+

+**/

+EFI_STATUS

+EFIAPI

+LegacyRegion2Lock (

+  IN  EFI_LEGACY_REGION2_PROTOCOL *This,

+  IN  UINT32                      Start,

+  IN  UINT32                      Length,

+  OUT UINT32                      *Granularity

+  )

+{

+  ASSERT (Granularity != NULL);

+  *Granularity = 0;

+  return EFI_SUCCESS;

+}

+

+/**

+  Modify the hardware to disallow memory attribute changes in a region.

+

+  This function makes the attributes of a region read only. Once a region is boot-locked with this 

+  function, the read and write attributes of that region cannot be changed until a power cycle has

+  reset the boot-lock attribute. Calls to Decode(), Lock() and Unlock() will have no effect.

+

+  @param  This[in]              Indicates the EFI_LEGACY_REGION_PROTOCOL instance.

+  @param  Start[in]             The beginning of the physical address of the region whose

+                                attributes should be modified.

+  @param  Length[in]            The number of bytes of memory whose attributes should be modified.

+                                The actual number of bytes modified may be greater than the number

+                                specified.

+  @param  Granularity[out]      The number of bytes in the last region affected. This may be less

+                                than the total number of bytes affected if the starting address was

+                                not aligned to a region's starting address or if the length was

+                                greater than the number of bytes in the first region.

+

+  @retval EFI_SUCCESS           The region's attributes were successfully modified.

+  @retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region.

+  @retval EFI_UNSUPPORTED       The chipset does not support locking the configuration registers in

+                                a way that will not affect memory regions outside the legacy memory

+                                region.

+

+**/

+EFI_STATUS

+EFIAPI

+LegacyRegion2BootLock (

+  IN  EFI_LEGACY_REGION2_PROTOCOL         *This,

+  IN  UINT32                              Start,

+  IN  UINT32                              Length,

+  OUT UINT32                              *Granularity

+  )

+{

+  ASSERT (Granularity != NULL);

+  *Granularity = 0;

+  return EFI_SUCCESS;

+}

+

+/**

+  Modify the hardware to allow memory writes in a region.

+

+  This function changes the attributes of a memory range to allow writes.  

+

+  @param  This[in]              Indicates the EFI_LEGACY_REGION_PROTOCOL instance.

+  @param  Start[in]             The beginning of the physical address of the region whose

+                                attributes should be modified.

+  @param  Length[in]            The number of bytes of memory whose attributes should be modified.

+                                The actual number of bytes modified may be greater than the number

+                                specified.

+  @param  Granularity[out]      The number of bytes in the last region affected. This may be less

+                                than the total number of bytes affected if the starting address was

+                                not aligned to a region's starting address or if the length was

+                                greater than the number of bytes in the first region.

+

+  @retval EFI_SUCCESS           The region's attributes were successfully modified.

+  @retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region.

+

+**/

+EFI_STATUS

+EFIAPI

+LegacyRegion2Unlock (

+  IN  EFI_LEGACY_REGION2_PROTOCOL  *This,

+  IN  UINT32                       Start,

+  IN  UINT32                       Length,

+  OUT UINT32                       *Granularity

+  )

+{

+  ASSERT (Granularity != NULL);

+  *Granularity = 0;

+  return EFI_SUCCESS;

+}

+

+/**

+  Get region information for the attributes of the Legacy Region.

+

+  This function is used to discover the granularity of the attributes for the memory in the legacy 

+  region. Each attribute may have a different granularity and the granularity may not be the same

+  for all memory ranges in the legacy region.  

+

+  @param  This[in]              Indicates the EFI_LEGACY_REGION_PROTOCOL instance.

+  @param  DescriptorCount[out]  The number of region descriptor entries returned in the Descriptor

+                                buffer.

+  @param  Descriptor[out]       A pointer to a pointer used to return a buffer where the legacy

+                                region information is deposited. This buffer will contain a list of

+                                DescriptorCount number of region descriptors.  This function will

+                                provide the memory for the buffer.

+

+  @retval EFI_SUCCESS           The region's attributes were successfully modified.

+  @retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region.

+

+**/

+EFI_STATUS

+EFIAPI

+LegacyRegionGetInfo (

+  IN  EFI_LEGACY_REGION2_PROTOCOL   *This,

+  OUT UINT32                        *DescriptorCount,

+  OUT EFI_LEGACY_REGION_DESCRIPTOR  **Descriptor

+  )

+{

+  ASSERT (DescriptorCount != NULL);

+  ASSERT (Descriptor != NULL);

+

+  *DescriptorCount = 0;

+  *Descriptor      = NULL;

+

+  return EFI_SUCCESS;

+}

+

+/**

+  The user Entry Point for module LegacyRegionDxe.  The user code starts with this function.

+

+  @param[in] ImageHandle    The firmware allocated handle for the EFI image.  

+  @param[in] SystemTable    A pointer to the EFI System Table.

+  

+  @retval EFI_SUCCESS       The entry point is executed successfully.

+

+**/

+EFI_STATUS

+EFIAPI

+LegacyRegion2Install (

+  IN EFI_HANDLE        ImageHandle,

+  IN EFI_SYSTEM_TABLE  *SystemTable

+  )

+{

+  EFI_STATUS  Status;

+  

+  //

+  // Make sure the Legacy Region 2 Protocol is not already installed in the system

+  //

+  ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiLegacyRegion2ProtocolGuid);

+  

+  //

+  // Install the protocol on a new handle.

+  //

+  Status = gBS->InstallMultipleProtocolInterfaces (

+                  &mLegacyRegion2Handle,

+                  &gEfiLegacyRegion2ProtocolGuid, &mLegacyRegion2,

+                  NULL

+                  );

+  ASSERT_EFI_ERROR (Status);

+

+  return EFI_SUCCESS;

+}

diff --git a/MdeModulePkg/Universal/LegacyRegion2Dxe/LegacyRegion2.h b/MdeModulePkg/Universal/LegacyRegion2Dxe/LegacyRegion2.h
new file mode 100644
index 0000000..ceded3b
--- /dev/null
+++ b/MdeModulePkg/Universal/LegacyRegion2Dxe/LegacyRegion2.h
@@ -0,0 +1,175 @@
+/** @file

+  Internal include file for the dummy Legacy Region 2 Protocol implementation.

+

+Copyright (c) 2009, Intel Corporation

+All rights reserved. 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

+http://opensource.org/licenses/bsd-license.php

+

+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,

+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

+

+**/

+

+#ifndef __DUMMY_LEGACY_REGION2_H__

+#define __DUMMY_LEGACY_REGION2_H__

+

+#include <Protocol/LegacyRegion2.h>

+#include <Library/DebugLib.h>

+#include <Library/UefiBootServicesTableLib.h>

+

+/**

+  Modify the hardware to allow (decode) or disallow (not decode) memory reads in a region.

+

+  If the On parameter evaluates to TRUE, this function enables memory reads in the address range 

+  Start to (Start + Length - 1).

+  If the On parameter evaluates to FALSE, this function disables memory reads in the address range 

+  Start to (Start + Length - 1).

+

+  @param  This[in]              Indicates the EFI_LEGACY_REGION_PROTOCOL instance.

+  @param  Start[in]             The beginning of the physical address of the region whose attributes

+                                should be modified.

+  @param  Length[in]            The number of bytes of memory whose attributes should be modified.

+                                The actual number of bytes modified may be greater than the number

+                                specified.

+  @param  Granularity[out]      The number of bytes in the last region affected. This may be less

+                                than the total number of bytes affected if the starting address

+                                was not aligned to a region's starting address or if the length

+                                was greater than the number of bytes in the first region.

+  @param  On[in]                Decode / Non-Decode flag.

+

+  @retval EFI_SUCCESS           The region's attributes were successfully modified.

+  @retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region.

+

+**/

+EFI_STATUS

+EFIAPI

+LegacyRegion2Decode (

+  IN  EFI_LEGACY_REGION2_PROTOCOL  *This,

+  IN  UINT32                       Start,

+  IN  UINT32                       Length,

+  OUT UINT32                       *Granularity,

+  IN  BOOLEAN                      *On

+  );

+

+/**

+  Modify the hardware to disallow memory writes in a region.

+

+  This function changes the attributes of a memory range to not allow writes.

+

+  @param  This[in]              Indicates the EFI_LEGACY_REGION_PROTOCOL instance.

+  @param  Start[in]             The beginning of the physical address of the region whose

+                                attributes should be modified.

+  @param  Length[in]            The number of bytes of memory whose attributes should be modified.

+                                The actual number of bytes modified may be greater than the number

+                                specified.

+  @param  Granularity[out]      The number of bytes in the last region affected. This may be less

+                                than the total number of bytes affected if the starting address was

+                                not aligned to a region's starting address or if the length was

+                                greater than the number of bytes in the first region.

+

+  @retval EFI_SUCCESS           The region's attributes were successfully modified.

+  @retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region.

+

+**/

+EFI_STATUS

+EFIAPI

+LegacyRegion2Lock (

+  IN  EFI_LEGACY_REGION2_PROTOCOL *This,

+  IN  UINT32                      Start,

+  IN  UINT32                      Length,

+  OUT UINT32                      *Granularity

+  );

+

+/**

+  Modify the hardware to disallow memory attribute changes in a region.

+

+  This function makes the attributes of a region read only. Once a region is boot-locked with this 

+  function, the read and write attributes of that region cannot be changed until a power cycle has

+  reset the boot-lock attribute. Calls to Decode(), Lock() and Unlock() will have no effect.

+

+  @param  This[in]              Indicates the EFI_LEGACY_REGION_PROTOCOL instance.

+  @param  Start[in]             The beginning of the physical address of the region whose

+                                attributes should be modified.

+  @param  Length[in]            The number of bytes of memory whose attributes should be modified.

+                                The actual number of bytes modified may be greater than the number

+                                specified.

+  @param  Granularity[out]      The number of bytes in the last region affected. This may be less

+                                than the total number of bytes affected if the starting address was

+                                not aligned to a region's starting address or if the length was

+                                greater than the number of bytes in the first region.

+

+  @retval EFI_SUCCESS           The region's attributes were successfully modified.

+  @retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region.

+  @retval EFI_UNSUPPORTED       The chipset does not support locking the configuration registers in

+                                a way that will not affect memory regions outside the legacy memory

+                                region.

+

+**/

+EFI_STATUS

+EFIAPI

+LegacyRegion2BootLock (

+  IN EFI_LEGACY_REGION2_PROTOCOL          *This,

+  IN  UINT32                              Start,

+  IN  UINT32                              Length,

+  OUT UINT32                              *Granularity

+  );

+

+/**

+  Modify the hardware to allow memory writes in a region.

+

+  This function changes the attributes of a memory range to allow writes.  

+

+  @param  This[in]              Indicates the EFI_LEGACY_REGION_PROTOCOL instance.

+  @param  Start[in]             The beginning of the physical address of the region whose

+                                attributes should be modified.

+  @param  Length[in]            The number of bytes of memory whose attributes should be modified.

+                                The actual number of bytes modified may be greater than the number

+                                specified.

+  @param  Granularity[out]      The number of bytes in the last region affected. This may be less

+                                than the total number of bytes affected if the starting address was

+                                not aligned to a region's starting address or if the length was

+                                greater than the number of bytes in the first region.

+

+  @retval EFI_SUCCESS           The region's attributes were successfully modified.

+  @retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region.

+

+**/

+EFI_STATUS

+EFIAPI

+LegacyRegion2Unlock (

+  IN  EFI_LEGACY_REGION2_PROTOCOL  *This,

+  IN  UINT32                       Start,

+  IN  UINT32                       Length,

+  OUT UINT32                       *Granularity

+  );

+

+/**

+  Get region information for the attributes of the Legacy Region.

+

+  This function is used to discover the granularity of the attributes for the memory in the legacy 

+  region. Each attribute may have a different granularity and the granularity may not be the same

+  for all memory ranges in the legacy region.  

+

+  @param  This[in]              Indicates the EFI_LEGACY_REGION_PROTOCOL instance.

+  @param  DescriptorCount[out]  The number of region descriptor entries returned in the Descriptor

+                                buffer.

+  @param  Descriptor[out]       A pointer to a pointer used to return a buffer where the legacy

+                                region information is deposited. This buffer will contain a list of

+                                DescriptorCount number of region descriptors.  This function will

+                                provide the memory for the buffer.

+

+  @retval EFI_SUCCESS           The region's attributes were successfully modified.

+  @retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region.

+

+**/

+EFI_STATUS

+EFIAPI

+LegacyRegionGetInfo (

+  IN  EFI_LEGACY_REGION2_PROTOCOL   *This,

+  OUT UINT32                        *DescriptorCount,

+  OUT EFI_LEGACY_REGION_DESCRIPTOR  **Descriptor

+  );

+

+#endif

diff --git a/MdeModulePkg/Universal/LegacyRegion2Dxe/LegacyRegion2Dxe.inf b/MdeModulePkg/Universal/LegacyRegion2Dxe/LegacyRegion2Dxe.inf
new file mode 100644
index 0000000..8c071fc
--- /dev/null
+++ b/MdeModulePkg/Universal/LegacyRegion2Dxe/LegacyRegion2Dxe.inf
@@ -0,0 +1,51 @@
+#/** @file

+#  Produces the Legacy Region 2 Protocol.

+#

+#  This generic implementation of the Legacy Region 2 Protocol does not actually 

+#  perform any lock/unlock operations.  This module may be used on platforms 

+#  that do not provide HW locking of the legacy memory regions.  It can also 

+#  be used as a template driver for implementing the Legacy Region 2 Protocol on

+#  a platform that does support HW locking of the legacy memory regions.

+#

+# Copyright (c) 2009, Intel Corporation

+# All rights reserved. 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

+# http://opensource.org/licenses/bsd-license.php

+#                                                                                           

+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,

+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

+#

+#**/

+

+[Defines]

+  INF_VERSION                    = 0x00010005

+  BASE_NAME                      = LegacyRegion2Dxe

+  FILE_GUID                      = EC2BEECA-E84A-445B-869B-F7A73C96F58A

+  MODULE_TYPE                    = DXE_DRIVER

+  ENTRY_POINT                    = LegacyRegion2Install

+

+#

+# The following information is for reference only and not required by the build tools.

+#

+#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC

+#

+

+[Sources]

+  LegacyRegion2.c

+  LegacyRegion2.h

+

+[Packages]

+  MdePkg/MdePkg.dec

+  MdeModulePkg/MdeModulePkg.dec

+

+[LibraryClasses]

+  UefiDriverEntryPoint

+  DebugLib

+  UefiBootServicesTableLib

+

+[Protocols]

+  gEfiLegacyRegion2ProtocolGuid                 ## PRODUCES

+

+[Depex]

+  TRUE