162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * CXL Flash Device Driver
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Written by: Manoj N. Kumar <manoj@linux.vnet.ibm.com>, IBM Corporation
662306a36Sopenharmony_ci *             Matthew R. Ochs <mrochs@linux.vnet.ibm.com>, IBM Corporation
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * Copyright (C) 2015 IBM Corporation
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#ifndef _CXLFLASH_SUPERPIPE_H
1262306a36Sopenharmony_ci#define _CXLFLASH_SUPERPIPE_H
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ciextern struct cxlflash_global global;
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci/*
1762306a36Sopenharmony_ci * Terminology: use afu (and not adapter) to refer to the HW.
1862306a36Sopenharmony_ci * Adapter is the entire slot and includes PSL out of which
1962306a36Sopenharmony_ci * only the AFU is visible to user space.
2062306a36Sopenharmony_ci */
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci/* Chunk size parms: note sislite minimum chunk size is
2362306a36Sopenharmony_ci * 0x10000 LBAs corresponding to a NMASK or 16.
2462306a36Sopenharmony_ci */
2562306a36Sopenharmony_ci#define MC_CHUNK_SIZE     (1 << MC_RHT_NMASK)	/* in LBAs */
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci#define CMD_TIMEOUT 30  /* 30 secs */
2862306a36Sopenharmony_ci#define CMD_RETRIES 5   /* 5 retries for scsi_execute */
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci#define MAX_SECTOR_UNIT  512 /* max_sector is in 512 byte multiples */
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_cienum lun_mode {
3362306a36Sopenharmony_ci	MODE_NONE = 0,
3462306a36Sopenharmony_ci	MODE_VIRTUAL,
3562306a36Sopenharmony_ci	MODE_PHYSICAL
3662306a36Sopenharmony_ci};
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci/* Global (entire driver, spans adapters) lun_info structure */
3962306a36Sopenharmony_cistruct glun_info {
4062306a36Sopenharmony_ci	u64 max_lba;		/* from read cap(16) */
4162306a36Sopenharmony_ci	u32 blk_len;		/* from read cap(16) */
4262306a36Sopenharmony_ci	enum lun_mode mode;	/* NONE, VIRTUAL, PHYSICAL */
4362306a36Sopenharmony_ci	int users;		/* Number of users w/ references to LUN */
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	u8 wwid[16];
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	struct mutex mutex;
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	struct blka blka;
5062306a36Sopenharmony_ci	struct list_head list;
5162306a36Sopenharmony_ci};
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci/* Local (per-adapter) lun_info structure */
5462306a36Sopenharmony_cistruct llun_info {
5562306a36Sopenharmony_ci	u64 lun_id[MAX_FC_PORTS]; /* from REPORT_LUNS */
5662306a36Sopenharmony_ci	u32 lun_index;		/* Index in the LUN table */
5762306a36Sopenharmony_ci	u32 host_no;		/* host_no from Scsi_host */
5862306a36Sopenharmony_ci	u32 port_sel;		/* What port to use for this LUN */
5962306a36Sopenharmony_ci	bool in_table;		/* Whether a LUN table entry was created */
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci	u8 wwid[16];		/* Keep a duplicate copy here? */
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci	struct glun_info *parent; /* Pointer to entry in global LUN structure */
6462306a36Sopenharmony_ci	struct scsi_device *sdev;
6562306a36Sopenharmony_ci	struct list_head list;
6662306a36Sopenharmony_ci};
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_cistruct lun_access {
6962306a36Sopenharmony_ci	struct llun_info *lli;
7062306a36Sopenharmony_ci	struct scsi_device *sdev;
7162306a36Sopenharmony_ci	struct list_head list;
7262306a36Sopenharmony_ci};
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_cienum ctx_ctrl {
7562306a36Sopenharmony_ci	CTX_CTRL_CLONE		= (1 << 1),
7662306a36Sopenharmony_ci	CTX_CTRL_ERR		= (1 << 2),
7762306a36Sopenharmony_ci	CTX_CTRL_ERR_FALLBACK	= (1 << 3),
7862306a36Sopenharmony_ci	CTX_CTRL_NOPID		= (1 << 4),
7962306a36Sopenharmony_ci	CTX_CTRL_FILE		= (1 << 5)
8062306a36Sopenharmony_ci};
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci#define ENCODE_CTXID(_ctx, _id)	(((((u64)_ctx) & 0xFFFFFFFF0ULL) << 28) | _id)
8362306a36Sopenharmony_ci#define DECODE_CTXID(_val)	(_val & 0xFFFFFFFF)
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_cistruct ctx_info {
8662306a36Sopenharmony_ci	struct sisl_ctrl_map __iomem *ctrl_map; /* initialized at startup */
8762306a36Sopenharmony_ci	struct sisl_rht_entry *rht_start; /* 1 page (req'd for alignment),
8862306a36Sopenharmony_ci					   * alloc/free on attach/detach
8962306a36Sopenharmony_ci					   */
9062306a36Sopenharmony_ci	u32 rht_out;		/* Number of checked out RHT entries */
9162306a36Sopenharmony_ci	u32 rht_perms;		/* User-defined permissions for RHT entries */
9262306a36Sopenharmony_ci	struct llun_info **rht_lun;       /* Mapping of RHT entries to LUNs */
9362306a36Sopenharmony_ci	u8 *rht_needs_ws;	/* User-desired write-same function per RHTE */
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci	u64 ctxid;
9662306a36Sopenharmony_ci	u64 irqs; /* Number of interrupts requested for context */
9762306a36Sopenharmony_ci	pid_t pid;
9862306a36Sopenharmony_ci	bool initialized;
9962306a36Sopenharmony_ci	bool unavail;
10062306a36Sopenharmony_ci	bool err_recovery_active;
10162306a36Sopenharmony_ci	struct mutex mutex; /* Context protection */
10262306a36Sopenharmony_ci	struct kref kref;
10362306a36Sopenharmony_ci	void *ctx;
10462306a36Sopenharmony_ci	struct cxlflash_cfg *cfg;
10562306a36Sopenharmony_ci	struct list_head luns;	/* LUNs attached to this context */
10662306a36Sopenharmony_ci	const struct vm_operations_struct *cxl_mmap_vmops;
10762306a36Sopenharmony_ci	struct file *file;
10862306a36Sopenharmony_ci	struct list_head list; /* Link contexts in error recovery */
10962306a36Sopenharmony_ci};
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_cistruct cxlflash_global {
11262306a36Sopenharmony_ci	struct mutex mutex;
11362306a36Sopenharmony_ci	struct list_head gluns;/* list of glun_info structs */
11462306a36Sopenharmony_ci	struct page *err_page; /* One page of all 0xF for error notification */
11562306a36Sopenharmony_ci};
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ciint cxlflash_vlun_resize(struct scsi_device *sdev,
11862306a36Sopenharmony_ci			 struct dk_cxlflash_resize *resize);
11962306a36Sopenharmony_ciint _cxlflash_vlun_resize(struct scsi_device *sdev, struct ctx_info *ctxi,
12062306a36Sopenharmony_ci			  struct dk_cxlflash_resize *resize);
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ciint cxlflash_disk_release(struct scsi_device *sdev,
12362306a36Sopenharmony_ci			  struct dk_cxlflash_release *release);
12462306a36Sopenharmony_ciint _cxlflash_disk_release(struct scsi_device *sdev, struct ctx_info *ctxi,
12562306a36Sopenharmony_ci			   struct dk_cxlflash_release *release);
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ciint cxlflash_disk_clone(struct scsi_device *sdev,
12862306a36Sopenharmony_ci			struct dk_cxlflash_clone *clone);
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ciint cxlflash_disk_virtual_open(struct scsi_device *sdev, void *arg);
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ciint cxlflash_lun_attach(struct glun_info *gli, enum lun_mode mode, bool locked);
13362306a36Sopenharmony_civoid cxlflash_lun_detach(struct glun_info *gli);
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_cistruct ctx_info *get_context(struct cxlflash_cfg *cfg, u64 rctxit, void *arg,
13662306a36Sopenharmony_ci			     enum ctx_ctrl ctrl);
13762306a36Sopenharmony_civoid put_context(struct ctx_info *ctxi);
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_cistruct sisl_rht_entry *get_rhte(struct ctx_info *ctxi, res_hndl_t rhndl,
14062306a36Sopenharmony_ci				struct llun_info *lli);
14162306a36Sopenharmony_ci
14262306a36Sopenharmony_cistruct sisl_rht_entry *rhte_checkout(struct ctx_info *ctxi,
14362306a36Sopenharmony_ci				     struct llun_info *lli);
14462306a36Sopenharmony_civoid rhte_checkin(struct ctx_info *ctxi, struct sisl_rht_entry *rhte);
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_civoid cxlflash_ba_terminate(struct ba_lun *ba_lun);
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ciint cxlflash_manage_lun(struct scsi_device *sdev,
14962306a36Sopenharmony_ci			struct dk_cxlflash_manage_lun *manage);
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ciint check_state(struct cxlflash_cfg *cfg);
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci#endif /* ifndef _CXLFLASH_SUPERPIPE_H */
154