1 /** @file
2   This code supports the implementation of the Smbios protocol
3 
4 Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution.  The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9 
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 
13 **/
14 
15 #ifndef _SMBIOS_DXE_H_
16 #define _SMBIOS_DXE_H_
17 
18 
19 #include <PiDxe.h>
20 
21 #include <Protocol/Smbios.h>
22 #include <IndustryStandard/SmBios.h>
23 #include <Guid/EventGroup.h>
24 #include <Guid/SmBios.h>
25 #include <Library/DebugLib.h>
26 #include <Library/UefiDriverEntryPoint.h>
27 #include <Library/UefiLib.h>
28 #include <Library/BaseLib.h>
29 #include <Library/BaseMemoryLib.h>
30 #include <Library/MemoryAllocationLib.h>
31 #include <Library/UefiBootServicesTableLib.h>
32 #include <Library/PcdLib.h>
33 
34 #define SMBIOS_INSTANCE_SIGNATURE SIGNATURE_32 ('S', 'B', 'i', 's')
35 typedef struct {
36   UINT32                Signature;
37   EFI_HANDLE            Handle;
38   //
39   // Produced protocol
40   //
41   EFI_SMBIOS_PROTOCOL   Smbios;
42   //
43   // Updates to record list must be locked.
44   //
45   EFI_LOCK              DataLock;
46   //
47   // List of EFI_SMBIOS_ENTRY structures.
48   //
49   LIST_ENTRY            DataListHead;
50   //
51   // List of allocated SMBIOS handle.
52   //
53   LIST_ENTRY            AllocatedHandleListHead;
54 } SMBIOS_INSTANCE;
55 
56 #define SMBIOS_INSTANCE_FROM_THIS(this)  CR (this, SMBIOS_INSTANCE, Smbios, SMBIOS_INSTANCE_SIGNATURE)
57 
58 //
59 // SMBIOS record Header
60 //
61 // An SMBIOS internal Record is an EFI_SMBIOS_RECORD_HEADER followed by (RecordSize - HeaderSize) bytes of
62 //  data. The format of the data is defined by the SMBIOS spec.
63 //
64 //
65 #define EFI_SMBIOS_RECORD_HEADER_VERSION  0x0100
66 typedef struct {
67   UINT16      Version;
68   UINT16      HeaderSize;
69   UINTN       RecordSize;
70   EFI_HANDLE  ProducerHandle;
71   UINTN       NumberOfStrings;
72 } EFI_SMBIOS_RECORD_HEADER;
73 
74 
75 //
76 // Private data structure to contain the SMBIOS record. One record per
77 //  structure. SmbiosRecord is a copy of the data passed in and follows RecordHeader .
78 //
79 #define EFI_SMBIOS_ENTRY_SIGNATURE  SIGNATURE_32 ('S', 'r', 'e', 'c')
80 typedef struct {
81   UINT32                    Signature;
82   LIST_ENTRY                Link;
83   EFI_SMBIOS_RECORD_HEADER  *RecordHeader;
84   UINTN                     RecordSize;
85   //
86   // Indicate which table this record is added to.
87   //
88   BOOLEAN                   Smbios32BitTable;
89   BOOLEAN                   Smbios64BitTable;
90 } EFI_SMBIOS_ENTRY;
91 
92 #define SMBIOS_ENTRY_FROM_LINK(link)  CR (link, EFI_SMBIOS_ENTRY, Link, EFI_SMBIOS_ENTRY_SIGNATURE)
93 
94 //
95 // Private data to contain the Smbios handle that already allocated.
96 //
97 #define SMBIOS_HANDLE_ENTRY_SIGNATURE  SIGNATURE_32 ('S', 'h', 'r', 'd')
98 
99 typedef struct {
100   UINT32               Signature;
101   LIST_ENTRY           Link;
102   //
103   // Filter driver will register what record guid filter should be used.
104   //
105   EFI_SMBIOS_HANDLE    SmbiosHandle;
106 
107 } SMBIOS_HANDLE_ENTRY;
108 
109 #define SMBIOS_HANDLE_ENTRY_FROM_LINK(link)  CR (link, SMBIOS_HANDLE_ENTRY, Link, SMBIOS_HANDLE_ENTRY_SIGNATURE)
110 
111 typedef struct {
112   EFI_SMBIOS_TABLE_HEADER  Header;
113   UINT8                    Tailing[2];
114 } EFI_SMBIOS_TABLE_END_STRUCTURE;
115 
116 /**
117   Create Smbios Table and installs the Smbios Table to the System Table.
118 
119   @param  Smbios32BitTable    The flag to update 32-bit table.
120   @param  Smbios64BitTable    The flag to update 64-bit table.
121 
122 **/
123 VOID
124 EFIAPI
125 SmbiosTableConstruction (
126   BOOLEAN     Smbios32BitTable,
127   BOOLEAN     Smbios64BitTable
128   );
129 
130 #endif
131