]> git.proxmox.com Git - mirror_edk2.git/blame - Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscPortInternalConnectorDesignatorFunction.c
ArmPkg/CompilerIntrinsicsLib: Add uread, uwrite GCC assembly sources
[mirror_edk2.git] / Vlv2TbltDevicePkg / SmBiosMiscDxe / MiscPortInternalConnectorDesignatorFunction.c
CommitLineData
3cbfba02
DW
1/** @file\r
2\r
3Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>\r
4 \r\r
9dc8036d
MK
5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
6\r
3cbfba02
DW
7 \r\r
8\r
9\r
10Module Name:\r
11\r
12 MiscPortInternalConnectorDesignatorFunction.c\r
13\r
14Abstract:\r
15\r
16 Create the device path for the Port internal connector designator.\r
17 Port internal connector designator information is Misc. subclass type 6\r
18 and SMBIOS type 8.\r
19\r
20\r
21**/\r
22\r
23\r
24#include "CommonHeader.h"\r
25\r
26#include "MiscSubclassDriver.h"\r
27\r
28\r
29/**\r
30 This is a macro defined function, in fact, the function is\r
31 MiscPortInternalConnectorDesignatorFunction (RecordType, RecordLen, RecordData, LogRecordData)\r
32 This function makes boot time changes to the contents of the\r
33 MiscPortConnectorInformation.\r
34\r
35 @param MiscPortInternalConnectorDesignator The string which is used to create\r
36 the function\r
37 The Arguments in fact:\r
38 @param RecordType Type of record to be processed from\r
39 the Data Table.\r
40 mMiscSubclassDataTable[].RecordType\r
41 @param RecordLen Size of static RecordData from the\r
42 Data Table.\r
43 mMiscSubclassDataTable[].RecordLen\r
44 @param RecordData Pointer to RecordData, which will be\r
45 written to the Data Hub\r
46 @param LogRecordData TRUE to log RecordData to Data Hub.\r
47 FALSE when there is no more data to\r
48 log.\r
49\r
50 @retval EFI_SUCCESS *RecordData and *LogRecordData have\r
51 been set.\r
52 @retval EFI_UNSUPPORTED Unexpected RecordType value.\r
53 @retval EFI_INVALID_PARAMETER One of the following parameter\r
54 conditions was true: RecordLen was\r
55 zero. RecordData was NULL.\r
56 LogRecordData was NULL.\r
57\r
58**/\r
59MISC_SMBIOS_TABLE_FUNCTION (\r
60 MiscPortInternalConnectorDesignator\r
61 )\r
62{\r
63 CHAR8 *OptionalStrStart;\r
64 UINTN InternalRefStrLen;\r
65 UINTN ExternalRefStrLen;\r
66 EFI_STRING InternalRef;\r
67 EFI_STRING ExternalRef;\r
68 STRING_REF TokenForInternal;\r
69 STRING_REF TokenForExternal;\r
70 EFI_STATUS Status;\r
71 SMBIOS_TABLE_TYPE8 *SmbiosRecord;\r
72 EFI_SMBIOS_HANDLE SmbiosHandle;\r
73 EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR *ForType8InputData;\r
74\r
75 ForType8InputData = (EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR *)RecordData;\r
76\r
77 //\r
78 // First check for invalid parameters.\r
79 //\r
80 if (RecordData == NULL) {\r
81 return EFI_INVALID_PARAMETER;\r
82 }\r
83\r
84 TokenForInternal = 0;\r
85 TokenForExternal = 0;\r
86\r
87 switch (ForType8InputData->PortInternalConnectorDesignator) {\r
88\r
89 case STR_MISC_PORT_INTERNAL_IDE1:\r
90 TokenForInternal = STRING_TOKEN (STR_MISC_PORT_INTERNAL_IDE1);\r
91 TokenForExternal = STRING_TOKEN(STR_MISC_PORT_EXTERNAL_IDE1);\r
92 break;\r
93 case STR_MISC_PORT_INTERNAL_IDE2:\r
94 TokenForInternal = STRING_TOKEN (STR_MISC_PORT_INTERNAL_IDE2);\r
95 TokenForExternal = STRING_TOKEN(STR_MISC_PORT_EXTERNAL_IDE2);\r
96 break;\r
97 case STR_MISC_PORT_INTERNAL_ATX_POWER:\r
98 TokenForInternal = STRING_TOKEN (STR_MISC_PORT_INTERNAL_ATX_POWER);\r
99 TokenForExternal = STRING_TOKEN(STR_MISC_PORT_EXTERNAL_ATX_POWER);\r
100 break;\r
101 default:\r
102 break;\r
103 }\r
104\r
105 InternalRef = SmbiosMiscGetString (TokenForInternal);\r
106 InternalRefStrLen = StrLen(InternalRef);\r
107 if (InternalRefStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
108 return EFI_UNSUPPORTED;\r
109 }\r
110\r
111 ExternalRef = SmbiosMiscGetString (TokenForExternal);\r
112 ExternalRefStrLen = StrLen(ExternalRef);\r
113 if (ExternalRefStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
114 return EFI_UNSUPPORTED;\r
115 }\r
116\r
117 //\r
118 // Two zeros following the last string.\r
119 //\r
120 SmbiosRecord = AllocatePool(sizeof (SMBIOS_TABLE_TYPE8) + InternalRefStrLen + 1 + ExternalRefStrLen + 1 + 1);\r
121 ZeroMem(SmbiosRecord, sizeof (SMBIOS_TABLE_TYPE8) + InternalRefStrLen + 1 + ExternalRefStrLen + 1 + 1);\r
122\r
123 SmbiosRecord->Hdr.Type = EFI_SMBIOS_TYPE_PORT_CONNECTOR_INFORMATION;\r
124 SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE8);\r
125\r
126 //\r
127 // Make handle chosen by smbios protocol.add automatically.\r
128 //\r
129 SmbiosRecord->Hdr.Handle = 0;\r
130 SmbiosRecord->InternalReferenceDesignator = 1;\r
131 SmbiosRecord->InternalConnectorType = (UINT8)ForType8InputData->PortInternalConnectorType;\r
132 SmbiosRecord->ExternalReferenceDesignator = 2;\r
133 SmbiosRecord->ExternalConnectorType = (UINT8)ForType8InputData->PortExternalConnectorType;\r
134 SmbiosRecord->PortType = (UINT8)ForType8InputData->PortType;\r
135\r
136 OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);\r
137 UnicodeStrToAsciiStr(InternalRef, OptionalStrStart);\r
138 UnicodeStrToAsciiStr(ExternalRef, OptionalStrStart + InternalRefStrLen + 1);\r
139\r
140 //\r
141 // Now we have got the full smbios record, call smbios protocol to add this record.\r
142 //\r
143 SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;\r
144 Status = Smbios-> Add(\r
145 Smbios,\r
146 NULL,\r
147 &SmbiosHandle,\r
148 (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecord\r
149 );\r
150 FreePool(SmbiosRecord);\r
151 return Status;\r
152}\r