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