/** @file The header file of RamDiskDxe driver. Copyright (c) 2016, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ #ifndef _RAM_DISK_IMPL_H_ #define _RAM_DISK_IMPL_H_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "RamDiskNVData.h" /// /// RAM disk general definitions and declarations /// // // Block size for RAM disk // #define RAM_DISK_BLOCK_SIZE 512 // // Iterate through the double linked list. NOT delete safe // #define EFI_LIST_FOR_EACH(Entry, ListHead) \ for(Entry = (ListHead)->ForwardLink; Entry != (ListHead); Entry = Entry->ForwardLink) // // Iterate through the double linked list. This is delete-safe. // Do not touch NextEntry // #define EFI_LIST_FOR_EACH_SAFE(Entry, NextEntry, ListHead) \ for(Entry = (ListHead)->ForwardLink, NextEntry = Entry->ForwardLink;\ Entry != (ListHead); Entry = NextEntry, NextEntry = Entry->ForwardLink) // // RamDiskDxe driver maintains a list of registered RAM disks. // extern LIST_ENTRY RegisteredRamDisks; // // Pointers to the EFI_ACPI_TABLE_PROTOCOL and EFI_ACPI_SDT_PROTOCOL. // extern EFI_ACPI_TABLE_PROTOCOL *mAcpiTableProtocol; extern EFI_ACPI_SDT_PROTOCOL *mAcpiSdtProtocol; // // RAM Disk create method. // typedef enum _RAM_DISK_CREATE_METHOD { RamDiskCreateOthers = 0, RamDiskCreateHii } RAM_DISK_CREATE_METHOD; // // RamDiskDxe driver maintains a list of registered RAM disks. // The struct contains the list entry and the information of each RAM // disk // typedef struct { UINTN Signature; EFI_HANDLE Handle; EFI_BLOCK_IO_PROTOCOL BlockIo; EFI_BLOCK_IO2_PROTOCOL BlockIo2; EFI_BLOCK_IO_MEDIA Media; EFI_DEVICE_PATH_PROTOCOL *DevicePath; UINT64 StartingAddr; UINT64 Size; EFI_GUID TypeGuid; UINT16 InstanceNumber; RAM_DISK_CREATE_METHOD CreateMethod; BOOLEAN InNfit; EFI_QUESTION_ID CheckBoxId; BOOLEAN CheckBoxChecked; LIST_ENTRY ThisInstance; } RAM_DISK_PRIVATE_DATA; #define RAM_DISK_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('R', 'D', 'S', 'K') #define RAM_DISK_PRIVATE_FROM_BLKIO(a) CR (a, RAM_DISK_PRIVATE_DATA, BlockIo, RAM_DISK_PRIVATE_DATA_SIGNATURE) #define RAM_DISK_PRIVATE_FROM_BLKIO2(a) CR (a, RAM_DISK_PRIVATE_DATA, BlockIo2, RAM_DISK_PRIVATE_DATA_SIGNATURE) #define RAM_DISK_PRIVATE_FROM_THIS(a) CR (a, RAM_DISK_PRIVATE_DATA, ThisInstance, RAM_DISK_PRIVATE_DATA_SIGNATURE) /// /// RAM disk HII-related definitions and declarations /// // // Tool generated IFR binary data and String package data // extern UINT8 RamDiskHiiBin[]; extern UINT8 RamDiskDxeStrings[]; typedef struct { VENDOR_DEVICE_PATH VendorDevicePath; EFI_DEVICE_PATH_PROTOCOL End; } HII_VENDOR_DEVICE_PATH; typedef struct { UINTN Signature; RAM_DISK_CONFIGURATION ConfigStore; EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccess; EFI_HANDLE DriverHandle; EFI_HII_HANDLE HiiHandle; } RAM_DISK_CONFIG_PRIVATE_DATA; extern RAM_DISK_CONFIG_PRIVATE_DATA mRamDiskConfigPrivateDataTemplate; #define RAM_DISK_CONFIG_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('R', 'C', 'F', 'G') #define RAM_DISK_CONFIG_PRIVATE_FROM_THIS(a) CR (a, RAM_DISK_CONFIG_PRIVATE_DATA, ConfigAccess, RAM_DISK_CONFIG_PRIVATE_DATA_SIGNATURE) /** Register a RAM disk with specified address, size and type. @param[in] RamDiskBase The base address of registered RAM disk. @param[in] RamDiskSize The size of registered RAM disk. @param[in] RamDiskType The type of registered RAM disk. The GUID can be any of the values defined in section 9.3.6.9, or a vendor defined GUID. @param[in] ParentDevicePath Pointer to the parent device path. If there is no parent device path then ParentDevicePath is NULL. @param[out] DevicePath On return, points to a pointer to the device path of the RAM disk device. If ParentDevicePath is not NULL, the returned DevicePath is created by appending a RAM disk node to the parent device path. If ParentDevicePath is NULL, the returned DevicePath is a RAM disk device path without appending. This function is responsible for allocating the buffer DevicePath with the boot service AllocatePool(). @retval EFI_SUCCESS The RAM disk is registered successfully. @retval EFI_INVALID_PARAMETER DevicePath or RamDiskType is NULL. RamDiskSize is 0. @retval EFI_ALREADY_STARTED A Device Path Protocol instance to be created is already present in the handle database. @retval EFI_OUT_OF_RESOURCES The RAM disk register operation fails due to resource limitation. **/ EFI_STATUS EFIAPI RamDiskRegister ( IN UINT64 RamDiskBase, IN UINT64 RamDiskSize, IN EFI_GUID *RamDiskType, IN EFI_DEVICE_PATH *ParentDevicePath OPTIONAL, OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath ); /** Unregister a RAM disk specified by DevicePath. @param[in] DevicePath A pointer to the device path that describes a RAM Disk device. @retval EFI_SUCCESS The RAM disk is unregistered successfully. @retval EFI_INVALID_PARAMETER DevicePath is NULL. @retval EFI_UNSUPPORTED The device specified by DevicePath is not a valid ramdisk device path and not supported by the driver. @retval EFI_NOT_FOUND The RAM disk pointed by DevicePath doesn't exist. **/ EFI_STATUS EFIAPI RamDiskUnregister ( IN EFI_DEVICE_PATH_PROTOCOL *DevicePath ); /** Initialize the BlockIO protocol of a RAM disk device. @param[in] PrivateData Points to RAM disk private data. **/ VOID RamDiskInitBlockIo ( IN RAM_DISK_PRIVATE_DATA *PrivateData ); /** Reset the Block Device. @param[in] This Indicates a pointer to the calling context. @param[in] ExtendedVerification Driver may perform diagnostics on reset. @retval EFI_SUCCESS The device was reset. @retval EFI_DEVICE_ERROR The device is not functioning properly and could not be reset. **/ EFI_STATUS EFIAPI RamDiskBlkIoReset ( IN EFI_BLOCK_IO_PROTOCOL *This, IN BOOLEAN ExtendedVerification ); /** Read BufferSize bytes from Lba into Buffer. @param[in] This Indicates a pointer to the calling context. @param[in] MediaId Id of the media, changes every time the media is replaced. @param[in] Lba The starting Logical Block Address to read from. @param[in] BufferSize Size of Buffer, must be a multiple of device block size. @param[out] Buffer A pointer to the destination buffer for the data. The caller is responsible for either having implicit or explicit ownership of the buffer. @retval EFI_SUCCESS The data was read correctly from the device. @retval EFI_DEVICE_ERROR The device reported an error while performing the read. @retval EFI_NO_MEDIA There is no media in the device. @retval EFI_MEDIA_CHANGED The MediaId does not matched the current device. @retval EFI_BAD_BUFFER_SIZE The Buffer was not a multiple of the block size of the device. @retval EFI_INVALID_PARAMETER The read request contains LBAs that are not valid, or the buffer is not on proper alignment. **/ EFI_STATUS EFIAPI RamDiskBlkIoReadBlocks ( IN EFI_BLOCK_IO_PROTOCOL *This, IN UINT32 MediaId, IN EFI_LBA Lba, IN UINTN BufferSize, OUT VOID *Buffer ); /** Write BufferSize bytes from Lba into Buffer. @param[in] This Indicates a pointer to the calling context. @param[in] MediaId The media ID that the write request is for. @param[in] Lba The starting logical block address to be written. The caller is responsible for writing to only legitimate locations. @param[in] BufferSize Size of Buffer, must be a multiple of device block size. @param[in] Buffer A pointer to the source buffer for the data. @retval EFI_SUCCESS The data was written correctly to the device. @retval EFI_WRITE_PROTECTED The device can not be written to. @retval EFI_DEVICE_ERROR The device reported an error while performing the write. @retval EFI_NO_MEDIA There is no media in the device. @retval EFI_MEDIA_CHNAGED The MediaId does not matched the current device. @retval EFI_BAD_BUFFER_SIZE The Buffer was not a multiple of the block size of the device. @retval EFI_INVALID_PARAMETER The write request contains LBAs that are not valid, or the buffer is not on proper alignment. **/ EFI_STATUS EFIAPI RamDiskBlkIoWriteBlocks ( IN EFI_BLOCK_IO_PROTOCOL *This, IN UINT32 MediaId, IN EFI_LBA Lba, IN UINTN BufferSize, IN VOID *Buffer ); /** Flush the Block Device. @param[in] This Indicates a pointer to the calling context. @retval EFI_SUCCESS All outstanding data was written to the device. @retval EFI_DEVICE_ERROR The device reported an error while writting back the data @retval EFI_NO_MEDIA There is no media in the device. **/ EFI_STATUS EFIAPI RamDiskBlkIoFlushBlocks ( IN EFI_BLOCK_IO_PROTOCOL *This ); /** Resets the block device hardware. @param[in] This The pointer of EFI_BLOCK_IO2_PROTOCOL. @param[in] ExtendedVerification The flag about if extend verificate. @retval EFI_SUCCESS The device was reset. @retval EFI_DEVICE_ERROR The block device is not functioning correctly and could not be reset. **/ EFI_STATUS EFIAPI RamDiskBlkIo2Reset ( IN EFI_BLOCK_IO2_PROTOCOL *This, IN BOOLEAN ExtendedVerification ); /** Reads the requested number of blocks from the device. @param[in] This Indicates a pointer to the calling context. @param[in] MediaId The media ID that the read request is for. @param[in] Lba The starting logical block address to read from on the device. @param[in, out] Token A pointer to the token associated with the transaction. @param[in] BufferSize The size of the Buffer in bytes. This must be a multiple of the intrinsic block size of the device. @param[out] Buffer A pointer to the destination buffer for the data. The caller is responsible for either having implicit or explicit ownership of the buffer. @retval EFI_SUCCESS The read request was queued if Token->Event is not NULL. The data was read correctly from the device if the Token->Event is NULL. @retval EFI_DEVICE_ERROR The device reported an error while attempting to perform the read operation. @retval EFI_NO_MEDIA There is no media in the device. @retval EFI_MEDIA_CHANGED The MediaId is not for the current media. @retval EFI_BAD_BUFFER_SIZE The BufferSize parameter is not a multiple of the intrinsic block size of the device. @retval EFI_INVALID_PARAMETER The read request contains LBAs that are not valid, or the buffer is not on proper alignment. @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources. **/ EFI_STATUS EFIAPI RamDiskBlkIo2ReadBlocksEx ( IN EFI_BLOCK_IO2_PROTOCOL *This, IN UINT32 MediaId, IN EFI_LBA Lba, IN OUT EFI_BLOCK_IO2_TOKEN *Token, IN UINTN BufferSize, OUT VOID *Buffer ); /** Writes a specified number of blocks to the device. @param[in] This Indicates a pointer to the calling context. @param[in] MediaId The media ID that the write request is for. @param[in] Lba The starting logical block address to be written. The caller is responsible for writing to only legitimate locations. @param[in, out] Token A pointer to the token associated with the transaction. @param[in] BufferSize The size in bytes of Buffer. This must be a multiple of the intrinsic block size of the device. @param[in] Buffer A pointer to the source buffer for the data. @retval EFI_SUCCESS The write request was queued if Event is not NULL. The data was written correctly to the device if the Event is NULL. @retval EFI_WRITE_PROTECTED The device cannot be written to. @retval EFI_NO_MEDIA There is no media in the device. @retval EFI_MEDIA_CHANGED The MediaId is not for the current media. @retval EFI_DEVICE_ERROR The device reported an error while attempting to perform the write operation. @retval EFI_BAD_BUFFER_SIZE The BufferSize parameter is not a multiple of the intrinsic block size of the device. @retval EFI_INVALID_PARAMETER The write request contains LBAs that are not valid, or the buffer is not on proper alignment. @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources. **/ EFI_STATUS EFIAPI RamDiskBlkIo2WriteBlocksEx ( IN EFI_BLOCK_IO2_PROTOCOL *This, IN UINT32 MediaId, IN EFI_LBA Lba, IN OUT EFI_BLOCK_IO2_TOKEN *Token, IN UINTN BufferSize, IN VOID *Buffer ); /** Flushes all modified data to a physical block device. @param[in] This Indicates a pointer to the calling context. @param[in, out] Token A pointer to the token associated with the transaction. @retval EFI_SUCCESS The flush request was queued if Event is not NULL. All outstanding data was written correctly to the device if the Event is NULL. @retval EFI_DEVICE_ERROR The device reported an error while attempting to write data. @retval EFI_WRITE_PROTECTED The device cannot be written to. @retval EFI_NO_MEDIA There is no media in the device. @retval EFI_MEDIA_CHANGED The MediaId is not for the current media. @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources. **/ EFI_STATUS EFIAPI RamDiskBlkIo2FlushBlocksEx ( IN EFI_BLOCK_IO2_PROTOCOL *This, IN OUT EFI_BLOCK_IO2_TOKEN *Token ); /** This function publish the RAM disk configuration Form. @param[in, out] ConfigPrivateData Points to RAM disk configuration private data. @retval EFI_SUCCESS HII Form is installed successfully. @retval EFI_OUT_OF_RESOURCES Not enough resource for HII Form installation. @retval Others Other errors as indicated. **/ EFI_STATUS InstallRamDiskConfigForm ( IN OUT RAM_DISK_CONFIG_PRIVATE_DATA *ConfigPrivateData ); /** This function removes RAM disk configuration Form. @param[in, out] ConfigPrivateData Points to RAM disk configuration private data. **/ VOID UninstallRamDiskConfigForm ( IN OUT RAM_DISK_CONFIG_PRIVATE_DATA *ConfigPrivateData ); /** Unregister all registered RAM disks. **/ VOID UnregisterAllRamDisks ( VOID ); /** This function allows a caller to extract the current configuration for one or more named elements from the target driver. @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. @param[in] Request A null-terminated Unicode string in format. @param[out] Progress On return, points to a character in the Request string. Points to the string's null terminator if request was successful. Points to the most recent '&' before the first failing name/value pair (or the beginning of the string if the failure is in the first name/value pair) if the request was not successful. @param[out] Results A null-terminated Unicode string in format which has all values filled in for the names in the Request string. String to be allocated by the called function. @retval EFI_SUCCESS The Results is filled with the requested values. @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results. @retval EFI_INVALID_PARAMETER Request is illegal syntax, or unknown name. @retval EFI_NOT_FOUND Routing data doesn't match any storage in this driver. **/ EFI_STATUS EFIAPI RamDiskExtractConfig ( IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, IN CONST EFI_STRING Request, OUT EFI_STRING *Progress, OUT EFI_STRING *Results ); /** This function processes the results of changes in configuration. @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. @param[in] Configuration A null-terminated Unicode string in format. @param[out] Progress A pointer to a string filled in with the offset of the most recent '&' before the first failing name/value pair (or the beginning of the string if the failure is in the first name/value pair) or the terminating NULL if all was successful. @retval EFI_SUCCESS The Results is processed successfully. @retval EFI_INVALID_PARAMETER Configuration is NULL. @retval EFI_NOT_FOUND Routing data doesn't match any storage in this driver. **/ EFI_STATUS EFIAPI RamDiskRouteConfig ( IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, IN CONST EFI_STRING Configuration, OUT EFI_STRING *Progress ); /** This function processes the results of changes in configuration. @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. @param[in] Action Specifies the type of action taken by the browser. @param[in] QuestionId A unique value which is sent to the original exporting driver so that it can identify the type of data to expect. @param[in] Type The type of value for the question. @param[in] Value A pointer to the data being sent to the original exporting driver. @param[out] ActionRequest On return, points to the action requested by the callback function. @retval EFI_SUCCESS The callback successfully handled the action. @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the variable and its data. @retval EFI_DEVICE_ERROR The variable could not be saved. @retval EFI_UNSUPPORTED The specified Action is not supported by the callback. **/ EFI_STATUS EFIAPI RamDiskCallback ( IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, IN EFI_BROWSER_ACTION Action, IN EFI_QUESTION_ID QuestionId, IN UINT8 Type, IN EFI_IFR_TYPE_VALUE *Value, OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest ); /** This function gets the file information from an open file descriptor, and stores it in a buffer allocated from pool. @param[in] FHand File Handle. @return A pointer to a buffer with file information or NULL is returned. **/ EFI_FILE_INFO * FileInfo ( IN EFI_FILE_HANDLE FHand ); /** This function will open a file or directory referenced by DevicePath. This function opens a file with the open mode according to the file path. The Attributes is valid only for EFI_FILE_MODE_CREATE. @param[in, out] FilePath On input, the device path to the file. On output, the remaining device path. @param[out] FileHandle Pointer to the file handle. @param[in] OpenMode The mode to open the file with. @param[in] Attributes The file's file attributes. @retval EFI_SUCCESS The information was set. @retval EFI_INVALID_PARAMETER One of the parameters has an invalid value. @retval EFI_UNSUPPORTED Could not open the file path. @retval EFI_NOT_FOUND The specified file could not be found on the device or the file system could not be found on the device. @retval EFI_NO_MEDIA The device has no medium. @retval EFI_MEDIA_CHANGED The device has a different medium in it or the medium is no longer supported. @retval EFI_DEVICE_ERROR The device reported an error. @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted. @retval EFI_WRITE_PROTECTED The file or medium is write protected. @retval EFI_ACCESS_DENIED The file was opened read only. @retval EFI_OUT_OF_RESOURCES Not enough resources were available to open the file. @retval EFI_VOLUME_FULL The volume is full. **/ EFI_STATUS EFIAPI OpenFileByDevicePath( IN OUT EFI_DEVICE_PATH_PROTOCOL **FilePath, OUT EFI_FILE_HANDLE *FileHandle, IN UINT64 OpenMode, IN UINT64 Attributes ); /** Publish the RAM disk NVDIMM Firmware Interface Table (NFIT) to the ACPI table. @param[in] PrivateData Points to RAM disk private data. @retval EFI_SUCCESS The RAM disk NFIT has been published. @retval others The RAM disk NFIT has not been published. **/ EFI_STATUS RamDiskPublishNfit ( IN RAM_DISK_PRIVATE_DATA *PrivateData ); #endif