Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/nvdimm/nvdimm_dsm.h
- This file was added.
/** | |||||
* Copyright 2020 Conrad Meyer <cem@FreeBSD.org>. All Rights Reserved. | |||||
* | |||||
* Permission is hereby granted, free of charge, to any person obtaining a copy | |||||
* of this software and associated documentation files (the "Software"), to | |||||
* deal in the Software without restriction, including without limitation the | |||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | |||||
* sell copies of the Software, and to permit persons to whom the Software is | |||||
* furnished to do so, subject to the following conditions: | |||||
* | |||||
* Be Gay | |||||
* Do Crimes | |||||
* The above copyright notice and this permission notice shall be included in | |||||
* all copies or substantial portions of the Software. | |||||
* | |||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | |||||
* IN THE SOFTWARE. | |||||
* | |||||
* $FreeBSD$ | |||||
*/ | |||||
#pragma once | |||||
/* | |||||
* Define the child device _DSM function index per the Microsoft model. Ref. | |||||
* <https://docs.microsoft.com/en-us/windows-hardware/drivers/storage/ | |||||
* -dsm-interface-for-byte-addressable-energy-backed-function-class--function | |||||
* -interface-1-> | |||||
*/ | |||||
#define MS_DSM_QUERY_IMPLEMENTED_FUNCTIONS 0x00 | |||||
#define MS_DSM_GET_NVDIMM_N_IDENTIFICATION 0x01 | |||||
#define MS_DSM_GET_SAVE_OPERATIONS_REQUIREMENTS 0x02 | |||||
#define MS_DSM_GET_ENERGY_SOURCE_IDENTIFICATION 0x03 | |||||
#define MS_DSM_GET_LAST_BACKUP_INFORMATION 0x04 | |||||
#define MS_DSM_GET_NVM_THRESHOLD 0x05 | |||||
#define MS_DSM_SET_NVM_LIFETIME_PERCENTAGE_WARNING_THRESHOLD 0x06 | |||||
#define MS_DSM_GET_ENERGY_SOURCE_THRESHOLD 0x07 | |||||
#define MS_DSM_SET_ENERGY_SOURCE_LIFETIME_WARNING 0x08 | |||||
#define MS_DSM_SET_ENERGY_SOURCE_TEMPERATURE_WARNING_THRESHOLD 0x09 | |||||
#define MS_DSM_GET_CRITICAL_HEALTH_INFO 0x0a | |||||
#define MS_DSM_GET_NVDIMM_N_HEALTH_INFO 0x0b | |||||
#define MS_DSM_GET_ENERGY_SOURCE_HEALTH_INFO 0x0c | |||||
#define MS_DSM_GET_OPERATIONAL_STATISTICS 0x0d | |||||
#define MS_DSM_GET_VENDOR_LOG_PAGE_SIZE 0x0e | |||||
#define MS_DSM_GET_VENDOR_LOG_PAGE 0x0f | |||||
#define MS_DSM_QUERY_ERROR_INJECTION_STATUS 0x10 | |||||
#define MS_DSM_INJECT_ERROR 0x11 | |||||
#define MS_DSM_GET_INJECTED_ERRORS 0x12 | |||||
#define MS_DSM_ERASE_NVM_IMAGE 0x13 | |||||
#define MS_DSM_ARM_NVDIMM_N 0x14 | |||||
#define MS_DSM_RESET_TO_FACTORY_DEFAULT 0x15 | |||||
#define MS_DSM_START_FIRMWARE_UPDATE 0x16 | |||||
#define MS_DSM_SEND_FIRMWARE_UPDATE_DATA 0x17 | |||||
#define MS_DSM_FINISH_FIRMWARE_UPDATE 0x18 | |||||
#define MS_DSM_SELECT_FIRMWARE_IMAGE_SLOT 0x19 | |||||
#define MS_DSM_GET_FIRMWARE_INFO 0x1a | |||||
#define MS_DSM_I2C_READ 0x1b | |||||
#define MS_DSM_I2C_WRITE 0x1c | |||||
#define MS_DSM_READ_TYPED_DATA 0x1d | |||||
#define MS_DSM_WRITE_TYPED_DATA 0x1e | |||||
#define MS_DSM_SET_MEMORY_ERROR_COUNTERS 0x1f | |||||
/* | |||||
* Ref. BABEI (JESD245B.01, Sept. 2017) | |||||
* 8.1.8.1 MODULE_HEALTH -- Offset 0xA0 | |||||
* Define MODULE_HEALTH flags. | |||||
*/ | |||||
#define NVDIMM_MODULE_HEALTH_NO_EVENT (0x00 << 0) | |||||
#define NVDIMM_MODULE_HEALTH_PERSISTENCY_LOST_ERROR (0x01 << 0) | |||||
#define NVDIMM_MODULE_HEALTH_WARNING_THRESHOLD_EXCEEDED (0x01 << 1) | |||||
#define NVDIMM_MODULE_HEALTH_PERSISTENCY_RESTORED (0x01 << 2) | |||||
#define NVDIMM_MODULE_HEALTH_BELOW_WARNING_THRESHOLD (0x01 << 3) | |||||
#define NVDIMM_MODULE_HEALTH_PERMANENT_HARDWARE_FAILURE (0x01 << 4) | |||||
#define NVDIMM_MODULE_HEALTH_EVENT_N_LOW (0x01 << 5) | |||||
#define NVDIMM_MODULE_HEALTH_EVENT_MASK 0x3F | |||||
/* | |||||
* Ref. BABEI (JESD245B.01, Sept. 2017) | |||||
* 8.1.8.2 MODULE_HEALTH_STATUS0 -- Offset 0xA1 | |||||
* Define MODULE_HEALTH_STATUS0 flags. | |||||
*/ | |||||
#define NVDIMM_MODULE_HEALTH_STATUS0_VOLTAGE_REGULATOR_FAILED (0x01 << 0) | |||||
#define NVDIMM_MODULE_HEALTH_STATUS0_VDD_LOST (0x01 << 1) | |||||
#define NVDIMM_MODULE_HEALTH_STATUS0_VPP_LOST (0x01 << 2) | |||||
#define NVDIMM_MODULE_HEALTH_STATUS0_VTT_LOST (0x01 << 3) | |||||
#define NVDIMM_MODULE_HEALTH_STATUS0_DRAM_NOT_SELF_REFRESH (0x01 << 4) | |||||
#define NVDIMM_MODULE_HEALTH_STATUS0_CONTROLLER_HARDWARE_ERROR (0x01 << 5) | |||||
#define NVDIMM_MODULE_HEALTH_STATUS0_NVM_CONTROLLER_ERROR (0x01 << 6) | |||||
#define NVDIMM_MODULE_HEALTH_STATUS0_NVM_LIFETIME_ERROR (0x01 << 7) | |||||
#define NVDIMM_MODULE_HEALTH_STATUS0_OFFSET 0xA1 | |||||
/* | |||||
* Ref. BABEI (JESD245B.01, Sept. 2017) | |||||
* 8.1.8.3 MODULE_HEALTH_STATUS1 -- Offset 0xA2 | |||||
* Define MODULE_HEALTH_STATUS1 flags. | |||||
*/ | |||||
#define NVDIMM_MODULE_HEALTH_STATUS1_NOT_ENOUGH_ENERGY_FOR_CSAVE (0x01 << 0) | |||||
#define NVDIMM_MODULE_HEALTH_STATUS1_INVALID_FIRMWARE_ERROR (0X01 << 1) | |||||
#define NVDIMM_MODULE_HEALTH_STATUS1_CONFIG_DATA_ERROR (0x01 << 2) | |||||
#define NVDIMM_MODULE_HEALTH_STATUS1_NO_ES_PRESENT (0x01 << 3) | |||||
#define NVDIMM_MODULE_HEALTH_STATUS1_POLICY_NOT_SET (0x01 << 4) | |||||
#define NVDIMM_MODULE_HEALTH_STATUS1_ES_HARDWARE_FAILURE (0x01 << 5) | |||||
#define NVDIMM_MODULE_HEALTH_STATUS1_HEALTH_ASSESS_ERROR (0X01 << 6) | |||||
#define NVDIMM_MODULE_HEALTH_STATUS1_OFFSET 0xA2 | |||||
#define NVDIMM_MODULE_HEALTH_STATUS0_SHIFT (NBBY * 0) | |||||
#define NVDIMM_MODULE_HEALTH_STATUS1_SHIFT (NBBY * 1) | |||||
/* | |||||
* Ref. BABEI (JESD245B.01, Sept. 2017) | |||||
* 8.1.8.4 ERROR_THRESHOLD_STATUS -- Offset 0xA5 | |||||
* Define ERROR_THRESHOLD_STATUS flags. | |||||
*/ | |||||
#define NVDIMM_ERROR_THRESHOLD_STATUS_NVM_LIFETIME_ERROR (0x01 << 0) | |||||
#define NVDIMM_ERROR_THRESHOLD_STATUS_ES_LIFETIME_ERROR (0x01 << 1) | |||||
#define NVDIMM_ERROR_THRESHOLD_STATUS_ES_TEMP_ERROR (0x01 << 2) | |||||
#define NVDIMM_ERROR_THRESHOLD_OFFSET 0xA5 | |||||
/* | |||||
* Ref. BABEI (JESD245B.01, Sept. 2017) | |||||
* 8.1.8.5 WARNING_THRESHOLD_STATUS -- Offset 0xA7 | |||||
* Define WARNING_THRESHOLD_STATUS flags. | |||||
*/ | |||||
#define NVDIMM_WARNING_THRESHOLD_STATUS_NVM_LIFETIME_WARNING (0x01 << 0) | |||||
#define NVDIMM_WARNING_THRESHOLD_STATUS_ES_LIFETIME_WARNING (0x01 << 1) | |||||
#define NVDIMM_WARNING_THRESHOLD_STATUS_ES_TEMP_WARNING (0x01 << 2) | |||||
#define NVDIMM_WARNING_THRESHOLD_OFFSET 0xA7 | |||||
struct nvdimm_critical_health_info { | |||||
/* | |||||
* These fields are defined according to Microsoft DSM Function Index | |||||
* 10 (Get Critical Health Info). | |||||
*/ | |||||
uint32_t status; | |||||
/* Byte 0 – MODULE_HEALTH (0, 0xA0) */ | |||||
uint8_t critical_health_info; | |||||
} __packed; | |||||
struct nvdimm_health_info { | |||||
/* | |||||
* These fields are defined according to Microsoft DSM Function Index | |||||
* 11 (Get NVDIMM-N Health Info). | |||||
*/ | |||||
uint32_t status; | |||||
/* Byte 0 – MODULE_HEALTH_STATUS0 (0, 0xA1) */ | |||||
/* Byte 1 – MODULE_HEALTH_STATUS1 (0, 0xA2) */ | |||||
uint16_t module_health; | |||||
uint16_t module_current_temp; | |||||
/* Byte 0 – ERROR_THRESHOLD_STATUS (0, 0xA5) */ | |||||
uint8_t error_threshold_status; | |||||
/* Byte 0 – WARNING_THRESHOLD_STATUS (0, 0xA7) */ | |||||
uint8_t warning_threshold_status; | |||||
/* Byte 0 – NVM_LIFETIME (0, 0xC0) */ | |||||
uint8_t nvm_lifetime; | |||||
/* Byte 0 – DRAM_ECC_ERROR_COUNT (2, 0x80) */ | |||||
uint8_t uncorrectable_ecc_count; | |||||
/* Byte 0 – DRAM_THRESHOLD_ECC_COUNT (2, 0x81) */ | |||||
uint8_t correctable_ecc_count; | |||||
} __packed; | |||||
void nvdimm_acpi_notify(ACPI_HANDLE h, UINT32 notify, void *context); | |||||
int nvdimm_get_critical_health_info(device_t dev, | |||||
struct nvdimm_critical_health_info *chi_out); | |||||
int nvdimm_get_health_info(device_t dev, struct nvdimm_health_info *hi_out); |