summaryrefslogtreecommitdiffstats
path: root/PrmPkg/PrmLoaderDxe/PrmAcpiTable.h
blob: 6b9099ca7ba76df6ede5a954deaf0f55dcf06126 (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
/** @file

  Definition for the Platform Runtime Mechanism (PRM) ACPI table (PRMT).

  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
  Copyright (c) Microsoft Corporation
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef PRMT_ACPI_TABLE_H_
#define PRMT_ACPI_TABLE_H_

#include <Base.h>
#include <IndustryStandard/Acpi10.h>

#define PRM_TABLE_SIGNATURE                       SIGNATURE_32 ('P', 'R', 'M', 'T')

#define PRM_TABLE_REVISION                        0x0
#define PRM_MODULE_INFORMATION_STRUCT_REVISION    0x00
#define PRM_HANDLER_INFORMATION_STRUCT_REVISION   0x00

#pragma pack(push, 1)

//
// Platform Runtime Mechanism (PRM) ACPI Table (PRMT) structures
//
typedef struct {
  UINT16                              StructureRevision;          ///< Revision of this structure
  UINT16                              StructureLength;            ///< Length in bytes of this structure
  GUID                                Identifier;                 ///< GUID of the PRM handler for this structure
  UINT64                              PhysicalAddress;            ///< Physical address of this PRM handler
  UINT64                              PrmContextBuffer;           ///< Physical address of the context buffer for this
                                                                  ///< PRM handler (PRM_CONTEXT_BUFFER *)
  UINT64                              StaticDataBuffer;           ///< Physical address of the static data buffer for
                                                                  ///< this PRM handler (PRM_DATA_BUFFER *)
  UINT64                              AcpiParameterBuffer;        ///< Physical address of the parameter buffer
                                                                  ///< for this PRM handler (PRM_DATA_BUFFER *)
                                                                  ///< that is only used in the case of _DSM invocation.
                                                                  ///< If _DSM invocation is not used, this value is
                                                                  ///< ignored.
} PRM_HANDLER_INFORMATION_STRUCT;

typedef struct {
  UINT16                              StructureRevision;          ///< Revision of this structure
  UINT16                              StructureLength;            ///< Length in bytes of this structure including the
                                                                  ///< variable length PRM Handler Info array
  GUID                                Identifier;                 ///< GUID of the PRM module for this structure
  UINT16                              MajorRevision;              ///< PRM module major revision
  UINT16                              MinorRevision;              ///< PRM module minor revision
  UINT16                              HandlerCount;               ///< Number of entries in the Handler Info array
  UINT32                              HandlerInfoOffset;          ///< Offset in bytes from the beginning of this
                                                                  ///< structure to the Handler Info array
  UINT64                              ModuleUpdateLock;           ///< Physical address of the PRM Module Update Lock
                                                                  ///< descriptor (PRM_MODULE_UPDATE_LOCK_DESCRIPTOR *)
  UINT64                              RuntimeMmioRanges;          ///< Physical address of the PRM MMIO Ranges
                                                                  ///< structure (PRM_MODULE_RUNTIME_MMIO_RANGES *)
  PRM_HANDLER_INFORMATION_STRUCT      HandlerInfoStructure[1];
} PRM_MODULE_INFORMATION_STRUCT;

typedef struct {
  EFI_ACPI_DESCRIPTION_HEADER         Header;                     ///< Standard ACPI description header
  UINT32                              PrmModuleInfoOffset;        ///< Offset in bytes from the beginning of this
                                                                  ///< structure to the PRM Module Info array
  UINT32                              PrmModuleInfoCount;         ///< Number of entries in the PRM Module Info array
  PRM_MODULE_INFORMATION_STRUCT       PrmModuleInfoStructure[1];
} PRM_ACPI_DESCRIPTION_TABLE;

#pragma pack(pop)

//
// Helper macros to build PRM Information structures
//
// Todo: Revisit whether to use; currently both macros are not used
//
#define PRM_MODULE_INFORMATION_STRUCTURE(ModuleGuid, ModuleRevision, HandlerCount, PrmHanderInfoStructureArray) {                       \
    {                                                                                                                                   \
      PRM_MODULE_INFORMATION_STRUCT_REVISION,                              /* UINT16    StructureRevision;   */                         \
      (OFFSET_OF (PRM_MODULE_INFORMATION_STRUCT, HandlerInfoStructure) + (HandlerCount * sizeof (PRM_HANDLER_INFORMATION_STRUCT)))   /* UINT16    StructureLength;     */ \
      ModuleGuid,                                                          /* GUID      ModuleGuid;          */                         \
      ModuleRevision,                                                      /* UINT16    ModuleRevision       */                         \
      HandlerCount,                                                        /* UINT16    HandlerCount         */                         \
      OFFSET_OF (PRM_MODULE_INFORMATION_STRUCT, HandlerInfoOffset),        /* UINT32    HandlerInfoOffset    */                         \
      PrmHanderInfoStructureArray                                          /* PRM_HANDLER_INFORMATION_STRUCT HandlerInfoStructure */    \
    } \
  }

#define PRM_HANDLER_INFORMATION_STRUCTURE(HandlerGuid, PhysicalAddress) {                                                   \
    {                                                                                                                              \
      PRM_HANDLER_INFORMATION_STRUCT_REVISION,                             /* UINT16                  StructureRevision;      */   \
      sizeof (PRM_HANDLER_INFORMATION_STRUCT),                             /* UINT16                  StructureLength;        */   \
      HandlerGuid,                                                         /* GUID                    HandlerGuid;            */   \
      PhysicalAddress,                                                     /* UINT64                  PhysicalAddress         */   \
    } \
  }

#endif // _PRMT_ACPI_TABLE_H_