Skip to content

Instantly share code, notes, and snippets.

@samm-git
Created June 24, 2020 19:24
Show Gist options
  • Save samm-git/d4d7ba9929ff7d2c134251481505f544 to your computer and use it in GitHub Desktop.
Save samm-git/d4d7ba9929ff7d2c134251481505f544 to your computer and use it in GitHub Desktop.
/*
* 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