]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsDevConfigProtocol.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdeModulePkg / Bus / Ufs / UfsPassThruDxe / UfsDevConfigProtocol.c
CommitLineData
32c9049d
HW
1/** @file\r
2 The implementation of the EFI UFS Device Config Protocol.\r
3\r
4 Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>\r
9d510e61 5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
32c9049d
HW
6\r
7**/\r
8\r
9#include "UfsPassThru.h"\r
10\r
11/**\r
12 Read or write specified device descriptor of a UFS device.\r
13\r
14 The function is used to read/write UFS device descriptors. The consumer of this API is\r
15 responsible for allocating the data buffer pointed by Descriptor.\r
16\r
17 @param[in] This The pointer to the EFI_UFS_DEVICE_CONFIG_PROTOCOL instance.\r
18 @param[in] Read The boolean variable to show r/w direction.\r
19 @param[in] DescId The ID of device descriptor.\r
20 @param[in] Index The Index of device descriptor.\r
21 @param[in] Selector The Selector of device descriptor.\r
22 @param[in, out] Descriptor The buffer of device descriptor to be read or written.\r
23 @param[in, out] DescSize The size of device descriptor buffer. On input, the size, in bytes,\r
24 of the data buffer specified by Descriptor. On output, the number\r
25 of bytes that were actually transferred.\r
26\r
27 @retval EFI_SUCCESS The device descriptor is read/written successfully.\r
28 @retval EFI_INVALID_PARAMETER This is NULL or Descriptor is NULL or DescSize is NULL.\r
29 DescId, Index and Selector are invalid combination to point to a\r
30 type of UFS device descriptor.\r
31 @retval EFI_DEVICE_ERROR The device descriptor is not read/written successfully.\r
32\r
33**/\r
34EFI_STATUS\r
35EFIAPI\r
36UfsRwUfsDescriptor (\r
1436aea4
MK
37 IN EFI_UFS_DEVICE_CONFIG_PROTOCOL *This,\r
38 IN BOOLEAN Read,\r
39 IN UINT8 DescId,\r
40 IN UINT8 Index,\r
41 IN UINT8 Selector,\r
42 IN OUT UINT8 *Descriptor,\r
43 IN OUT UINT32 *DescSize\r
32c9049d
HW
44 )\r
45{\r
1436aea4
MK
46 EFI_STATUS Status;\r
47 UFS_PASS_THRU_PRIVATE_DATA *Private;\r
32c9049d
HW
48\r
49 Private = UFS_PASS_THRU_PRIVATE_DATA_FROM_DEV_CONFIG (This);\r
50\r
51 if ((This == NULL) || (Descriptor == NULL) || (DescSize == NULL)) {\r
52 return EFI_INVALID_PARAMETER;\r
53 }\r
54\r
55 Status = UfsRwDeviceDesc (\r
56 Private,\r
57 Read,\r
58 DescId,\r
59 Index,\r
60 Selector,\r
61 Descriptor,\r
62 DescSize\r
63 );\r
64 if (Status == EFI_TIMEOUT) {\r
65 Status = EFI_DEVICE_ERROR;\r
66 }\r
1436aea4 67\r
32c9049d
HW
68 return Status;\r
69}\r
70\r
71/**\r
72 Read or write specified flag of a UFS device.\r
73\r
74 The function is used to read/write UFS flag descriptors. The consumer of this API is responsible\r
75 for allocating the buffer pointed by Flag. The buffer size is 1 byte as UFS flag descriptor is\r
76 just a single Boolean value that represents a TRUE or FALSE, '0' or '1', ON or OFF type of value.\r
77\r
78 @param[in] This The pointer to the EFI_UFS_DEVICE_CONFIG_PROTOCOL instance.\r
79 @param[in] Read The boolean variable to show r/w direction.\r
80 @param[in] FlagId The ID of flag to be read or written.\r
81 @param[in, out] Flag The buffer to set or clear flag.\r
82\r
83 @retval EFI_SUCCESS The flag descriptor is set/clear successfully.\r
84 @retval EFI_INVALID_PARAMETER This is NULL or Flag is NULL.\r
85 FlagId is an invalid UFS flag ID.\r
86 @retval EFI_DEVICE_ERROR The flag is not set/clear successfully.\r
87\r
88**/\r
89EFI_STATUS\r
90EFIAPI\r
91UfsRwUfsFlag (\r
1436aea4
MK
92 IN EFI_UFS_DEVICE_CONFIG_PROTOCOL *This,\r
93 IN BOOLEAN Read,\r
94 IN UINT8 FlagId,\r
95 IN OUT UINT8 *Flag\r
32c9049d
HW
96 )\r
97{\r
1436aea4
MK
98 EFI_STATUS Status;\r
99 UFS_PASS_THRU_PRIVATE_DATA *Private;\r
32c9049d
HW
100\r
101 Private = UFS_PASS_THRU_PRIVATE_DATA_FROM_DEV_CONFIG (This);\r
102\r
103 if ((This == NULL) || (Flag == NULL)) {\r
104 return EFI_INVALID_PARAMETER;\r
105 }\r
106\r
107 Status = UfsRwFlags (Private, Read, FlagId, Flag);\r
108 if (Status == EFI_TIMEOUT) {\r
109 Status = EFI_DEVICE_ERROR;\r
110 }\r
1436aea4 111\r
32c9049d
HW
112 return Status;\r
113}\r
114\r
115/**\r
116 Read or write specified attribute of a UFS device.\r
117\r
118 The function is used to read/write UFS attributes. The consumer of this API is responsible for\r
119 allocating the data buffer pointed by Attribute.\r
120\r
121 @param[in] This The pointer to the EFI_UFS_DEVICE_CONFIG_PROTOCOL instance.\r
122 @param[in] Read The boolean variable to show r/w direction.\r
123 @param[in] AttrId The ID of Attribute.\r
124 @param[in] Index The Index of Attribute.\r
125 @param[in] Selector The Selector of Attribute.\r
126 @param[in, out] Attribute The buffer of Attribute to be read or written.\r
127 @param[in, out] AttrSize The size of Attribute buffer. On input, the size, in bytes, of the\r
128 data buffer specified by Attribute. On output, the number of bytes\r
129 that were actually transferred.\r
130\r
131 @retval EFI_SUCCESS The attribute is read/written successfully.\r
132 @retval EFI_INVALID_PARAMETER This is NULL or Attribute is NULL or AttrSize is NULL.\r
133 AttrId, Index and Selector are invalid combination to point to a\r
134 type of UFS attribute.\r
135 @retval EFI_DEVICE_ERROR The attribute is not read/written successfully.\r
136\r
137**/\r
138EFI_STATUS\r
139EFIAPI\r
140UfsRwUfsAttribute (\r
1436aea4
MK
141 IN EFI_UFS_DEVICE_CONFIG_PROTOCOL *This,\r
142 IN BOOLEAN Read,\r
143 IN UINT8 AttrId,\r
144 IN UINT8 Index,\r
145 IN UINT8 Selector,\r
146 IN OUT UINT8 *Attribute,\r
147 IN OUT UINT32 *AttrSize\r
32c9049d
HW
148 )\r
149{\r
1436aea4
MK
150 EFI_STATUS Status;\r
151 UFS_PASS_THRU_PRIVATE_DATA *Private;\r
152 UINT32 Attribute32;\r
32c9049d 153\r
1436aea4 154 Private = UFS_PASS_THRU_PRIVATE_DATA_FROM_DEV_CONFIG (This);\r
32c9049d
HW
155 Attribute32 = 0;\r
156\r
157 if ((This == NULL) || (Attribute == NULL) || (AttrSize == NULL)) {\r
158 return EFI_INVALID_PARAMETER;\r
159 }\r
160\r
161 //\r
162 // According to UFS Version 2.1 Spec (JESD220C) Section 14.3, the size of a attribute will not\r
163 // exceed 32-bit.\r
164 //\r
165 if (*AttrSize > 4) {\r
166 return EFI_INVALID_PARAMETER;\r
167 }\r
168\r
169 if (!Read) {\r
170 CopyMem (&Attribute32, Attribute, *AttrSize);\r
171 }\r
172\r
173 Status = UfsRwAttributes (\r
174 Private,\r
175 Read,\r
176 AttrId,\r
177 Index,\r
178 Selector,\r
179 &Attribute32\r
180 );\r
181 if (!EFI_ERROR (Status)) {\r
182 if (Read) {\r
183 CopyMem (Attribute, &Attribute32, *AttrSize);\r
184 }\r
185 } else {\r
186 *AttrSize = 0;\r
187 if (Status == EFI_TIMEOUT) {\r
188 Status = EFI_DEVICE_ERROR;\r
189 }\r
190 }\r
1436aea4 191\r
32c9049d
HW
192 return Status;\r
193}\r