From b290614d493ff72fc2a4410d169314e501b7e79e Mon Sep 17 00:00:00 2001 From: vanjeff Date: Wed, 16 Jan 2008 09:04:43 +0000 Subject: Port PlatformDriOverrideDxe into R9. 1. Add one OverrideVariableGuid in MdeModulePkg 2. Add one library PlatDriOverLib used by PlatformDriOverrideDxe. 3. Add PlatformDriOverrideDxe in MdeModulePkg git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4557 6f19259b-4bc3-4df7-8a09-765794883524 --- MdeModulePkg/Include/Guid/OverrideVariable.h | 34 ++++ MdeModulePkg/Include/Library/PlatDriOverLib.h | 255 ++++++++++++++++++++++++++ 2 files changed, 289 insertions(+) create mode 100644 MdeModulePkg/Include/Guid/OverrideVariable.h create mode 100644 MdeModulePkg/Include/Library/PlatDriOverLib.h (limited to 'MdeModulePkg/Include') diff --git a/MdeModulePkg/Include/Guid/OverrideVariable.h b/MdeModulePkg/Include/Guid/OverrideVariable.h new file mode 100644 index 0000000000..673813a580 --- /dev/null +++ b/MdeModulePkg/Include/Guid/OverrideVariable.h @@ -0,0 +1,34 @@ +/*++ + +Copyright (c) 2008, 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. + +Module Name: + + OverrideVariable.h + +Abstract: + + Platform Override Variable Guid definitions + +--*/ + +#ifndef __EFI_OVERRIDE_VARIABLE_GUID_H__ +#define __EFI_OVERRIDE_VARIABLE_GUID_H__ + +// +// This guid is used for a platform driver override variable +// +#define EFI_OVERRIDE_VARIABLE_GUID \ + { 0x8e3d4ad5, 0xf762, 0x438a, { 0xa1, 0xc1, 0x5b, 0x9f, 0xe6, 0x8c, 0x6b, 0x15 }} + +extern EFI_GUID gEfiOverrideVariableGuid; + + +#endif // #ifndef __EFI_OVERRIDE_VARIABLE_GUID_H__ diff --git a/MdeModulePkg/Include/Library/PlatDriOverLib.h b/MdeModulePkg/Include/Library/PlatDriOverLib.h new file mode 100644 index 0000000000..8e6ab174d7 --- /dev/null +++ b/MdeModulePkg/Include/Library/PlatDriOverLib.h @@ -0,0 +1,255 @@ +/** @file + +Copyright (c) 2007, 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. + +Module Name: + + PlatDriOverLib.h + +Abstract: + + +**/ + +#ifndef _PLAT_DRI_OVER_LIB_H_ +#define _PLAT_DRI_OVER_LIB_H_ + +#include +#include +#include +#include + +#include + +/** + Install the Platform Driver Override Protocol, and ensure there is only one Platform Driver Override Protocol + in the system. + + @param gPlatformDriverOverride PlatformDriverOverride protocol interface which + needs to be installed + + @retval EFI_ALREADY_STARTED There has been a Platform Driver Override + Protocol in the system, cannot install it again. + @retval Other Returned by InstallProtocolInterface + +**/ +EFI_STATUS +EFIAPI +InstallPlatformDriverOverrideProtocol ( + EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL *gPlatformDriverOverride + ); + +/** + Free all the mapping database memory resource and initialize the mapping list entry + + @param MappingDataBase Mapping database list entry pointer + + @retval EFI_INVALID_PARAMETER mapping database list entry is NULL + @retval EFI_SUCCESS Free success + +**/ +EFI_STATUS +EFIAPI +FreeMappingDatabase ( + IN OUT LIST_ENTRY *MappingDataBase + ); + +/** + Read the environment variable(s) that contain the override mappings from Controller Device Path to + a set of Driver Device Paths, and create the mapping database in memory with those variable info. + VariableLayout{ + // + // NotEnd indicate whether the variable is the last one, and has no subsequent variable need to load. + // Each variable has MaximumVariableSize limitation, so we maybe need multi variables to store + // large mapping infos. + // The variable(s) name rule is PlatDriOver, PlatDriOver1, PlatDriOver2, .... + // + UINT32 NotEnd; + // + // The entry which contains the mapping that Controller Device Path to a set of Driver Device Paths + // There are often multi mapping entries in a variable. + // + UINT32 SIGNATURE; //EFI_SIGNATURE_32('p','d','o','i') + UINT32 DriverNum; + EFI_DEVICE_PATH_PROTOCOL ControllerDevicePath[]; + EFI_DEVICE_PATH_PROTOCOL DriverDevicePath[]; + EFI_DEVICE_PATH_PROTOCOL DriverDevicePath[]; + EFI_DEVICE_PATH_PROTOCOL DriverDevicePath[]; + ...... + UINT32 SIGNATURE; + UINT32 DriverNum; + EFI_DEVICE_PATH_PROTOCOL ControllerDevicePath[]; + EFI_DEVICE_PATH_PROTOCOL DriverDevicePath[]; + EFI_DEVICE_PATH_PROTOCOL DriverDevicePath[]; + EFI_DEVICE_PATH_PROTOCOL DriverDevicePath[]; + ...... + } + typedef struct _PLATFORM_OVERRIDE_ITEM{ + UINTN Signature; //EFI_SIGNATURE_32('p','d','o','i') + LIST_ENTRY Link; + UINT32 DriverInfoNum; + EFI_DEVICE_PATH_PROTOCOL *ControllerDevicePath; + LIST_ENTRY DriverInfoList; //DRIVER_IMAGE_INFO List + } PLATFORM_OVERRIDE_ITEM; + typedef struct _DRIVER_IMAGE_INFO{ + UINTN Signature; //EFI_SIGNATURE_32('p','d','i','i') + LIST_ENTRY Link; + EFI_HANDLE ImageHandle; + EFI_DEVICE_PATH_PROTOCOL *DriverImagePath; + BOOLEAN UnLoadable; + BOOLEAN UnStartable; + } DRIVER_IMAGE_INFO; + + @param MappingDataBase Mapping database list entry pointer + + @retval EFI_INVALID_PARAMETER MappingDataBase pointer is null + @retval EFI_NOT_FOUND Cannot find the 'PlatDriOver' NV variable + @retval EFI_VOLUME_CORRUPTED The found NV variable is corrupted + @retval EFI_SUCCESS Create the mapping database in memory + successfully + +**/ +EFI_STATUS +EFIAPI +InitOverridesMapping ( + OUT LIST_ENTRY *MappingDataBase + ); + +/** + Save the memory mapping database into NV environment variable(s) + + @param MappingDataBase Mapping database list entry pointer + + @retval EFI_INVALID_PARAMETER MappingDataBase pointer is null + @retval EFI_SUCCESS Save memory mapping database successfully + +**/ +EFI_STATUS +EFIAPI +SaveOverridesMapping ( + IN LIST_ENTRY *MappingDataBase + ); + +/** + Retrieves the image handle of the platform override driver for a controller in the system from the memory mapping database. + + @param This A pointer to the + EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL instance. + @param ControllerHandle The device handle of the controller to check if + a driver override exists. + @param DriverImageHandle On output, a pointer to the next driver handle. + Passing in a pointer to NULL, will return the + first driver handle for ControllerHandle. + @param MappingDataBase MappingDataBase - Mapping database list entry + pointer + @param CallerImageHandle The caller driver's image handle, for + UpdateFvFileDevicePath use. + + @retval EFI_INVALID_PARAMETER The handle specified by ControllerHandle is not + a valid handle. Or DriverImagePath is not a + device path that was returned on a previous call + to GetDriverPath(). + @retval EFI_NOT_FOUND A driver override for ControllerHandle was not + found. + @retval EFI_UNSUPPORTED The operation is not supported. + @retval EFI_SUCCESS The driver override for ControllerHandle was + returned in DriverImagePath. + +**/ +EFI_STATUS +EFIAPI +GetDriverFromMapping ( + IN EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL * This, + IN EFI_HANDLE ControllerHandle, + IN OUT EFI_HANDLE * DriverImageHandle, + IN LIST_ENTRY * MappingDataBase, + IN EFI_HANDLE CallerImageHandle + ); + +EFI_STATUS +EFIAPI +DeleteOverridesVariables ( + VOID + ); + +/** + Check mapping database whether already has the mapping info which + records the input Controller to input DriverImage. + If has, the controller's total override driver number and input DriverImage's order number is return. + + @param ControllerDevicePath The controller device path need to add a + override driver image item + @param DriverImageDevicePath The driver image device path need to be insert + @param MappingDataBase Mapping database list entry pointer + @param DriverInfoNum the controller's total override driver number + @param DriverImageNO The inserted order number + + @return EFI_INVALID_PARAMETER + @return EFI_NOT_FOUND + @return EFI_SUCCESS + +**/ +EFI_STATUS +EFIAPI +CheckMapping ( + IN EFI_DEVICE_PATH_PROTOCOL *ControllerDevicePath, + IN EFI_DEVICE_PATH_PROTOCOL *DriverImageDevicePath, + IN LIST_ENTRY * MappingDataBase, + OUT UINT32 *DriverInfoNum, + OUT UINT32 *DriverImageNO + ); + +/** + Insert a driver image as a controller's override driver into the mapping database. + The driver image's order number is indicated by DriverImageNO. + + @param ControllerDevicePath The controller device path need to add a + override driver image item + @param DriverImageDevicePath The driver image device path need to be insert + @param MappingDataBase Mapping database list entry pointer + @param DriverImageNO The inserted order number + + @return EFI_INVALID_PARAMETER + @return EFI_ALREADY_STARTED + @return EFI_SUCCESS + +**/ +EFI_STATUS +EFIAPI +InsertDriverImage ( + IN EFI_DEVICE_PATH_PROTOCOL *ControllerDevicePath, + IN EFI_DEVICE_PATH_PROTOCOL *DriverImageDevicePath, + IN LIST_ENTRY *MappingDataBase, + IN UINT32 DriverImageNO + ); + +/** + Delete a controller's override driver from the mapping database. + + @param ControllerDevicePath The controller device path need to add a + override driver image item + @param DriverImageDevicePath The driver image device path need to be insert + @param MappingDataBase Mapping database list entry pointer + @param DriverImageNO The inserted order number + + @return EFI_INVALID_PARAMETER + @return EFI_NOT_FOUND + @return EFI_SUCCESS + +**/ +EFI_STATUS +EFIAPI +DeleteDriverImage ( + IN EFI_DEVICE_PATH_PROTOCOL *ControllerDevicePath, + IN EFI_DEVICE_PATH_PROTOCOL *DriverImageDevicePath, + IN LIST_ENTRY *MappingDataBase + ); + +#endif -- cgit v1.2.3