https://bugzilla.tianocore.org/show_bug.cgi?id=1373 Replace BSD 2-Clause License with BSD+Patent License. This change is based on the following emails: https://lists.01.org/pipermail/edk2-devel/2019-February/036260.html https://lists.01.org/pipermail/edk2-devel/2018-October/030385.html RFCs with detailed process for the license change: V3: https://lists.01.org/pipermail/edk2-devel/2019-March/038116.html V2: https://lists.01.org/pipermail/edk2-devel/2019-March/037669.html V1: https://lists.01.org/pipermail/edk2-devel/2019-March/037500.html Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>
		
			
				
	
	
		
			221 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			221 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   SMBIOS Table Factory
 | |
| 
 | |
|   Copyright (c) 2017 - 2019, ARM Limited. All rights reserved.
 | |
| 
 | |
|   SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| 
 | |
|   @par Glossary:
 | |
|     - Std - Standard
 | |
| **/
 | |
| 
 | |
| #include <IndustryStandard/SmBios.h>
 | |
| #include <Library/BaseLib.h>
 | |
| #include <Library/BaseMemoryLib.h>
 | |
| #include <Library/DebugLib.h>
 | |
| 
 | |
| // Module specific include files.
 | |
| #include <SmbiosTableGenerator.h>
 | |
| #include <ConfigurationManagerObject.h>
 | |
| #include <Protocol/ConfigurationManagerProtocol.h>
 | |
| #include <Protocol/DynamicTableFactoryProtocol.h>
 | |
| 
 | |
| #include "DynamicTableFactory.h"
 | |
| 
 | |
| extern EDKII_DYNAMIC_TABLE_FACTORY_INFO TableFactoryInfo;
 | |
| 
 | |
| /** Return a pointer to the SMBIOS table generator.
 | |
| 
 | |
|   @param [in]  This         Pointer to the Dynamic Table Factory Protocol.
 | |
|   @param [in]  GeneratorId  The SMBIOS table generator ID for the
 | |
|                             requested generator.
 | |
|   @param [out] Generator    Pointer to the requested SMBIOS table
 | |
|                             generator.
 | |
| 
 | |
|   @retval EFI_SUCCESS           Success.
 | |
|   @retval EFI_INVALID_PARAMETER A parameter is invalid.
 | |
|   @retval EFI_NOT_FOUND         The requested generator is not found
 | |
|                                 in the list of registered generators.
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| GetSmbiosTableGenerator (
 | |
|   IN  CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL  * CONST This,
 | |
|   IN  CONST SMBIOS_TABLE_GENERATOR_ID                     GeneratorId,
 | |
|   OUT CONST SMBIOS_TABLE_GENERATOR               ** CONST Generator
 | |
|   )
 | |
| {
 | |
|   UINT16                             TableId;
 | |
|   EDKII_DYNAMIC_TABLE_FACTORY_INFO * FactoryInfo;
 | |
| 
 | |
|   ASSERT (This != NULL);
 | |
| 
 | |
|   FactoryInfo = This->TableFactoryInfo;
 | |
| 
 | |
|   if (Generator == NULL) {
 | |
|     DEBUG ((DEBUG_ERROR, "ERROR: Invalid Generator pointer\n"));
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   if (!IS_GENERATOR_TYPE_SMBIOS (GeneratorId)) {
 | |
|     DEBUG ((DEBUG_ERROR, "ERROR: Generator Type is not SMBIOS\n"));
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   *Generator = NULL;
 | |
|   TableId = GET_TABLE_ID (GeneratorId);
 | |
|   if (IS_GENERATOR_NAMESPACE_STD (GeneratorId)) {
 | |
|     if (TableId >= EStdSmbiosTableIdMax) {
 | |
|       ASSERT (TableId < EStdSmbiosTableIdMax);
 | |
|       return EFI_INVALID_PARAMETER;
 | |
|     }
 | |
|     if (FactoryInfo->StdSmbiosTableGeneratorList[TableId] != NULL) {
 | |
|       *Generator = FactoryInfo->StdSmbiosTableGeneratorList[TableId];
 | |
|     } else {
 | |
|       return EFI_NOT_FOUND;
 | |
|     }
 | |
|   } else {
 | |
|     if (TableId > FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators)) {
 | |
|       ASSERT (TableId <= FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators));
 | |
|       return EFI_INVALID_PARAMETER;
 | |
|     }
 | |
|     if (FactoryInfo->CustomSmbiosTableGeneratorList[TableId] != NULL) {
 | |
|       *Generator = FactoryInfo->CustomSmbiosTableGeneratorList[TableId];
 | |
|     } else {
 | |
|       return EFI_NOT_FOUND;
 | |
|     }
 | |
|   }
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| /** Register SMBIOS table factory generator.
 | |
| 
 | |
|   The SMBIOS table factory maintains a list of the Standard and OEM SMBIOS
 | |
|   table generators.
 | |
| 
 | |
|   @param [in]  Generator       Pointer to the SMBIOS table generator.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The Generator was registered
 | |
|                                 successfully.
 | |
|   @retval EFI_INVALID_PARAMETER The Generator ID is invalid or
 | |
|                                 the Generator pointer is NULL.
 | |
|   @retval EFI_ALREADY_STARTED   The Generator for the Table ID is
 | |
|                                 already registered.
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| RegisterSmbiosTableGenerator (
 | |
|   IN  CONST SMBIOS_TABLE_GENERATOR              * CONST Generator
 | |
|   )
 | |
| {
 | |
|   UINT16  TableId;
 | |
| 
 | |
|   if (Generator == NULL) {
 | |
|     DEBUG ((DEBUG_ERROR, "ERROR: SMBIOS register - Invalid Generator\n"));
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   if (!IS_GENERATOR_TYPE_SMBIOS (Generator->GeneratorID)) {
 | |
|     DEBUG ((
 | |
|       DEBUG_ERROR,
 | |
|       "ERROR: SMBIOS register - Generator" \
 | |
|       " Type is not SMBIOS\n"
 | |
|       ));
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   DEBUG ((DEBUG_INFO, "Registering %s\n", Generator->Description));
 | |
| 
 | |
|   TableId = GET_TABLE_ID (Generator->GeneratorID);
 | |
|   if (IS_GENERATOR_NAMESPACE_STD (Generator->GeneratorID)) {
 | |
|     if (TableId >= EStdSmbiosTableIdMax) {
 | |
|       ASSERT (TableId < EStdSmbiosTableIdMax);
 | |
|       return EFI_INVALID_PARAMETER;
 | |
|     }
 | |
|     if (TableFactoryInfo.StdSmbiosTableGeneratorList[TableId] == NULL) {
 | |
|       TableFactoryInfo.StdSmbiosTableGeneratorList[TableId] = Generator;
 | |
|     } else {
 | |
|       return EFI_ALREADY_STARTED;
 | |
|     }
 | |
|   } else {
 | |
|     if (TableId > FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators)) {
 | |
|       ASSERT (TableId <= FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators));
 | |
|       return EFI_INVALID_PARAMETER;
 | |
|     }
 | |
|     if (TableFactoryInfo.CustomSmbiosTableGeneratorList[TableId] == NULL) {
 | |
|       TableFactoryInfo.CustomSmbiosTableGeneratorList[TableId] = Generator;
 | |
|     } else {
 | |
|       return EFI_ALREADY_STARTED;
 | |
|     }
 | |
|   }
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| /** Deregister SMBIOS generator.
 | |
| 
 | |
|   This function is called by the SMBIOS table generator to deregister itself
 | |
|   from the SMBIOS table factory.
 | |
| 
 | |
|   @param [in]  Generator       Pointer to the SMBIOS table generator.
 | |
| 
 | |
|   @retval EFI_SUCCESS           Success.
 | |
|   @retval EFI_INVALID_PARAMETER The generator is invalid.
 | |
|   @retval EFI_NOT_FOUND         The requested generator is not found
 | |
|                                 in the list of registered generators.
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| DeregisterSmbiosTableGenerator (
 | |
|   IN  CONST SMBIOS_TABLE_GENERATOR              * CONST Generator
 | |
|   )
 | |
| {
 | |
|   UINT16  TableId;
 | |
| 
 | |
|   if (Generator == NULL) {
 | |
|     DEBUG ((DEBUG_ERROR, "ERROR: SMBIOS deregister - Invalid Generator\n"));
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   if (!IS_GENERATOR_TYPE_SMBIOS (Generator->GeneratorID)) {
 | |
|     DEBUG ((
 | |
|       DEBUG_ERROR,
 | |
|       "ERROR: SMBIOS deregister - Generator" \
 | |
|       " Type is not SMBIOS\n"
 | |
|       ));
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   TableId = GET_TABLE_ID (Generator->GeneratorID);
 | |
|   if (IS_GENERATOR_NAMESPACE_STD (Generator->GeneratorID)) {
 | |
|     if (TableId >= EStdSmbiosTableIdMax) {
 | |
|       ASSERT (TableId < EStdSmbiosTableIdMax);
 | |
|       return EFI_INVALID_PARAMETER;
 | |
|     }
 | |
|     if (TableFactoryInfo.StdSmbiosTableGeneratorList[TableId] != NULL) {
 | |
|       if (Generator != TableFactoryInfo.StdSmbiosTableGeneratorList[TableId]) {
 | |
|         return EFI_INVALID_PARAMETER;
 | |
|       }
 | |
|       TableFactoryInfo.StdSmbiosTableGeneratorList[TableId] = NULL;
 | |
|     } else {
 | |
|       return EFI_NOT_FOUND;
 | |
|     }
 | |
|   } else {
 | |
|     if (TableId > FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators)) {
 | |
|       ASSERT (TableId <= FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators));
 | |
|       return EFI_INVALID_PARAMETER;
 | |
|     }
 | |
|     if (TableFactoryInfo.CustomSmbiosTableGeneratorList[TableId] != NULL) {
 | |
|       if (Generator !=
 | |
|           TableFactoryInfo.CustomSmbiosTableGeneratorList[TableId]) {
 | |
|         return EFI_INVALID_PARAMETER;
 | |
|       }
 | |
|       TableFactoryInfo.CustomSmbiosTableGeneratorList[TableId] = NULL;
 | |
|     } else {
 | |
|       return EFI_NOT_FOUND;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   DEBUG ((DEBUG_INFO, "Deregistering %s\n", Generator->Description));
 | |
|   return EFI_SUCCESS;
 | |
| }
 |