summaryrefslogtreecommitdiff
path: root/DynamicTablesPkg/Library/Common/MetadataHandlerLib/MetadataHandler.c
blob: ad2be3a047325f34bfcdf4bfeb5b5d160dabd9d3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/** @file
  Metadata Handler Library.

  Copyright (c) 2025, Arm Limited. All rights reserved.
  SPDX-License-Identifier: BSD-2-Clause-Patent
**/

#include <Base.h>
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/MemoryAllocationLib.h>
#include <ConfigurationManagerObject.h>

#include <Library/MetadataObjLib.h>
#include "MetadataHandler.h"

/* Metadata handlers. */
STATIC METADATA_HANDLERS  mMetadataHandlers[MetadataTypeMax] = {
  // MetadataTypeUid
  {
    MetadataGenerateUid,
    MetadataValidateUid,
  },
  // MetadataTypeProximityDomain
  {
    MetadataGenerateProximityDomain,
    MetadataValidateProximityDomain,
  },
};

/** Query the MetadataObjLib for metadata matching the input (Type/Token).
    If the metadata exists, return it.
    Otherwise:
    - Generate a new metadata object
    - Add it to the MetadataObjLib
    - return it

  @param[in]       Root          Root of the Metadata information.
  @param[in]       Type          METADATA_TYPE of the entry to generate.
  @param[in]       Token         Token uniquely identifying an entry among other
                                 objects with the input METADATA_TYPE.
  @param[in]       Context       Optional context to use during the Metadata generation.
  @param[in, out]  Metadata      On input, can contain METADATA_TYPE-specific information.
                                 On output and if success, contains the generated
                                 Metadata object.
  @param[in]       MetadataSize  Size of the input Metadata.

  @retval EFI_SUCCESS           Success.
  @retval EFI_INVALID_PARAMETER A parameter is invalid.
**/
EFI_STATUS
EFIAPI
MetadataHandlerGenerate (
  IN      METADATA_ROOT_HANDLE  Root,
  IN      METADATA_TYPE         Type,
  IN      CM_OBJECT_TOKEN       Token,
  IN      VOID                  *Context,
  IN OUT  VOID                  *Metadata,
  IN      UINT32                MetadataSize
  )
{
  EFI_STATUS  Status;

  if ((Type >= MetadataTypeMax) ||
      (Token == CM_NULL_TOKEN)  ||
      (Metadata == NULL)        ||
      (MetadataSize == 0))
  {
    ASSERT (Type < MetadataTypeMax);
    ASSERT (Token != CM_NULL_TOKEN);
    ASSERT (Metadata != NULL);
    ASSERT (MetadataSize != 0);
    return EFI_INVALID_PARAMETER;
  }

  Status = mMetadataHandlers[Type].Generate (
                                     Root,
                                     Type,
                                     Token,
                                     Context,
                                     Metadata,
                                     MetadataSize
                                     );
  ASSERT_EFI_ERROR (Status);

  return Status;
}

/** Validate the Metadata.

  @param[in]  Root  Root of the Metadata information.

  @retval EFI_SUCCESS           Success.
  @retval EFI_INVALID_PARAMETER A parameter is invalid.
**/
EFI_STATUS
EFIAPI
MetadataHandlerValidate (
  IN  METADATA_ROOT_HANDLE  Root
  )
{
  EFI_STATUS     Status;
  METADATA_TYPE  Type;

  for (Type = 0; Type < MetadataTypeMax; Type++) {
    Status = mMetadataHandlers[Type].Validate (Root);
    ASSERT_EFI_ERROR (Status);
  }

  return Status;
}