1/** @file
2  The internal header file of FvSimpleFileSystem driver.
3
4Copyright (c) 2014, ARM Limited. All rights reserved.
5Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
6
7This program and the accompanying materials
8are licensed and made available under the terms and conditions of the BSD License
9which accompanies this distribution.  The full text of the license may be found at
10http://opensource.org/licenses/bsd-license.php
11
12THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14
15**/
16
17#ifndef __FVFS_INTERNAL_H__
18#define __FVFS_INTERNAL_H__
19
20#include <Uefi.h>
21#include <PiDxe.h>
22
23#include <Library/BaseLib.h>
24#include <Library/BaseMemoryLib.h>
25#include <Library/DebugLib.h>
26#include <Library/DevicePathLib.h>
27#include <Library/MemoryAllocationLib.h>
28#include <Library/PrintLib.h>
29#include <Library/UefiBootServicesTableLib.h>
30#include <Library/UefiLib.h>
31
32#include <Protocol/DriverBinding.h>
33#include <Protocol/FirmwareVolume2.h>
34#include <Protocol/SimpleFileSystem.h>
35#include <Protocol/UnicodeCollation.h>
36
37#include <Guid/FileSystemInfo.h>
38#include <Guid/FileInfo.h>
39#include <Guid/FileSystemVolumeLabelInfo.h>
40
41typedef struct _FV_FILESYSTEM_FILE       FV_FILESYSTEM_FILE;
42typedef struct _FV_FILESYSTEM_FILE_INFO  FV_FILESYSTEM_FILE_INFO;
43typedef struct _FV_FILESYSTEM_INSTANCE   FV_FILESYSTEM_INSTANCE;
44
45//
46// Struct representing an instance of the "filesystem". There will be one of
47// these structs per FV.
48//
49struct _FV_FILESYSTEM_INSTANCE {
50  UINT32                           Signature;
51  LIST_ENTRY                       FileInfoHead;
52  LIST_ENTRY                       FileHead;
53  EFI_DRIVER_BINDING_PROTOCOL      *DriverBinding;
54  EFI_FIRMWARE_VOLUME2_PROTOCOL    *FvProtocol;
55  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL  SimpleFs;
56  FV_FILESYSTEM_FILE               *Root;
57  CHAR16                           *VolumeLabel;
58};
59
60//
61// Struct representing a opening file. Each opening operation on file will
62// create such an instance except for the "root directory", which will only
63// be created once for each FV.
64//
65struct _FV_FILESYSTEM_FILE {
66  UINT32                           Signature;
67  LIST_ENTRY                       Link;
68  FV_FILESYSTEM_FILE_INFO          *DirReadNext;
69  FV_FILESYSTEM_INSTANCE           *Instance;
70  EFI_FILE_PROTOCOL                FileProtocol;
71  FV_FILESYSTEM_FILE_INFO          *FvFileInfo;
72  UINT64                           Position;
73};
74
75//
76// Struct representing the info of a file.
77//
78struct _FV_FILESYSTEM_FILE_INFO {
79  UINT32                           Signature;
80  LIST_ENTRY                       Link;
81  EFI_GUID                         NameGuid;
82  EFI_FV_FILETYPE                  Type;
83  EFI_FILE_INFO                    FileInfo;
84};
85
86#define FVFS_FILE_SIGNATURE        SIGNATURE_32 ('f', 'v', 'f', 'i')
87#define FVFS_FILE_INFO_SIGNATURE   SIGNATURE_32 ('f', 'v', 'i', 'n')
88#define FVFS_INSTANCE_SIGNATURE    SIGNATURE_32 ('f', 'v', 'f', 's')
89
90#define FVFS_INSTANCE_FROM_SIMPLE_FS_THIS(This) CR (  \
91          This,                                       \
92          FV_FILESYSTEM_INSTANCE,                     \
93          SimpleFs,                                   \
94          FVFS_INSTANCE_SIGNATURE                     \
95          )
96
97#define FVFS_FILE_FROM_FILE_THIS(This) CR (           \
98          This,                                       \
99          FV_FILESYSTEM_FILE,                         \
100          FileProtocol,                               \
101          FVFS_FILE_SIGNATURE                         \
102          )
103
104#define FVFS_FILE_INFO_FROM_LINK(This) CR (           \
105          This,                                       \
106          FV_FILESYSTEM_FILE_INFO,                    \
107          Link,                                       \
108          FVFS_FILE_INFO_SIGNATURE                    \
109          )
110
111#define FVFS_FILE_FROM_LINK(FileLink) CR (FileLink, FV_FILESYSTEM_FILE, Link, FVFS_FILE_SIGNATURE)
112
113#define FVFS_GET_FIRST_FILE(Instance) FVFS_FILE_FROM_LINK (GetFirstNode (&Instance->FileHead))
114
115#define FVFS_GET_FIRST_FILE_INFO(Instance) FVFS_FILE_INFO_FROM_LINK (GetFirstNode (&Instance->FileInfoHead))
116
117
118#define FV_FILETYPE_IS_EXECUTABLE(Type) ((Type) == EFI_FV_FILETYPE_PEIM                  || \
119                                         (Type) == EFI_FV_FILETYPE_DRIVER                || \
120                                         (Type) == EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER  || \
121                                         (Type) == EFI_FV_FILETYPE_APPLICATION)
122
123/**
124  Open the root directory on a volume.
125
126  @param  This     A pointer to the volume to open the root directory.
127  @param  RootFile A pointer to the location to return the opened file handle for the
128                   root directory.
129
130  @retval EFI_SUCCESS          The device was opened.
131  @retval EFI_UNSUPPORTED      This volume does not support the requested file system type.
132  @retval EFI_NO_MEDIA         The device has no medium.
133  @retval EFI_DEVICE_ERROR     The device reported an error.
134  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
135  @retval EFI_ACCESS_DENIED    The service denied access to the file.
136  @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of resources.
137  @retval EFI_MEDIA_CHANGED    The device has a different medium in it or the medium is no
138                               longer supported. Any existing file handles for this volume are
139                               no longer valid. To access the files on the new medium, the
140                               volume must be reopened with OpenVolume().
141
142**/
143EFI_STATUS
144EFIAPI
145FvSimpleFileSystemOpenVolume (
146  IN     EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
147     OUT EFI_FILE_PROTOCOL               **RootFile
148  );
149
150/**
151  Test to see if this driver supports ControllerHandle.
152
153  @param  DriverBinding       Protocol instance pointer.
154  @param  ControllerHandle    Handle of device to test
155  @param  RemainingDevicePath Optional parameter use to pick a specific child
156                              device to start.
157
158  @retval EFI_SUCCESS         This driver supports this device
159  @retval EFI_ALREADY_STARTED This driver is already running on this device
160  @retval other               This driver does not support this device
161
162**/
163EFI_STATUS
164EFIAPI
165FvSimpleFileSystemDriverSupported (
166  IN  EFI_DRIVER_BINDING_PROTOCOL  *DriverBinding,
167  IN  EFI_HANDLE                   ControllerHandle,
168  IN  EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL
169  );
170
171/**
172  Start this driver on ControllerHandle by opening a FV protocol and
173  installing a SimpleFileSystem protocol on ControllerHandle.
174
175  @param  DriverBinding        Protocol instance pointer.
176  @param  ControllerHandle     Handle of device to bind driver to
177  @param  RemainingDevicePath  Optional parameter use to pick a specific child
178                               device to start.
179
180  @retval EFI_SUCCESS          This driver is added to ControllerHandle
181  @retval EFI_ALREADY_STARTED  This driver is already running on ControllerHandle
182  @retval other                This driver does not support this device
183
184**/
185EFI_STATUS
186EFIAPI
187FvSimpleFileSystemDriverStart (
188  IN  EFI_DRIVER_BINDING_PROTOCOL  *DriverBinding,
189  IN  EFI_HANDLE                   ControllerHandle,
190  IN  EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL
191  );
192
193/**
194  Stop this driver on ControllerHandle by removing SimpleFileSystem protocol and closing
195  the FV protocol on ControllerHandle.
196
197  @param  DriverBinding     Protocol instance pointer.
198  @param  ControllerHandle  Handle of device to stop driver on
199  @param  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of
200                            children is zero stop the entire bus driver.
201  @param  ChildHandleBuffer List of Child Handles to Stop.
202
203  @retval EFI_SUCCESS       This driver is removed ControllerHandle
204  @retval other             This driver was not removed from this device
205
206**/
207EFI_STATUS
208EFIAPI
209FvSimpleFileSystemDriverStop (
210  IN  EFI_DRIVER_BINDING_PROTOCOL       *DriverBinding,
211  IN  EFI_HANDLE                        ControllerHandle,
212  IN  UINTN                             NumberOfChildren,
213  IN  EFI_HANDLE                        *ChildHandleBuffer OPTIONAL
214  );
215
216/**
217  Opens a new file relative to the source file's location.
218
219  @param  This       A pointer to the EFI_FILE_PROTOCOL instance that is the file
220                     handle to the source location. This would typically be an open
221                     handle to a directory.
222  @param  NewHandle  A pointer to the location to return the opened handle for the new
223                     file.
224  @param  FileName   The Null-terminated string of the name of the file to be opened.
225                     The file name may contain the following path modifiers: "\", ".",
226                     and "..".
227  @param  OpenMode   The mode to open the file. The only valid combinations that the
228                     file may be opened with are: Read, Read/Write, or Create/Read/Write.
229  @param  Attributes Only valid for EFI_FILE_MODE_CREATE, in which case these are the
230                     attribute bits for the newly created file.
231
232  @retval EFI_SUCCESS          The file was opened.
233  @retval EFI_NOT_FOUND        The specified file could not be found on the device.
234  @retval EFI_NO_MEDIA         The device has no medium.
235  @retval EFI_MEDIA_CHANGED    The device has a different medium in it or the medium is no
236                               longer supported.
237  @retval EFI_DEVICE_ERROR     The device reported an error.
238  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
239  @retval EFI_WRITE_PROTECTED  An attempt was made to create a file, or open a file for write
240                               when the media is write-protected.
241  @retval EFI_ACCESS_DENIED    The service denied access to the file.
242  @retval EFI_OUT_OF_RESOURCES Not enough resources were available to open the file.
243  @retval EFI_VOLUME_FULL      The volume is full.
244
245**/
246EFI_STATUS
247EFIAPI
248FvSimpleFileSystemOpen (
249  IN     EFI_FILE_PROTOCOL    *This,
250     OUT EFI_FILE_PROTOCOL    **NewHandle,
251  IN     CHAR16               *FileName,
252  IN     UINT64               OpenMode,
253  IN     UINT64               Attributes
254  );
255
256/**
257  Closes a specified file handle.
258
259  @param  This          A pointer to the EFI_FILE_PROTOCOL instance that is the file
260                        handle to close.
261
262  @retval EFI_SUCCESS   The file was closed.
263
264**/
265EFI_STATUS
266EFIAPI
267FvSimpleFileSystemClose (
268  IN EFI_FILE_PROTOCOL  *This
269  );
270
271/**
272  Reads data from a file.
273
274  @param  This       A pointer to the EFI_FILE_PROTOCOL instance that is the file
275                     handle to read data from.
276  @param  BufferSize On input, the size of the Buffer. On output, the amount of data
277                     returned in Buffer. In both cases, the size is measured in bytes.
278  @param  Buffer     The buffer into which the data is read.
279
280  @retval EFI_SUCCESS          Data was read.
281  @retval EFI_NO_MEDIA         The device has no medium.
282  @retval EFI_DEVICE_ERROR     The device reported an error.
283  @retval EFI_DEVICE_ERROR     An attempt was made to read from a deleted file.
284  @retval EFI_DEVICE_ERROR     On entry, the current file position is beyond the end of the file.
285  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
286  @retval EFI_BUFFER_TOO_SMALL The BufferSize is too small to read the current directory
287                               entry. BufferSize has been updated with the size
288                               needed to complete the request.
289
290**/
291EFI_STATUS
292EFIAPI
293FvSimpleFileSystemRead (
294  IN     EFI_FILE_PROTOCOL      *This,
295  IN OUT UINTN                  *BufferSize,
296     OUT VOID                   *Buffer
297  );
298
299/**
300  Writes data to a file.
301
302  @param  This       A pointer to the EFI_FILE_PROTOCOL instance that is the file
303                     handle to write data to.
304  @param  BufferSize On input, the size of the Buffer. On output, the amount of data
305                     actually written. In both cases, the size is measured in bytes.
306  @param  Buffer     The buffer of data to write.
307
308  @retval EFI_SUCCESS          Data was written.
309  @retval EFI_UNSUPPORTED      Writes to open directory files are not supported.
310  @retval EFI_NO_MEDIA         The device has no medium.
311  @retval EFI_DEVICE_ERROR     The device reported an error.
312  @retval EFI_DEVICE_ERROR     An attempt was made to write to a deleted file.
313  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
314  @retval EFI_WRITE_PROTECTED  The file or medium is write-protected.
315  @retval EFI_ACCESS_DENIED    The file was opened read only.
316  @retval EFI_VOLUME_FULL      The volume is full.
317
318**/
319EFI_STATUS
320EFIAPI
321FvSimpleFileSystemWrite (
322  IN     EFI_FILE_PROTOCOL    *This,
323  IN OUT UINTN                *BufferSize,
324  IN     VOID                 *Buffer
325  );
326
327/**
328  Returns a file's current position.
329
330  @param  This            A pointer to the EFI_FILE_PROTOCOL instance that is the file
331                          handle to get the current position on.
332  @param  Position        The address to return the file's current position value.
333
334  @retval EFI_SUCCESS      The position was returned.
335  @retval EFI_UNSUPPORTED  The request is not valid on open directories.
336  @retval EFI_DEVICE_ERROR An attempt was made to get the position from a deleted file.
337
338**/
339EFI_STATUS
340EFIAPI
341FvSimpleFileSystemGetPosition (
342  IN     EFI_FILE_PROTOCOL    *This,
343     OUT UINT64               *Position
344  );
345
346/**
347  Sets a file's current position.
348
349  @param  This            A pointer to the EFI_FILE_PROTOCOL instance that is the
350                          file handle to set the requested position on.
351  @param  Position        The byte position from the start of the file to set.
352
353  @retval EFI_SUCCESS      The position was set.
354  @retval EFI_UNSUPPORTED  The seek request for nonzero is not valid on open
355                           directories.
356  @retval EFI_DEVICE_ERROR An attempt was made to set the position of a deleted file.
357
358**/
359EFI_STATUS
360EFIAPI
361FvSimpleFileSystemSetPosition (
362  IN EFI_FILE_PROTOCOL        *This,
363  IN UINT64                   Position
364  );
365
366/**
367  Flushes all modified data associated with a file to a device.
368
369  @param  This A pointer to the EFI_FILE_PROTOCOL instance that is the file
370               handle to flush.
371
372  @retval EFI_SUCCESS          The data was flushed.
373  @retval EFI_NO_MEDIA         The device has no medium.
374  @retval EFI_DEVICE_ERROR     The device reported an error.
375  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
376  @retval EFI_WRITE_PROTECTED  The file or medium is write-protected.
377  @retval EFI_ACCESS_DENIED    The file was opened read-only.
378  @retval EFI_VOLUME_FULL      The volume is full.
379
380**/
381EFI_STATUS
382EFIAPI
383FvSimpleFileSystemFlush (
384  IN EFI_FILE_PROTOCOL  *This
385  );
386
387/**
388  Close and delete the file handle.
389
390  @param  This                     A pointer to the EFI_FILE_PROTOCOL instance that is the
391                                   handle to the file to delete.
392
393  @retval EFI_SUCCESS              The file was closed and deleted, and the handle was closed.
394  @retval EFI_WARN_DELETE_FAILURE  The handle was closed, but the file was not deleted.
395
396**/
397EFI_STATUS
398EFIAPI
399FvSimpleFileSystemDelete (
400  IN EFI_FILE_PROTOCOL *This
401  );
402
403/**
404  Returns information about a file.
405
406  @param  This            A pointer to the EFI_FILE_PROTOCOL instance that is the file
407                          handle the requested information is for.
408  @param  InformationType The type identifier for the information being requested.
409  @param  BufferSize      On input, the size of Buffer. On output, the amount of data
410                          returned in Buffer. In both cases, the size is measured in bytes.
411  @param  Buffer          A pointer to the data buffer to return. The buffer's type is
412                          indicated by InformationType.
413
414  @retval EFI_SUCCESS          The information was returned.
415  @retval EFI_UNSUPPORTED      The InformationType is not known.
416  @retval EFI_NO_MEDIA         The device has no medium.
417  @retval EFI_DEVICE_ERROR     The device reported an error.
418  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
419  @retval EFI_BUFFER_TOO_SMALL The BufferSize is too small to read the current directory entry.
420                               BufferSize has been updated with the size needed to complete
421                               the request.
422**/
423EFI_STATUS
424EFIAPI
425FvSimpleFileSystemGetInfo (
426  IN     EFI_FILE_PROTOCOL    *This,
427  IN     EFI_GUID             *InformationType,
428  IN OUT UINTN                *BufferSize,
429     OUT VOID                 *Buffer
430  );
431
432/**
433  Sets information about a file.
434
435  @param  This            A pointer to the EFI_FILE_PROTOCOL instance that is the file
436                          handle the information is for.
437  @param  InformationType The type identifier for the information being set.
438  @param  BufferSize      The size, in bytes, of Buffer.
439  @param  Buffer          A pointer to the data buffer to write. The buffer's type is
440                          indicated by InformationType.
441
442  @retval EFI_SUCCESS          The information was set.
443  @retval EFI_UNSUPPORTED      The InformationType is not known.
444  @retval EFI_NO_MEDIA         The device has no medium.
445  @retval EFI_DEVICE_ERROR     The device reported an error.
446  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
447  @retval EFI_WRITE_PROTECTED  InformationType is EFI_FILE_INFO_ID and the media is
448                               read-only.
449  @retval EFI_WRITE_PROTECTED  InformationType is EFI_FILE_PROTOCOL_SYSTEM_INFO_ID
450                               and the media is read only.
451  @retval EFI_WRITE_PROTECTED  InformationType is EFI_FILE_SYSTEM_VOLUME_LABEL_ID
452                               and the media is read-only.
453  @retval EFI_ACCESS_DENIED    An attempt is made to change the name of a file to a
454                               file that is already present.
455  @retval EFI_ACCESS_DENIED    An attempt is being made to change the EFI_FILE_DIRECTORY
456                               Attribute.
457  @retval EFI_ACCESS_DENIED    An attempt is being made to change the size of a directory.
458  @retval EFI_ACCESS_DENIED    InformationType is EFI_FILE_INFO_ID and the file was opened
459                               read-only and an attempt is being made to modify a field
460                               other than Attribute.
461  @retval EFI_VOLUME_FULL      The volume is full.
462  @retval EFI_BAD_BUFFER_SIZE  BufferSize is smaller than the size of the type indicated
463                               by InformationType.
464
465**/
466EFI_STATUS
467EFIAPI
468FvSimpleFileSystemSetInfo (
469  IN EFI_FILE_PROTOCOL        *This,
470  IN EFI_GUID                 *InformationType,
471  IN UINTN                    BufferSize,
472  IN VOID                     *Buffer
473  );
474
475/**
476  Get the size of the buffer that will be returned by FvFsReadFile.
477
478  @param  FvProtocol                  A pointer to the EFI_FIRMWARE_VOLUME2_PROTOCOL instance.
479  @param  FvFileInfo                  A pointer to the FV_FILESYSTEM_FILE_INFO instance that is a struct
480                                      representing a file's info.
481
482  @retval EFI_SUCCESS                 The file size was gotten correctly.
483  @retval Others                      The file size wasn't gotten correctly.
484
485**/
486EFI_STATUS
487FvFsGetFileSize (
488  IN     EFI_FIRMWARE_VOLUME2_PROTOCOL     *FvProtocol,
489  IN OUT FV_FILESYSTEM_FILE_INFO           *FvFileInfo
490  );
491
492/**
493  Retrieves a Unicode string that is the user readable name of the driver.
494
495  This function retrieves the user readable name of a driver in the form of a
496  Unicode string. If the driver specified by This has a user readable name in
497  the language specified by Language, then a pointer to the driver name is
498  returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
499  by This does not support the language specified by Language,
500  then EFI_UNSUPPORTED is returned.
501
502  @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
503                                EFI_COMPONENT_NAME_PROTOCOL instance.
504
505  @param  Language[in]          A pointer to a Null-terminated ASCII string
506                                array indicating the language. This is the
507                                language of the driver name that the caller is
508                                requesting, and it must match one of the
509                                languages specified in SupportedLanguages. The
510                                number of languages supported by a driver is up
511                                to the driver writer. Language is specified
512                                in RFC 4646 or ISO 639-2 language code format.
513
514  @param  DriverName[out]       A pointer to the Unicode string to return.
515                                This Unicode string is the name of the
516                                driver specified by This in the language
517                                specified by Language.
518
519  @retval EFI_SUCCESS           The Unicode string for the Driver specified by
520                                This and the language specified by Language was
521                                returned in DriverName.
522
523  @retval EFI_INVALID_PARAMETER Language is NULL.
524
525  @retval EFI_INVALID_PARAMETER DriverName is NULL.
526
527  @retval EFI_UNSUPPORTED       The driver specified by This does not support
528                                the language specified by Language.
529
530**/
531EFI_STATUS
532EFIAPI
533FvSimpleFileSystemComponentNameGetDriverName (
534  IN  EFI_COMPONENT_NAME_PROTOCOL  *This,
535  IN  CHAR8                        *Language,
536  OUT CHAR16                       **DriverName
537  );
538
539/**
540  Retrieves a Unicode string that is the user readable name of the controller
541  that is being managed by a driver.
542
543  This function retrieves the user readable name of the controller specified by
544  ControllerHandle and ChildHandle in the form of a Unicode string. If the
545  driver specified by This has a user readable name in the language specified by
546  Language, then a pointer to the controller name is returned in ControllerName,
547  and EFI_SUCCESS is returned.  If the driver specified by This is not currently
548  managing the controller specified by ControllerHandle and ChildHandle,
549  then EFI_UNSUPPORTED is returned.  If the driver specified by This does not
550  support the language specified by Language, then EFI_UNSUPPORTED is returned.
551
552  @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
553                                EFI_COMPONENT_NAME_PROTOCOL instance.
554
555  @param  ControllerHandle[in]  The handle of a controller that the driver
556                                specified by This is managing.  This handle
557                                specifies the controller whose name is to be
558                                returned.
559
560  @param  ChildHandle[in]       The handle of the child controller to retrieve
561                                the name of.  This is an optional parameter that
562                                may be NULL.  It will be NULL for device
563                                drivers.  It will also be NULL for a bus drivers
564                                that wish to retrieve the name of the bus
565                                controller.  It will not be NULL for a bus
566                                driver that wishes to retrieve the name of a
567                                child controller.
568
569  @param  Language[in]          A pointer to a Null-terminated ASCII string
570                                array indicating the language.  This is the
571                                language of the driver name that the caller is
572                                requesting, and it must match one of the
573                                languages specified in SupportedLanguages. The
574                                number of languages supported by a driver is up
575                                to the driver writer. Language is specified in
576                                RFC 4646 or ISO 639-2 language code format.
577
578  @param  ControllerName[out]   A pointer to the Unicode string to return.
579                                This Unicode string is the name of the
580                                controller specified by ControllerHandle and
581                                ChildHandle in the language specified by
582                                Language from the point of view of the driver
583                                specified by This.
584
585  @retval EFI_SUCCESS           The Unicode string for the user readable name in
586                                the language specified by Language for the
587                                driver specified by This was returned in
588                                DriverName.
589
590  @retval EFI_INVALID_PARAMETER ControllerHandle is NULL.
591
592  @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
593                                EFI_HANDLE.
594
595  @retval EFI_INVALID_PARAMETER Language is NULL.
596
597  @retval EFI_INVALID_PARAMETER ControllerName is NULL.
598
599  @retval EFI_UNSUPPORTED       The driver specified by This is not currently
600                                managing the controller specified by
601                                ControllerHandle and ChildHandle.
602
603  @retval EFI_UNSUPPORTED       The driver specified by This does not support
604                                the language specified by Language.
605
606**/
607EFI_STATUS
608EFIAPI
609FvSimpleFileSystemComponentNameGetControllerName (
610  IN  EFI_COMPONENT_NAME_PROTOCOL                     *This,
611  IN  EFI_HANDLE                                      ControllerHandle,
612  IN  EFI_HANDLE                                      ChildHandle        OPTIONAL,
613  IN  CHAR8                                           *Language,
614  OUT CHAR16                                          **ControllerName
615  );
616
617extern EFI_UNICODE_COLLATION_PROTOCOL  *mUnicodeCollation;
618extern EFI_FILE_PROTOCOL               mFileSystemTemplate;
619extern EFI_COMPONENT_NAME_PROTOCOL     gFvSimpleFileSystemComponentName;
620extern EFI_COMPONENT_NAME2_PROTOCOL    gFvSimpleFileSystemComponentName2;
621
622#endif
623