Newer
Older
AMI-Aptio-BIOS-Reversed / Nvme / Nvme.h
@Ajax Dong Ajax Dong 2 days ago 9 KB Init
/*
 * Nvme.h - NVMe Bus Driver for UEFI
 *
 * Source: e:\hs\AmiModulePkg\Nvme\NvmeBus.c
 * Build: HR6N0XMLK\DEBUG_VS2015\X64\AmiModulePkg\Nvme\Nvme\DEBUG\Nvme.pdb
 * Image size: 0x9880 bytes
 * Functions: 101
 * Imports: None (resolved via UEFI protocol database)
 *
 * This is a UEFI DXE driver that manages NVMe mass storage controllers.
 * It implements EFI_DRIVER_BINDING_PROTOCOL for NVMe controller detection,
 * and installs EFI_BLOCK_IO_PROTOCOL / EFI_DISK_IO_PROTOCOL per namespace.
 */

#ifndef __NVME_H__
#define __NVME_H__

#include <Uefi.h>
#include <Protocol/BlockIo.h>
#include <Protocol/DiskIo.h>
#include <Protocol/DevicePath.h>
#include <Protocol/DriverBinding.h>
#include <Protocol/ComponentName2.h>
#include <Protocol/DiskInfo.h>
#include <Protocol/StorageSecurityCommand.h>

#pragma pack(push, 1)

//
// NVMe Controller Context Structure (4920 bytes, allocated at i / qword_9040)
//
#define NVME_CONTEXT_SIGNATURE  0x494D535753  // "SWMSI" (MSIW reversed)
#define NVME_CONTEXT_SIZE       0x1338         // 4920 bytes
#define NVME_PRIVATE_DATA_SIZE  0x1000         // 4096 bytes
#define NVME_NAMESPACE_MAX      0x20           // 32 namespace entries

//
// Structure offset constants from code analysis (relative to context base)
//
#define NVME_CONTEXT_NS_LIST_LINK      0x190   // Offset to namespace linked list head (a1+400)
#define NVME_CONTEXT_NS_ENTRY_SIZE     0x438   // Size of each namespace structure (1080 bytes)
#define NVME_CONTEXT_NS_ID_OFFSET      0x4344  // *(ns_base - 1085*4) = namespace ID field (within entry)
#define NVME_CONTEXT_DEVICE_PATH       0x207   // Device path reference point
#define NVME_CONTEXT_NS_DEVICE_PATH    0x217   // Offset within ns entry for device path (a4+519)
#define NVME_CONTEXT_BLOCK_SIZE        0x8     // Block size in bytes (at base+16 = 8)
#define NVME_CONTEXT_MEDIA_INFO        0x18D   // Media info base
#define NVME_CONTEXT_CMD_BUF           0x8D    // Command buffer field

//
// NVMe Command Types
//
#define NVME_IO_READ                   0x00
#define NVME_IO_WRITE                  0x01
#define NVME_IO_FLUSH                  0x00
#define NVME_ADMIN_IDENTIFY            0x06
#define NVME_ADMIN_SECURITY_SEND       0x81
#define NVME_ADMIN_SECURITY_RECEIVE    0x82

//
// NVMe Queue Constants
//
#define NVME_ADMIN_QUEUE_SIZE          0x400  // 1024 entries
#define NVME_IO_QUEUE_SIZE             0x400
#define NVME_MAX_TRANSFER_LEN          0x40   // 64 sectors max
#define NVME_TIMEOUT_MS                0xF4240 // 1000000 ms

//
// Block I/O Media Types
//
#define NVME_MEDIA_TYPE                0x02   // Fixed media
#define NVME_MEDIA_TYPE_REMOVABLE      0x01   // Removable
#define NVME_BLOCK_SIZE                512    // Default block size
#define NVME_BLOCK_SIZE_4096           4096   // 4K native

//
// NVMe Controller Status
//
#define NVME_CSTS_RDY                  0x01   // Ready bit
#define NVME_CSTS_FATAL                0x02   // Fatal error
#define NVME_CSTS_SHST_MASK            0x0C   // Shutdown status mask

//
// Return Status Codes (UEFI style)
//
#define NVME_SUCCESS                   0x0000000000000000ULL
#define NVME_ERROR_UNSUPPORTED         0x8000000000000003ULL
#define NVME_ERROR_INVALID_PARAM       0x8000000000000002ULL
#define NVME_ERROR_NOT_FOUND           0x800000000000000EULL
#define NVME_ERROR_TIMEOUT             0x800000000000000FULL
#define NVME_ERROR_DEVICE              0x8000000000000009ULL
#define NVME_ERROR_ALREADY_STARTED     0x8000000000000014ULL

//
// Protocol GUIDs (AMI-proprietary and standard UEFI)
//
// AMI_NVME_DRIVER_BINDING_PROTOCOL_GUID
//   {3AA83745-9454-4F7A-A7C0-90DBD02FAB8E}
//
// Standard UEFI protocols used:
//   EFI_BLOCK_IO_PROTOCOL_GUID     {09576E91-6D3F-11D2-8E39-00A0C969723B}
//   EFI_BLOCK_IO2_PROTOCOL_GUID    {964E5B21-6459-11D2-8E39-00A0C969723B}
//   EFI_DISK_IO_PROTOCOL_GUID      {4CF5B200-68B8-4CA5-9EEC-B23E3F50029A}
//   EFI_DISK_IO2_PROTOCOL_GUID     {CE6F86BB-B800-4C71-B2D1-3897A3BC1DAE}
//   EFI_DEVICE_PATH_PROTOCOL_GUID  {18A031AB-B443-4D1A-A5C0-0C09261E9F71}
//   EFI_DISK_INFO_PROTOCOL_GUID    {AFA4CF3F-AF71-4C30-A4FB-2910E771F9B0}

#pragma pack(pop)

//
// Global Variables (defined in .data section)
//
extern EFI_HANDLE           gImageHandle;     // 0x9058 - Driver image handle (stored via UefiBootServicesTableLib)
extern EFI_SYSTEM_TABLE    *gST;              // 0x9048 - System table pointer
extern EFI_BOOT_SERVICES   *gBS;              // 0x9050 - Boot services pointer
extern EFI_RUNTIME_SERVICES *gRT;             // 0x9060 - Runtime services pointer
extern EFI_HANDLE           gImageHandle_0;   // 0x8FA0 - Driver image handle copy

//
// Driver Entry Point
//
EFI_STATUS
EFIAPI
NvmeDriverEntryPoint (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE *SystemTable
  );

//
// Driver Binding Protocol
//
EFI_STATUS
EFIAPI
NvmeDriverBindingSupported (
  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
  IN EFI_HANDLE                   ControllerHandle,
  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath
  );

EFI_STATUS
EFIAPI
NvmeDriverBindingStart (
  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
  IN EFI_HANDLE                   ControllerHandle,
  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath
  );

EFI_STATUS
EFIAPI
NvmeDriverBindingStop (
  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
  IN EFI_HANDLE                   ControllerHandle,
  IN UINTN                        NumberOfChildren,
  IN EFI_HANDLE                  *ChildHandleBuffer
  );

//
// Block I/O Functions
//
EFI_STATUS
EFIAPI
NvmeBlockIoReadBlocks (
  IN EFI_BLOCK_IO_PROTOCOL  *This,
  IN UINT32                  MediaId,
  IN EFI_LBA                 Lba,
  IN UINTN                   BufferSize,
  OUT VOID                  *Buffer
  );

EFI_STATUS
EFIAPI
NvmeBlockIoWriteBlocks (
  IN EFI_BLOCK_IO_PROTOCOL  *This,
  IN UINT32                  MediaId,
  IN EFI_LBA                 Lba,
  IN UINTN                   BufferSize,
  IN VOID                   *Buffer
  );

EFI_STATUS
EFIAPI
NvmeBlockIoFlushBlocks (
  IN EFI_BLOCK_IO_PROTOCOL  *This
  );

//
// Component Name Protocol
//
EFI_STATUS
EFIAPI
NvmeComponentNameGetDriverName (
  IN  EFI_COMPONENT_NAME2_PROTOCOL  *This,
  IN  CHAR8                        *Language,
  OUT CHAR16                      **DriverName
  );

EFI_STATUS
EFIAPI
NvmeComponentNameGetControllerName (
  IN  EFI_COMPONENT_NAME2_PROTOCOL  *This,
  IN  EFI_HANDLE                     ControllerHandle,
  IN  EFI_HANDLE                     ChildHandle,
  IN  CHAR8                         *Language,
  OUT CHAR16                       **ControllerName
  );

//
// Internal Functions
//
EFI_STATUS
NvmeDriverEntryInit (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE *SystemTable
  );

EFI_STATUS
NvmeInstallDriverBinding (
  IN EFI_HANDLE ImageHandle
  );

EFI_STATUS
NvmeCreateBlockIoForNamespace (
  IN EFI_HANDLE  ControllerHandle,
  IN VOID       *NvmeControllerContext,
  IN UINT32      NamespaceId
  );

EFI_STATUS
NvmeDetectController (
  IN EFI_HANDLE  ControllerHandle,
  OUT VOID     **NvmeControllerContext
  );

EFI_STATUS
NvmeConfigureController (
  IN EFI_HANDLE  ControllerHandle,
  IN VOID       *NvmeControllerContext
  );

EFI_STATUS
NvmeEnumerateNamespace (
  IN VOID    *NvmeControllerContext,
  IN UINT32   NamespaceId
  );

EFI_STATUS
NvmeGetIdentifyNamespaceData (
  IN VOID *NvmeControllerContext
  );

EFI_STATUS
NvmeSubmitAsyncCommand (
  IN VOID    *NvmeControllerContext,
  IN UINT8    NamespaceId,
  IN UINT32   CommandType
  );

EFI_STATUS
NvmeResetController (
  VOID
  );

EFI_STATUS
NvmeUnload (
  IN EFI_HANDLE ImageHandle
  );

EFI_STATUS
NvmePassThru (
  IN VOID    *NvmeControllerContext,
  IN UINT32   NamespaceId,
  IN UINT64   Lba,
  IN UINT64   Buffer,
  IN UINT64   Length
  );

EFI_STATUS
NvmePassThruWithBuffer (
  IN VOID    *NvmeControllerContext,
  IN UINT32   NamespaceId,
  IN UINT64   Lba,
  IN UINT64   Buffer
  );

EFI_STATUS
NvmeBlockIoReadWrite (
  IN VOID    *NvmeControllerContext,
  IN UINT32   MediaId,
  IN UINT64   Lba,
  IN UINTN    BufferSize,
  IN VOID    *Buffer,
  IN BOOLEAN  IsWrite
  );

EFI_STATUS
NvmeInstallSmmNotify (
  IN UINTN  SmmControlHandle
  );

EFI_STATUS
NvmeInstallLegacyDevice (
  IN VOID   *NvmeControllerContext,
  IN VOID   *ControllerHandle
  );

EFI_STATUS
NvmeStorageSecurityCommandDispatch (
  IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL  *This,
  IN UINT32                                  CommandType
  );

EFI_STATUS
NvmeNonBlockingPassThru (
  IN VOID    *NvmeControllerContext,
  IN UINT64   Lba,
  IN UINT64   Buffer,
  IN UINT64   Length
  );

EFI_STATUS
NvmeNonBlockingPassThruWithBuffer (
  IN VOID    *NvmeControllerContext,
  IN UINT64   Lba,
  IN UINT64   Buffer
  );

EFI_STATUS
NvmeGetNextBlockMediaInfo (
  IN VOID   *NvmeControllerContext,
  IN UINT32  MediaId
  );

EFI_STATUS
NvmeSendSecurityCommand (
  IN VOID    *NvmeControllerContext,
  IN UINT32   SecurityProtocolId,
  IN UINT32   TransferLength
  );

EFI_STATUS
NvmeRegisterDevicePath (
  IN EFI_HANDLE  ControllerHandle,
  IN VOID       *NvmeControllerContext,
  IN EFI_HANDLE  NamespaceHandle,
  IN VOID       *DevicePath
  );

EFI_STATUS
NvmeSecurityProtocolInOut (
  IN VOID    *NvmeControllerContext,
  IN VOID    *DataBuffer,
  IN BOOLEAN IsSend
  );

#endif /* __NVME_H__ */