Created
June 24, 2020 19:24
-
-
Save samm-git/d4d7ba9929ff7d2c134251481505f544 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Copyright (c) 1998-2020 Apple Inc. All rights reserved. | |
* | |
* @APPLE_LICENSE_HEADER_START@ | |
* | |
* This file contains Original Code and/or Modifications of Original Code | |
* as defined in and that are subject to the Apple Public Source License | |
* Version 2.0 (the 'License'). You may not use this file except in | |
* compliance with the License. Please obtain a copy of the License at | |
* http://www.opensource.apple.com/apsl/ and read it before using this | |
* file. | |
* | |
* The Original Code and all software distributed under the License are | |
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER | |
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, | |
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, | |
* FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. | |
* Please see the License for the specific language governing rights and | |
* limitations under the License. | |
* | |
* @APPLE_LICENSE_HEADER_END@ | |
*/ | |
#ifndef __NVME_SMART_LIB_EXTERNAL_H__ | |
#define __NVME_SMART_LIB_EXTERNAL_H__ | |
/*! @defined kIOPropertySMARTCapableKey | |
@discussion Property to search for in IORegistry to find NVMe SMART capable devices | |
without hardcoding the search to a particular device class. */ | |
#define kIOPropertyNVMeSMARTCapableKey "NVMe SMART Capable" | |
#include <IOKit/IOReturn.h> | |
#include <IOKit/IOTypes.h> | |
#if !KERNEL | |
#include <CoreFoundation/CFPlugIn.h> | |
#if COREFOUNDATION_CFPLUGINCOM_SEPARATE | |
#include <CoreFoundation/CFPlugInCOM.h> | |
#endif | |
#include <IOKit/IOCFPlugIn.h> | |
#ifdef __cplusplus | |
extern "C" { | |
#endif | |
/*! @header NVMeSMARTLib | |
NVMeSMARTLib implements non-kernel task access to NVMe SMART data. | |
*/ | |
/* 68413F59-268A-4787-BC48-7F9960235647 */ | |
/*! @defined kIONVMeSMARTLibFactoryID | |
@discussion UUID for the IONVMeSMARTInterface Factory. */ | |
#define kIONVMeSMARTLibFactoryID CFUUIDGetConstantUUIDWithBytes(NULL, \ | |
0x68, 0x41, 0x3F, 0x59, 0x26, 0x8A, 0x47, 0x87, \ | |
0xBC, 0x48, 0x7F, 0x99, 0x60, 0x23, 0x56, 0x47) | |
/* AA0FA6F9-C2D6-457F-B10B-59A13253292F */ | |
/*! @defined kIONVMeSMARTUserClientTypeID | |
@discussion Factory ID for creating an NVMe SMART user client. */ | |
#define kIONVMeSMARTUserClientTypeID CFUUIDGetConstantUUIDWithBytes(NULL, \ | |
0xAA, 0x0F, 0xA6, 0xF9, 0xC2, 0xD6, 0x45, 0x7F, \ | |
0xB1, 0x0B, 0x59, 0xA1, 0x32, 0x53, 0x29, 0x2F) | |
/* CCD1DB19-FD9A-4DAF-BF95-12454B230AB6 */ | |
/*! @defined kIONVMeSMARTInterfaceID | |
@discussion InterfaceID for IONVMeSMARTInterface. */ | |
#define kIONVMeSMARTInterfaceID CFUUIDGetConstantUUIDWithBytes(NULL, \ | |
0xCC, 0xD1, 0xDB, 0x19, 0xFD, 0x9A, 0x4D, 0xAF, \ | |
0xBF, 0x95, 0x12, 0x45, 0x4B, 0x23, 0x0A, 0xB6) | |
#endif /* !KERNEL */ | |
enum | |
{ | |
kNVMeIdentifyControllerSerialNumberLen = 20, | |
kNVMeIdentifyControllerModelNumberLen = 40, | |
kNVMeIdentifyControllerFirmwareRevisionLen = 8, | |
kNVMeIdentifyControllerIEEEOUIIDLen = 3, | |
}; | |
#pragma pack(1) | |
typedef struct NVMePowerStateDescriptor | |
{ | |
uint16_t MAXIMUM_POWER; | |
uint8_t RESERVED1[2]; | |
uint32_t ENTRY_LATENCY; | |
uint32_t EXIT_LATENCY; | |
uint8_t RELATIVE_READ_THROUGHPUT; | |
uint8_t RELATIVE_READ_LATENCY; | |
uint8_t RELATIVE_WRITE_THROUGHPUT; | |
uint8_t RELATIVE_WRITE_LATENCY; | |
uint8_t RESERVED2[16]; | |
} NVMePowerStateDescriptor; | |
typedef struct NVMeIdentifyControllerStruct | |
{ | |
// Controller Capabilites and Features | |
uint16_t PCI_VID; | |
uint16_t PCI_SSVID; | |
uint8_t SERIAL_NUMBER[kNVMeIdentifyControllerSerialNumberLen]; | |
uint8_t MODEL_NUMBER[kNVMeIdentifyControllerModelNumberLen]; | |
uint8_t FW_REVISION[kNVMeIdentifyControllerFirmwareRevisionLen]; | |
uint8_t RECOMMENDED_ARBITRATION_BURST; | |
uint8_t IEEE_OUI_ID[kNVMeIdentifyControllerIEEEOUIIDLen]; | |
uint8_t MIC; | |
uint8_t MAX_DATA_TRANSFER_SIZE; | |
uint16_t CONTROLLER_ID; | |
uint8_t RESERVED1[176]; | |
// Admin Command Set Attributes | |
uint16_t OPTIONAL_ADMIN_COMMAND_SUPPORT; | |
uint8_t ABORT_COMMAND_LIMIT; | |
uint8_t ASYNC_EVENT_REQUEST_LIMIT; | |
uint8_t FW_UPDATES; | |
uint8_t LOG_PAGE_ATTR; | |
uint8_t ERROR_LOG_PAGE_ENTRIES; | |
uint8_t NUM_OF_POWER_STATE_SUPPORT; | |
uint8_t ADMIN_VENDOR_SPECIFIC_COMMAND_CONFIG; | |
uint8_t AUTONOMOUS_POWER_STATE_TRANSITION_ATTR; | |
uint8_t RESERVED2[246]; | |
// NVM Command Set Attributes | |
uint8_t SQ_ENTRY_SIZE; | |
uint8_t CQ_ENTRY_SIZE; | |
uint8_t RESERVED3[2]; | |
uint32_t NUM_OF_NAMESPACES; | |
uint16_t OPTIONAL_NVM_COMMAND_SUPPORT; | |
uint16_t FUSE_OP_SUPPORT; | |
uint8_t FORMAT_NVM_ATTR; | |
uint8_t VOLATILE_WRITE_CACHE; | |
uint16_t ATOMIC_WRITE_UNIT_NORMAL; | |
uint16_t ATOMIC_WRITE_UNIT_POWER_FAIL; | |
uint8_t NVM_VENDOR_SPECIFIC_COMMAND_CONFIG; | |
uint8_t RESERVED4[1]; | |
uint16_t ATOMIC_COMPARE_AND_WRITE_UNIT; | |
uint8_t RESERVED5[2]; | |
uint32_t SGL_SUPPORT; | |
uint8_t RESERVED6[164]; | |
// I/O Command Set Attributes | |
uint8_t RESERVED7[1344]; | |
// Power State Descriptors | |
NVMePowerStateDescriptor POWER_STATE_DESCRIPTORS[32]; | |
uint8_t RESERVED8[1024]; | |
} NVMeIdentifyControllerStruct; | |
typedef struct NVMeLBAFormatDataStruct | |
{ | |
uint16_t METADATA_SIZE; | |
uint8_t LBA_DATA_SIZE; | |
uint8_t RELATIVE_PERFORMANCE; | |
} NVMeLBAFormatDataStruct; | |
typedef struct NVMeIdentifyNamespaceStruct | |
{ | |
uint64_t NAMESPACE_SIZE; | |
uint64_t NAMESPACE_CAPACITY; | |
uint64_t NAMESPACE_UTILIZATION; | |
uint8_t NAMESPACE_FEATURES; | |
uint8_t NUM_OF_LBA_FORMATS; | |
uint8_t FORMATTED_LBA_SIZE; | |
uint8_t METADATA_CAPS; | |
uint8_t E2E_DATA_PROTECTION_CAPS; | |
uint8_t E2E_DATA_PROTECTION_TYPE_SETTINGS; | |
uint8_t NS_MULTIPATH_IO_AND_NS_SHARING_CAPS; | |
uint8_t RESERVATION_CAPABILITIES; | |
uint8_t RESERVED1[88]; | |
uint64_t IEEE_EXTENDED_UID; | |
NVMeLBAFormatDataStruct LBA_FORMATS[16]; | |
uint8_t RESERVED2[192]; | |
// Vendor Specific Stuff | |
uint8_t NSTYPE; | |
uint8_t VENDOR_SPECIFIC[3711]; | |
} NVMeIdentifyNamespaceStruct; | |
typedef struct NVMeSMARTData | |
{ | |
uint8_t CRITICAL_WARNING; | |
uint16_t TEMPERATURE; | |
uint8_t AVAILABLE_SPARE; | |
uint8_t AVAILABLE_SPARE_THRESHOLD; | |
uint8_t PERCENTAGE_USED; | |
uint8_t RESERVED1[26]; | |
uint64_t DATA_UNITS_READ[2]; | |
uint64_t DATA_UNITS_WRITTEN[2]; | |
uint64_t HOST_READ_COMMANDS[2]; | |
uint64_t HOST_WRITE_COMMANDS[2]; | |
uint64_t CONTROLLER_BUSY_TIME[2]; | |
uint64_t POWER_CYCLES[2]; | |
uint64_t POWER_ON_HOURS[2]; | |
uint64_t UNSAFE_SHUTDOWNS[2]; | |
uint64_t MEDIA_ERRORS[2]; | |
uint64_t NUM_ERROR_INFO_LOG_ENTRIES[2]; | |
uint8_t RESERVED2[320]; | |
} NVMeSMARTData; | |
#pragma options align=reset | |
#if !KERNEL | |
typedef struct IONVMeSMARTInterface | |
{ | |
IUNKNOWN_C_GUTS; | |
UInt16 version; | |
UInt16 revision; | |
/*! | |
@function SMARTReadData | |
@abstract Retrieves 512 byte device SMART data structure. | |
@discussion See section 5.10.1.2 of NVM Express revision 1.0c. | |
@param data Pointer to a SMART data buffer. | |
@return kIOReturnNoResources If memory allocation failed. | |
@return kIOReturnBadArgument Invalid argument passed. | |
@return kIOReturnOffline Device is offline. | |
@return kIOReturnSuccess Success. | |
*/ | |
IOReturn ( *SMARTReadData ) ( void * interface, NVMeSMARTData * data ); | |
/*! | |
@function GetIdentifyData | |
@abstract Retrieves a 4K device or namespace identify data buffer. | |
@discussion See section 5.11 of NVM Express revision 1.0c. | |
@param data Pointer to either an controller or namespace identify strucutre. | |
@param inNamspace Namespace ID or 0 for controller identify data. | |
@return kIOReturnNoResources If memory allocation failed. | |
@return kIOReturnBadArgument Invalid argument passed. | |
@return kIOReturnOffline Device is offline. | |
@return kIOReturnSuccess Success. | |
*/ | |
IOReturn ( *GetIdentifyData ) ( void * interface, void * data, uint32_t inNamespace ); | |
UInt64 reserved0; | |
UInt64 reserved1; | |
/*! | |
@function GetLogPage | |
@abstract Retrieves a log page. | |
@discussion See section 5.10 of NVM Express revision 1.0c. | |
@param data Pointer to buffer that will contain log page data. | |
@param inLogPageId Log page ID for this get log page command. | |
@param inNumDWords Number of dwords for log page data, zero based. | |
@return kIOReturnNoResources If memory allocation failed. | |
@return kIOReturnBadArgument Invalid argument passed. | |
@return kIOReturnOffline Device is offline. | |
@return kIOReturnSuccess Success. | |
*/ | |
IOReturn ( *GetLogPage ) ( void * interface, void * data, uint32_t inLogPageId, uint32_t inNumDWords ); | |
UInt64 reserved2; | |
UInt64 reserved3; | |
UInt64 reserved4; | |
UInt64 reserved5; | |
UInt64 reserved6; | |
UInt64 reserved7; | |
UInt64 reserved8; | |
UInt64 reserved9; | |
UInt64 reserved10; | |
UInt64 reserved11; | |
UInt64 reserved12; | |
UInt64 reserved13; | |
UInt64 reserved14; | |
UInt64 reserved15; | |
UInt64 reserved16; | |
UInt64 reserved17; | |
UInt64 reserved18; | |
UInt64 reserved19; | |
} IONVMeSMARTInterface; | |
#ifdef __cplusplus | |
} | |
#endif | |
#endif /* !KERNEL */ | |
#endif /* __NVME_SMART_LIB_EXTERNAL_H__ */ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment