162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright(c) 2013-2015 Intel Corporation. All rights reserved. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci#ifndef __NFIT_TEST_H__ 662306a36Sopenharmony_ci#define __NFIT_TEST_H__ 762306a36Sopenharmony_ci#include <linux/acpi.h> 862306a36Sopenharmony_ci#include <linux/list.h> 962306a36Sopenharmony_ci#include <linux/uuid.h> 1062306a36Sopenharmony_ci#include <linux/ioport.h> 1162306a36Sopenharmony_ci#include <linux/spinlock_types.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_cistruct nfit_test_request { 1462306a36Sopenharmony_ci struct list_head list; 1562306a36Sopenharmony_ci struct resource res; 1662306a36Sopenharmony_ci}; 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_cistruct nfit_test_resource { 1962306a36Sopenharmony_ci struct list_head requests; 2062306a36Sopenharmony_ci struct list_head list; 2162306a36Sopenharmony_ci struct resource res; 2262306a36Sopenharmony_ci struct device *dev; 2362306a36Sopenharmony_ci spinlock_t lock; 2462306a36Sopenharmony_ci int req_count; 2562306a36Sopenharmony_ci void *buf; 2662306a36Sopenharmony_ci}; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#define ND_TRANSLATE_SPA_STATUS_INVALID_SPA 2 2962306a36Sopenharmony_ci#define NFIT_ARS_INJECT_INVALID 2 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_cienum err_inj_options { 3262306a36Sopenharmony_ci ND_ARS_ERR_INJ_OPT_NOTIFY = 0, 3362306a36Sopenharmony_ci}; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci/* nfit commands */ 3662306a36Sopenharmony_cienum nfit_cmd_num { 3762306a36Sopenharmony_ci NFIT_CMD_TRANSLATE_SPA = 5, 3862306a36Sopenharmony_ci NFIT_CMD_ARS_INJECT_SET = 7, 3962306a36Sopenharmony_ci NFIT_CMD_ARS_INJECT_CLEAR = 8, 4062306a36Sopenharmony_ci NFIT_CMD_ARS_INJECT_GET = 9, 4162306a36Sopenharmony_ci}; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cistruct nd_cmd_translate_spa { 4462306a36Sopenharmony_ci __u64 spa; 4562306a36Sopenharmony_ci __u32 status; 4662306a36Sopenharmony_ci __u8 flags; 4762306a36Sopenharmony_ci __u8 _reserved[3]; 4862306a36Sopenharmony_ci __u64 translate_length; 4962306a36Sopenharmony_ci __u32 num_nvdimms; 5062306a36Sopenharmony_ci struct nd_nvdimm_device { 5162306a36Sopenharmony_ci __u32 nfit_device_handle; 5262306a36Sopenharmony_ci __u32 _reserved; 5362306a36Sopenharmony_ci __u64 dpa; 5462306a36Sopenharmony_ci } __packed devices[]; 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci} __packed; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cistruct nd_cmd_ars_err_inj { 5962306a36Sopenharmony_ci __u64 err_inj_spa_range_base; 6062306a36Sopenharmony_ci __u64 err_inj_spa_range_length; 6162306a36Sopenharmony_ci __u8 err_inj_options; 6262306a36Sopenharmony_ci __u32 status; 6362306a36Sopenharmony_ci} __packed; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_cistruct nd_cmd_ars_err_inj_clr { 6662306a36Sopenharmony_ci __u64 err_inj_clr_spa_range_base; 6762306a36Sopenharmony_ci __u64 err_inj_clr_spa_range_length; 6862306a36Sopenharmony_ci __u32 status; 6962306a36Sopenharmony_ci} __packed; 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_cistruct nd_cmd_ars_err_inj_stat { 7262306a36Sopenharmony_ci __u32 status; 7362306a36Sopenharmony_ci __u32 inj_err_rec_count; 7462306a36Sopenharmony_ci struct nd_error_stat_query_record { 7562306a36Sopenharmony_ci __u64 err_inj_stat_spa_range_base; 7662306a36Sopenharmony_ci __u64 err_inj_stat_spa_range_length; 7762306a36Sopenharmony_ci } __packed record[]; 7862306a36Sopenharmony_ci} __packed; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci#define ND_INTEL_SMART 1 8162306a36Sopenharmony_ci#define ND_INTEL_SMART_THRESHOLD 2 8262306a36Sopenharmony_ci#define ND_INTEL_ENABLE_LSS_STATUS 10 8362306a36Sopenharmony_ci#define ND_INTEL_FW_GET_INFO 12 8462306a36Sopenharmony_ci#define ND_INTEL_FW_START_UPDATE 13 8562306a36Sopenharmony_ci#define ND_INTEL_FW_SEND_DATA 14 8662306a36Sopenharmony_ci#define ND_INTEL_FW_FINISH_UPDATE 15 8762306a36Sopenharmony_ci#define ND_INTEL_FW_FINISH_QUERY 16 8862306a36Sopenharmony_ci#define ND_INTEL_SMART_SET_THRESHOLD 17 8962306a36Sopenharmony_ci#define ND_INTEL_SMART_INJECT 18 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci#define ND_INTEL_SMART_HEALTH_VALID (1 << 0) 9262306a36Sopenharmony_ci#define ND_INTEL_SMART_SPARES_VALID (1 << 1) 9362306a36Sopenharmony_ci#define ND_INTEL_SMART_USED_VALID (1 << 2) 9462306a36Sopenharmony_ci#define ND_INTEL_SMART_MTEMP_VALID (1 << 3) 9562306a36Sopenharmony_ci#define ND_INTEL_SMART_CTEMP_VALID (1 << 4) 9662306a36Sopenharmony_ci#define ND_INTEL_SMART_SHUTDOWN_COUNT_VALID (1 << 5) 9762306a36Sopenharmony_ci#define ND_INTEL_SMART_AIT_STATUS_VALID (1 << 6) 9862306a36Sopenharmony_ci#define ND_INTEL_SMART_PTEMP_VALID (1 << 7) 9962306a36Sopenharmony_ci#define ND_INTEL_SMART_ALARM_VALID (1 << 9) 10062306a36Sopenharmony_ci#define ND_INTEL_SMART_SHUTDOWN_VALID (1 << 10) 10162306a36Sopenharmony_ci#define ND_INTEL_SMART_VENDOR_VALID (1 << 11) 10262306a36Sopenharmony_ci#define ND_INTEL_SMART_SPARE_TRIP (1 << 0) 10362306a36Sopenharmony_ci#define ND_INTEL_SMART_TEMP_TRIP (1 << 1) 10462306a36Sopenharmony_ci#define ND_INTEL_SMART_CTEMP_TRIP (1 << 2) 10562306a36Sopenharmony_ci#define ND_INTEL_SMART_NON_CRITICAL_HEALTH (1 << 0) 10662306a36Sopenharmony_ci#define ND_INTEL_SMART_CRITICAL_HEALTH (1 << 1) 10762306a36Sopenharmony_ci#define ND_INTEL_SMART_FATAL_HEALTH (1 << 2) 10862306a36Sopenharmony_ci#define ND_INTEL_SMART_INJECT_MTEMP (1 << 0) 10962306a36Sopenharmony_ci#define ND_INTEL_SMART_INJECT_SPARE (1 << 1) 11062306a36Sopenharmony_ci#define ND_INTEL_SMART_INJECT_FATAL (1 << 2) 11162306a36Sopenharmony_ci#define ND_INTEL_SMART_INJECT_SHUTDOWN (1 << 3) 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_cistruct nd_intel_smart_threshold { 11462306a36Sopenharmony_ci __u32 status; 11562306a36Sopenharmony_ci union { 11662306a36Sopenharmony_ci struct { 11762306a36Sopenharmony_ci __u16 alarm_control; 11862306a36Sopenharmony_ci __u8 spares; 11962306a36Sopenharmony_ci __u16 media_temperature; 12062306a36Sopenharmony_ci __u16 ctrl_temperature; 12162306a36Sopenharmony_ci __u8 reserved[1]; 12262306a36Sopenharmony_ci } __packed; 12362306a36Sopenharmony_ci __u8 data[8]; 12462306a36Sopenharmony_ci }; 12562306a36Sopenharmony_ci} __packed; 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_cistruct nd_intel_smart_set_threshold { 12862306a36Sopenharmony_ci __u16 alarm_control; 12962306a36Sopenharmony_ci __u8 spares; 13062306a36Sopenharmony_ci __u16 media_temperature; 13162306a36Sopenharmony_ci __u16 ctrl_temperature; 13262306a36Sopenharmony_ci __u32 status; 13362306a36Sopenharmony_ci} __packed; 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_cistruct nd_intel_smart_inject { 13662306a36Sopenharmony_ci __u64 flags; 13762306a36Sopenharmony_ci __u8 mtemp_enable; 13862306a36Sopenharmony_ci __u16 media_temperature; 13962306a36Sopenharmony_ci __u8 spare_enable; 14062306a36Sopenharmony_ci __u8 spares; 14162306a36Sopenharmony_ci __u8 fatal_enable; 14262306a36Sopenharmony_ci __u8 unsafe_shutdown_enable; 14362306a36Sopenharmony_ci __u32 status; 14462306a36Sopenharmony_ci} __packed; 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci#define INTEL_FW_STORAGE_SIZE 0x100000 14762306a36Sopenharmony_ci#define INTEL_FW_MAX_SEND_LEN 0xFFEC 14862306a36Sopenharmony_ci#define INTEL_FW_QUERY_INTERVAL 250000 14962306a36Sopenharmony_ci#define INTEL_FW_QUERY_MAX_TIME 3000000 15062306a36Sopenharmony_ci#define INTEL_FW_FIS_VERSION 0x0105 15162306a36Sopenharmony_ci#define INTEL_FW_FAKE_VERSION 0xffffffffabcd 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_cienum intel_fw_update_state { 15462306a36Sopenharmony_ci FW_STATE_NEW = 0, 15562306a36Sopenharmony_ci FW_STATE_IN_PROGRESS, 15662306a36Sopenharmony_ci FW_STATE_VERIFY, 15762306a36Sopenharmony_ci FW_STATE_UPDATED, 15862306a36Sopenharmony_ci}; 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_cistruct nd_intel_fw_info { 16162306a36Sopenharmony_ci __u32 status; 16262306a36Sopenharmony_ci __u32 storage_size; 16362306a36Sopenharmony_ci __u32 max_send_len; 16462306a36Sopenharmony_ci __u32 query_interval; 16562306a36Sopenharmony_ci __u32 max_query_time; 16662306a36Sopenharmony_ci __u8 update_cap; 16762306a36Sopenharmony_ci __u8 reserved[3]; 16862306a36Sopenharmony_ci __u32 fis_version; 16962306a36Sopenharmony_ci __u64 run_version; 17062306a36Sopenharmony_ci __u64 updated_version; 17162306a36Sopenharmony_ci} __packed; 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_cistruct nd_intel_fw_start { 17462306a36Sopenharmony_ci __u32 status; 17562306a36Sopenharmony_ci __u32 context; 17662306a36Sopenharmony_ci} __packed; 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci/* this one has the output first because the variable input data size */ 17962306a36Sopenharmony_cistruct nd_intel_fw_send_data { 18062306a36Sopenharmony_ci __u32 context; 18162306a36Sopenharmony_ci __u32 offset; 18262306a36Sopenharmony_ci __u32 length; 18362306a36Sopenharmony_ci __u8 data[]; 18462306a36Sopenharmony_ci/* this field is not declared due ot variable data from input */ 18562306a36Sopenharmony_ci/* __u32 status; */ 18662306a36Sopenharmony_ci} __packed; 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_cistruct nd_intel_fw_finish_update { 18962306a36Sopenharmony_ci __u8 ctrl_flags; 19062306a36Sopenharmony_ci __u8 reserved[3]; 19162306a36Sopenharmony_ci __u32 context; 19262306a36Sopenharmony_ci __u32 status; 19362306a36Sopenharmony_ci} __packed; 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_cistruct nd_intel_fw_finish_query { 19662306a36Sopenharmony_ci __u32 context; 19762306a36Sopenharmony_ci __u32 status; 19862306a36Sopenharmony_ci __u64 updated_fw_rev; 19962306a36Sopenharmony_ci} __packed; 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_cistruct nd_intel_lss { 20262306a36Sopenharmony_ci __u8 enable; 20362306a36Sopenharmony_ci __u32 status; 20462306a36Sopenharmony_ci} __packed; 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_citypedef struct nfit_test_resource *(*nfit_test_lookup_fn)(resource_size_t); 20762306a36Sopenharmony_citypedef union acpi_object *(*nfit_test_evaluate_dsm_fn)(acpi_handle handle, 20862306a36Sopenharmony_ci const guid_t *guid, u64 rev, u64 func, 20962306a36Sopenharmony_ci union acpi_object *argv4); 21062306a36Sopenharmony_civoid __iomem *__wrap_devm_ioremap(struct device *dev, 21162306a36Sopenharmony_ci resource_size_t offset, unsigned long size); 21262306a36Sopenharmony_civoid *__wrap_devm_memremap(struct device *dev, resource_size_t offset, 21362306a36Sopenharmony_ci size_t size, unsigned long flags); 21462306a36Sopenharmony_civoid *__wrap_devm_memremap_pages(struct device *dev, struct dev_pagemap *pgmap); 21562306a36Sopenharmony_cipfn_t __wrap_phys_to_pfn_t(phys_addr_t addr, unsigned long flags); 21662306a36Sopenharmony_civoid *__wrap_memremap(resource_size_t offset, size_t size, 21762306a36Sopenharmony_ci unsigned long flags); 21862306a36Sopenharmony_civoid __wrap_devm_memunmap(struct device *dev, void *addr); 21962306a36Sopenharmony_civoid __iomem *__wrap_ioremap(resource_size_t offset, unsigned long size); 22062306a36Sopenharmony_civoid __iomem *__wrap_ioremap_wc(resource_size_t offset, unsigned long size); 22162306a36Sopenharmony_civoid __wrap_iounmap(volatile void __iomem *addr); 22262306a36Sopenharmony_civoid __wrap_memunmap(void *addr); 22362306a36Sopenharmony_cistruct resource *__wrap___request_region(struct resource *parent, 22462306a36Sopenharmony_ci resource_size_t start, resource_size_t n, const char *name, 22562306a36Sopenharmony_ci int flags); 22662306a36Sopenharmony_ciint __wrap_insert_resource(struct resource *parent, struct resource *res); 22762306a36Sopenharmony_ciint __wrap_remove_resource(struct resource *res); 22862306a36Sopenharmony_cistruct resource *__wrap___devm_request_region(struct device *dev, 22962306a36Sopenharmony_ci struct resource *parent, resource_size_t start, 23062306a36Sopenharmony_ci resource_size_t n, const char *name); 23162306a36Sopenharmony_civoid __wrap___release_region(struct resource *parent, resource_size_t start, 23262306a36Sopenharmony_ci resource_size_t n); 23362306a36Sopenharmony_civoid __wrap___devm_release_region(struct device *dev, struct resource *parent, 23462306a36Sopenharmony_ci resource_size_t start, resource_size_t n); 23562306a36Sopenharmony_ciacpi_status __wrap_acpi_evaluate_object(acpi_handle handle, acpi_string path, 23662306a36Sopenharmony_ci struct acpi_object_list *p, struct acpi_buffer *buf); 23762306a36Sopenharmony_ciunion acpi_object * __wrap_acpi_evaluate_dsm(acpi_handle handle, const guid_t *guid, 23862306a36Sopenharmony_ci u64 rev, u64 func, union acpi_object *argv4); 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_civoid nfit_test_setup(nfit_test_lookup_fn lookup, 24162306a36Sopenharmony_ci nfit_test_evaluate_dsm_fn evaluate); 24262306a36Sopenharmony_civoid nfit_test_teardown(void); 24362306a36Sopenharmony_cistruct nfit_test_resource *get_nfit_res(resource_size_t resource); 24462306a36Sopenharmony_ci#endif 245