/*
* 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__ */