1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright(c) 2013-2015 Intel Corporation. All rights reserved. 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun #ifndef __NFIT_TEST_H__ 6*4882a593Smuzhiyun #define __NFIT_TEST_H__ 7*4882a593Smuzhiyun #include <linux/acpi.h> 8*4882a593Smuzhiyun #include <linux/list.h> 9*4882a593Smuzhiyun #include <linux/uuid.h> 10*4882a593Smuzhiyun #include <linux/ioport.h> 11*4882a593Smuzhiyun #include <linux/spinlock_types.h> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun struct nfit_test_request { 14*4882a593Smuzhiyun struct list_head list; 15*4882a593Smuzhiyun struct resource res; 16*4882a593Smuzhiyun }; 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun struct nfit_test_resource { 19*4882a593Smuzhiyun struct list_head requests; 20*4882a593Smuzhiyun struct list_head list; 21*4882a593Smuzhiyun struct resource res; 22*4882a593Smuzhiyun struct device *dev; 23*4882a593Smuzhiyun spinlock_t lock; 24*4882a593Smuzhiyun int req_count; 25*4882a593Smuzhiyun void *buf; 26*4882a593Smuzhiyun }; 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #define ND_TRANSLATE_SPA_STATUS_INVALID_SPA 2 29*4882a593Smuzhiyun #define NFIT_ARS_INJECT_INVALID 2 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun enum err_inj_options { 32*4882a593Smuzhiyun ND_ARS_ERR_INJ_OPT_NOTIFY = 0, 33*4882a593Smuzhiyun }; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun /* nfit commands */ 36*4882a593Smuzhiyun enum nfit_cmd_num { 37*4882a593Smuzhiyun NFIT_CMD_TRANSLATE_SPA = 5, 38*4882a593Smuzhiyun NFIT_CMD_ARS_INJECT_SET = 7, 39*4882a593Smuzhiyun NFIT_CMD_ARS_INJECT_CLEAR = 8, 40*4882a593Smuzhiyun NFIT_CMD_ARS_INJECT_GET = 9, 41*4882a593Smuzhiyun }; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun struct nd_cmd_translate_spa { 44*4882a593Smuzhiyun __u64 spa; 45*4882a593Smuzhiyun __u32 status; 46*4882a593Smuzhiyun __u8 flags; 47*4882a593Smuzhiyun __u8 _reserved[3]; 48*4882a593Smuzhiyun __u64 translate_length; 49*4882a593Smuzhiyun __u32 num_nvdimms; 50*4882a593Smuzhiyun struct nd_nvdimm_device { 51*4882a593Smuzhiyun __u32 nfit_device_handle; 52*4882a593Smuzhiyun __u32 _reserved; 53*4882a593Smuzhiyun __u64 dpa; 54*4882a593Smuzhiyun } __packed devices[]; 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun } __packed; 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun struct nd_cmd_ars_err_inj { 59*4882a593Smuzhiyun __u64 err_inj_spa_range_base; 60*4882a593Smuzhiyun __u64 err_inj_spa_range_length; 61*4882a593Smuzhiyun __u8 err_inj_options; 62*4882a593Smuzhiyun __u32 status; 63*4882a593Smuzhiyun } __packed; 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun struct nd_cmd_ars_err_inj_clr { 66*4882a593Smuzhiyun __u64 err_inj_clr_spa_range_base; 67*4882a593Smuzhiyun __u64 err_inj_clr_spa_range_length; 68*4882a593Smuzhiyun __u32 status; 69*4882a593Smuzhiyun } __packed; 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun struct nd_cmd_ars_err_inj_stat { 72*4882a593Smuzhiyun __u32 status; 73*4882a593Smuzhiyun __u32 inj_err_rec_count; 74*4882a593Smuzhiyun struct nd_error_stat_query_record { 75*4882a593Smuzhiyun __u64 err_inj_stat_spa_range_base; 76*4882a593Smuzhiyun __u64 err_inj_stat_spa_range_length; 77*4882a593Smuzhiyun } __packed record[]; 78*4882a593Smuzhiyun } __packed; 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun #define ND_INTEL_SMART 1 81*4882a593Smuzhiyun #define ND_INTEL_SMART_THRESHOLD 2 82*4882a593Smuzhiyun #define ND_INTEL_ENABLE_LSS_STATUS 10 83*4882a593Smuzhiyun #define ND_INTEL_FW_GET_INFO 12 84*4882a593Smuzhiyun #define ND_INTEL_FW_START_UPDATE 13 85*4882a593Smuzhiyun #define ND_INTEL_FW_SEND_DATA 14 86*4882a593Smuzhiyun #define ND_INTEL_FW_FINISH_UPDATE 15 87*4882a593Smuzhiyun #define ND_INTEL_FW_FINISH_QUERY 16 88*4882a593Smuzhiyun #define ND_INTEL_SMART_SET_THRESHOLD 17 89*4882a593Smuzhiyun #define ND_INTEL_SMART_INJECT 18 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun #define ND_INTEL_SMART_HEALTH_VALID (1 << 0) 92*4882a593Smuzhiyun #define ND_INTEL_SMART_SPARES_VALID (1 << 1) 93*4882a593Smuzhiyun #define ND_INTEL_SMART_USED_VALID (1 << 2) 94*4882a593Smuzhiyun #define ND_INTEL_SMART_MTEMP_VALID (1 << 3) 95*4882a593Smuzhiyun #define ND_INTEL_SMART_CTEMP_VALID (1 << 4) 96*4882a593Smuzhiyun #define ND_INTEL_SMART_SHUTDOWN_COUNT_VALID (1 << 5) 97*4882a593Smuzhiyun #define ND_INTEL_SMART_AIT_STATUS_VALID (1 << 6) 98*4882a593Smuzhiyun #define ND_INTEL_SMART_PTEMP_VALID (1 << 7) 99*4882a593Smuzhiyun #define ND_INTEL_SMART_ALARM_VALID (1 << 9) 100*4882a593Smuzhiyun #define ND_INTEL_SMART_SHUTDOWN_VALID (1 << 10) 101*4882a593Smuzhiyun #define ND_INTEL_SMART_VENDOR_VALID (1 << 11) 102*4882a593Smuzhiyun #define ND_INTEL_SMART_SPARE_TRIP (1 << 0) 103*4882a593Smuzhiyun #define ND_INTEL_SMART_TEMP_TRIP (1 << 1) 104*4882a593Smuzhiyun #define ND_INTEL_SMART_CTEMP_TRIP (1 << 2) 105*4882a593Smuzhiyun #define ND_INTEL_SMART_NON_CRITICAL_HEALTH (1 << 0) 106*4882a593Smuzhiyun #define ND_INTEL_SMART_CRITICAL_HEALTH (1 << 1) 107*4882a593Smuzhiyun #define ND_INTEL_SMART_FATAL_HEALTH (1 << 2) 108*4882a593Smuzhiyun #define ND_INTEL_SMART_INJECT_MTEMP (1 << 0) 109*4882a593Smuzhiyun #define ND_INTEL_SMART_INJECT_SPARE (1 << 1) 110*4882a593Smuzhiyun #define ND_INTEL_SMART_INJECT_FATAL (1 << 2) 111*4882a593Smuzhiyun #define ND_INTEL_SMART_INJECT_SHUTDOWN (1 << 3) 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun struct nd_intel_smart_threshold { 114*4882a593Smuzhiyun __u32 status; 115*4882a593Smuzhiyun union { 116*4882a593Smuzhiyun struct { 117*4882a593Smuzhiyun __u16 alarm_control; 118*4882a593Smuzhiyun __u8 spares; 119*4882a593Smuzhiyun __u16 media_temperature; 120*4882a593Smuzhiyun __u16 ctrl_temperature; 121*4882a593Smuzhiyun __u8 reserved[1]; 122*4882a593Smuzhiyun } __packed; 123*4882a593Smuzhiyun __u8 data[8]; 124*4882a593Smuzhiyun }; 125*4882a593Smuzhiyun } __packed; 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun struct nd_intel_smart_set_threshold { 128*4882a593Smuzhiyun __u16 alarm_control; 129*4882a593Smuzhiyun __u8 spares; 130*4882a593Smuzhiyun __u16 media_temperature; 131*4882a593Smuzhiyun __u16 ctrl_temperature; 132*4882a593Smuzhiyun __u32 status; 133*4882a593Smuzhiyun } __packed; 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun struct nd_intel_smart_inject { 136*4882a593Smuzhiyun __u64 flags; 137*4882a593Smuzhiyun __u8 mtemp_enable; 138*4882a593Smuzhiyun __u16 media_temperature; 139*4882a593Smuzhiyun __u8 spare_enable; 140*4882a593Smuzhiyun __u8 spares; 141*4882a593Smuzhiyun __u8 fatal_enable; 142*4882a593Smuzhiyun __u8 unsafe_shutdown_enable; 143*4882a593Smuzhiyun __u32 status; 144*4882a593Smuzhiyun } __packed; 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun #define INTEL_FW_STORAGE_SIZE 0x100000 147*4882a593Smuzhiyun #define INTEL_FW_MAX_SEND_LEN 0xFFEC 148*4882a593Smuzhiyun #define INTEL_FW_QUERY_INTERVAL 250000 149*4882a593Smuzhiyun #define INTEL_FW_QUERY_MAX_TIME 3000000 150*4882a593Smuzhiyun #define INTEL_FW_FIS_VERSION 0x0105 151*4882a593Smuzhiyun #define INTEL_FW_FAKE_VERSION 0xffffffffabcd 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun enum intel_fw_update_state { 154*4882a593Smuzhiyun FW_STATE_NEW = 0, 155*4882a593Smuzhiyun FW_STATE_IN_PROGRESS, 156*4882a593Smuzhiyun FW_STATE_VERIFY, 157*4882a593Smuzhiyun FW_STATE_UPDATED, 158*4882a593Smuzhiyun }; 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun struct nd_intel_fw_info { 161*4882a593Smuzhiyun __u32 status; 162*4882a593Smuzhiyun __u32 storage_size; 163*4882a593Smuzhiyun __u32 max_send_len; 164*4882a593Smuzhiyun __u32 query_interval; 165*4882a593Smuzhiyun __u32 max_query_time; 166*4882a593Smuzhiyun __u8 update_cap; 167*4882a593Smuzhiyun __u8 reserved[3]; 168*4882a593Smuzhiyun __u32 fis_version; 169*4882a593Smuzhiyun __u64 run_version; 170*4882a593Smuzhiyun __u64 updated_version; 171*4882a593Smuzhiyun } __packed; 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun struct nd_intel_fw_start { 174*4882a593Smuzhiyun __u32 status; 175*4882a593Smuzhiyun __u32 context; 176*4882a593Smuzhiyun } __packed; 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun /* this one has the output first because the variable input data size */ 179*4882a593Smuzhiyun struct nd_intel_fw_send_data { 180*4882a593Smuzhiyun __u32 context; 181*4882a593Smuzhiyun __u32 offset; 182*4882a593Smuzhiyun __u32 length; 183*4882a593Smuzhiyun __u8 data[]; 184*4882a593Smuzhiyun /* this field is not declared due ot variable data from input */ 185*4882a593Smuzhiyun /* __u32 status; */ 186*4882a593Smuzhiyun } __packed; 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun struct nd_intel_fw_finish_update { 189*4882a593Smuzhiyun __u8 ctrl_flags; 190*4882a593Smuzhiyun __u8 reserved[3]; 191*4882a593Smuzhiyun __u32 context; 192*4882a593Smuzhiyun __u32 status; 193*4882a593Smuzhiyun } __packed; 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun struct nd_intel_fw_finish_query { 196*4882a593Smuzhiyun __u32 context; 197*4882a593Smuzhiyun __u32 status; 198*4882a593Smuzhiyun __u64 updated_fw_rev; 199*4882a593Smuzhiyun } __packed; 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun struct nd_intel_lss { 202*4882a593Smuzhiyun __u8 enable; 203*4882a593Smuzhiyun __u32 status; 204*4882a593Smuzhiyun } __packed; 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun typedef struct nfit_test_resource *(*nfit_test_lookup_fn)(resource_size_t); 207*4882a593Smuzhiyun typedef union acpi_object *(*nfit_test_evaluate_dsm_fn)(acpi_handle handle, 208*4882a593Smuzhiyun const guid_t *guid, u64 rev, u64 func, 209*4882a593Smuzhiyun union acpi_object *argv4); 210*4882a593Smuzhiyun void __wrap_iounmap(volatile void __iomem *addr); 211*4882a593Smuzhiyun void nfit_test_setup(nfit_test_lookup_fn lookup, 212*4882a593Smuzhiyun nfit_test_evaluate_dsm_fn evaluate); 213*4882a593Smuzhiyun void nfit_test_teardown(void); 214*4882a593Smuzhiyun struct nfit_test_resource *get_nfit_res(resource_size_t resource); 215*4882a593Smuzhiyun #endif 216