162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci#ifndef NDTEST_H
362306a36Sopenharmony_ci#define NDTEST_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <linux/platform_device.h>
662306a36Sopenharmony_ci#include <linux/libnvdimm.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci/* SCM device is unable to persist memory contents */
962306a36Sopenharmony_ci#define PAPR_PMEM_UNARMED                   (1ULL << (63 - 0))
1062306a36Sopenharmony_ci/* SCM device failed to persist memory contents */
1162306a36Sopenharmony_ci#define PAPR_PMEM_SHUTDOWN_DIRTY            (1ULL << (63 - 1))
1262306a36Sopenharmony_ci/* SCM device contents are not persisted from previous IPL */
1362306a36Sopenharmony_ci#define PAPR_PMEM_EMPTY                     (1ULL << (63 - 3))
1462306a36Sopenharmony_ci#define PAPR_PMEM_HEALTH_CRITICAL           (1ULL << (63 - 4))
1562306a36Sopenharmony_ci/* SCM device will be garded off next IPL due to failure */
1662306a36Sopenharmony_ci#define PAPR_PMEM_HEALTH_FATAL              (1ULL << (63 - 5))
1762306a36Sopenharmony_ci/* SCM contents cannot persist due to current platform health status */
1862306a36Sopenharmony_ci#define PAPR_PMEM_HEALTH_UNHEALTHY          (1ULL << (63 - 6))
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci/* Bits status indicators for health bitmap indicating unarmed dimm */
2162306a36Sopenharmony_ci#define PAPR_PMEM_UNARMED_MASK (PAPR_PMEM_UNARMED |		\
2262306a36Sopenharmony_ci				PAPR_PMEM_HEALTH_UNHEALTHY)
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#define PAPR_PMEM_SAVE_FAILED                (1ULL << (63 - 10))
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci/* Bits status indicators for health bitmap indicating unflushed dimm */
2762306a36Sopenharmony_ci#define PAPR_PMEM_BAD_SHUTDOWN_MASK (PAPR_PMEM_SHUTDOWN_DIRTY)
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci/* Bits status indicators for health bitmap indicating unrestored dimm */
3062306a36Sopenharmony_ci#define PAPR_PMEM_BAD_RESTORE_MASK  (PAPR_PMEM_EMPTY)
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci/* Bit status indicators for smart event notification */
3362306a36Sopenharmony_ci#define PAPR_PMEM_SMART_EVENT_MASK (PAPR_PMEM_HEALTH_CRITICAL | \
3462306a36Sopenharmony_ci				    PAPR_PMEM_HEALTH_FATAL |	\
3562306a36Sopenharmony_ci				    PAPR_PMEM_HEALTH_UNHEALTHY)
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci#define PAPR_PMEM_SAVE_MASK                (PAPR_PMEM_SAVE_FAILED)
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_cistruct ndtest_config;
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_cistruct ndtest_priv {
4262306a36Sopenharmony_ci	struct platform_device pdev;
4362306a36Sopenharmony_ci	struct device_node *dn;
4462306a36Sopenharmony_ci	struct list_head resources;
4562306a36Sopenharmony_ci	struct nvdimm_bus_descriptor bus_desc;
4662306a36Sopenharmony_ci	struct nvdimm_bus *bus;
4762306a36Sopenharmony_ci	struct ndtest_config *config;
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	dma_addr_t *dcr_dma;
5062306a36Sopenharmony_ci	dma_addr_t *label_dma;
5162306a36Sopenharmony_ci	dma_addr_t *dimm_dma;
5262306a36Sopenharmony_ci};
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_cistruct ndtest_blk_mmio {
5562306a36Sopenharmony_ci	void __iomem *base;
5662306a36Sopenharmony_ci	u64 size;
5762306a36Sopenharmony_ci	u64 base_offset;
5862306a36Sopenharmony_ci	u32 line_size;
5962306a36Sopenharmony_ci	u32 num_lines;
6062306a36Sopenharmony_ci	u32 table_size;
6162306a36Sopenharmony_ci};
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_cistruct ndtest_dimm {
6462306a36Sopenharmony_ci	struct device *dev;
6562306a36Sopenharmony_ci	struct nvdimm *nvdimm;
6662306a36Sopenharmony_ci	struct ndtest_blk_mmio *mmio;
6762306a36Sopenharmony_ci	struct nd_region *blk_region;
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci	dma_addr_t address;
7062306a36Sopenharmony_ci	unsigned long long flags;
7162306a36Sopenharmony_ci	unsigned long config_size;
7262306a36Sopenharmony_ci	void *label_area;
7362306a36Sopenharmony_ci	char *uuid_str;
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci	unsigned int size;
7662306a36Sopenharmony_ci	unsigned int handle;
7762306a36Sopenharmony_ci	unsigned int fail_cmd;
7862306a36Sopenharmony_ci	unsigned int physical_id;
7962306a36Sopenharmony_ci	unsigned int num_formats;
8062306a36Sopenharmony_ci	int id;
8162306a36Sopenharmony_ci	int fail_cmd_code;
8262306a36Sopenharmony_ci	u8 no_alias;
8362306a36Sopenharmony_ci};
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_cistruct ndtest_mapping {
8662306a36Sopenharmony_ci	u64 start;
8762306a36Sopenharmony_ci	u64 size;
8862306a36Sopenharmony_ci	u8 position;
8962306a36Sopenharmony_ci	u8 dimm;
9062306a36Sopenharmony_ci};
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_cistruct ndtest_region {
9362306a36Sopenharmony_ci	struct nd_region *region;
9462306a36Sopenharmony_ci	struct ndtest_mapping *mapping;
9562306a36Sopenharmony_ci	u64 size;
9662306a36Sopenharmony_ci	u8 type;
9762306a36Sopenharmony_ci	u8 num_mappings;
9862306a36Sopenharmony_ci	u8 range_index;
9962306a36Sopenharmony_ci};
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_cistruct ndtest_config {
10262306a36Sopenharmony_ci	struct ndtest_dimm *dimms;
10362306a36Sopenharmony_ci	struct ndtest_region *regions;
10462306a36Sopenharmony_ci	unsigned int dimm_count;
10562306a36Sopenharmony_ci	unsigned int dimm_start;
10662306a36Sopenharmony_ci	u8 num_regions;
10762306a36Sopenharmony_ci};
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci#endif /* NDTEST_H */
110