18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * CXL Flash Device Driver
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Written by: Manoj N. Kumar <manoj@linux.vnet.ibm.com>, IBM Corporation
68c2ecf20Sopenharmony_ci *             Matthew R. Ochs <mrochs@linux.vnet.ibm.com>, IBM Corporation
78c2ecf20Sopenharmony_ci *
88c2ecf20Sopenharmony_ci * Copyright (C) 2015 IBM Corporation
98c2ecf20Sopenharmony_ci */
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#ifndef _CXLFLASH_SUPERPIPE_H
128c2ecf20Sopenharmony_ci#define _CXLFLASH_SUPERPIPE_H
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ciextern struct cxlflash_global global;
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci/*
178c2ecf20Sopenharmony_ci * Terminology: use afu (and not adapter) to refer to the HW.
188c2ecf20Sopenharmony_ci * Adapter is the entire slot and includes PSL out of which
198c2ecf20Sopenharmony_ci * only the AFU is visible to user space.
208c2ecf20Sopenharmony_ci */
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci/* Chunk size parms: note sislite minimum chunk size is
238c2ecf20Sopenharmony_ci * 0x10000 LBAs corresponding to a NMASK or 16.
248c2ecf20Sopenharmony_ci */
258c2ecf20Sopenharmony_ci#define MC_CHUNK_SIZE     (1 << MC_RHT_NMASK)	/* in LBAs */
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci#define CMD_TIMEOUT 30  /* 30 secs */
288c2ecf20Sopenharmony_ci#define CMD_RETRIES 5   /* 5 retries for scsi_execute */
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci#define MAX_SECTOR_UNIT  512 /* max_sector is in 512 byte multiples */
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_cienum lun_mode {
338c2ecf20Sopenharmony_ci	MODE_NONE = 0,
348c2ecf20Sopenharmony_ci	MODE_VIRTUAL,
358c2ecf20Sopenharmony_ci	MODE_PHYSICAL
368c2ecf20Sopenharmony_ci};
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci/* Global (entire driver, spans adapters) lun_info structure */
398c2ecf20Sopenharmony_cistruct glun_info {
408c2ecf20Sopenharmony_ci	u64 max_lba;		/* from read cap(16) */
418c2ecf20Sopenharmony_ci	u32 blk_len;		/* from read cap(16) */
428c2ecf20Sopenharmony_ci	enum lun_mode mode;	/* NONE, VIRTUAL, PHYSICAL */
438c2ecf20Sopenharmony_ci	int users;		/* Number of users w/ references to LUN */
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci	u8 wwid[16];
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci	struct mutex mutex;
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci	struct blka blka;
508c2ecf20Sopenharmony_ci	struct list_head list;
518c2ecf20Sopenharmony_ci};
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci/* Local (per-adapter) lun_info structure */
548c2ecf20Sopenharmony_cistruct llun_info {
558c2ecf20Sopenharmony_ci	u64 lun_id[MAX_FC_PORTS]; /* from REPORT_LUNS */
568c2ecf20Sopenharmony_ci	u32 lun_index;		/* Index in the LUN table */
578c2ecf20Sopenharmony_ci	u32 host_no;		/* host_no from Scsi_host */
588c2ecf20Sopenharmony_ci	u32 port_sel;		/* What port to use for this LUN */
598c2ecf20Sopenharmony_ci	bool in_table;		/* Whether a LUN table entry was created */
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci	u8 wwid[16];		/* Keep a duplicate copy here? */
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci	struct glun_info *parent; /* Pointer to entry in global LUN structure */
648c2ecf20Sopenharmony_ci	struct scsi_device *sdev;
658c2ecf20Sopenharmony_ci	struct list_head list;
668c2ecf20Sopenharmony_ci};
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_cistruct lun_access {
698c2ecf20Sopenharmony_ci	struct llun_info *lli;
708c2ecf20Sopenharmony_ci	struct scsi_device *sdev;
718c2ecf20Sopenharmony_ci	struct list_head list;
728c2ecf20Sopenharmony_ci};
738c2ecf20Sopenharmony_ci
748c2ecf20Sopenharmony_cienum ctx_ctrl {
758c2ecf20Sopenharmony_ci	CTX_CTRL_CLONE		= (1 << 1),
768c2ecf20Sopenharmony_ci	CTX_CTRL_ERR		= (1 << 2),
778c2ecf20Sopenharmony_ci	CTX_CTRL_ERR_FALLBACK	= (1 << 3),
788c2ecf20Sopenharmony_ci	CTX_CTRL_NOPID		= (1 << 4),
798c2ecf20Sopenharmony_ci	CTX_CTRL_FILE		= (1 << 5)
808c2ecf20Sopenharmony_ci};
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_ci#define ENCODE_CTXID(_ctx, _id)	(((((u64)_ctx) & 0xFFFFFFFF0ULL) << 28) | _id)
838c2ecf20Sopenharmony_ci#define DECODE_CTXID(_val)	(_val & 0xFFFFFFFF)
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_cistruct ctx_info {
868c2ecf20Sopenharmony_ci	struct sisl_ctrl_map __iomem *ctrl_map; /* initialized at startup */
878c2ecf20Sopenharmony_ci	struct sisl_rht_entry *rht_start; /* 1 page (req'd for alignment),
888c2ecf20Sopenharmony_ci					   * alloc/free on attach/detach
898c2ecf20Sopenharmony_ci					   */
908c2ecf20Sopenharmony_ci	u32 rht_out;		/* Number of checked out RHT entries */
918c2ecf20Sopenharmony_ci	u32 rht_perms;		/* User-defined permissions for RHT entries */
928c2ecf20Sopenharmony_ci	struct llun_info **rht_lun;       /* Mapping of RHT entries to LUNs */
938c2ecf20Sopenharmony_ci	u8 *rht_needs_ws;	/* User-desired write-same function per RHTE */
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_ci	u64 ctxid;
968c2ecf20Sopenharmony_ci	u64 irqs; /* Number of interrupts requested for context */
978c2ecf20Sopenharmony_ci	pid_t pid;
988c2ecf20Sopenharmony_ci	bool initialized;
998c2ecf20Sopenharmony_ci	bool unavail;
1008c2ecf20Sopenharmony_ci	bool err_recovery_active;
1018c2ecf20Sopenharmony_ci	struct mutex mutex; /* Context protection */
1028c2ecf20Sopenharmony_ci	struct kref kref;
1038c2ecf20Sopenharmony_ci	void *ctx;
1048c2ecf20Sopenharmony_ci	struct cxlflash_cfg *cfg;
1058c2ecf20Sopenharmony_ci	struct list_head luns;	/* LUNs attached to this context */
1068c2ecf20Sopenharmony_ci	const struct vm_operations_struct *cxl_mmap_vmops;
1078c2ecf20Sopenharmony_ci	struct file *file;
1088c2ecf20Sopenharmony_ci	struct list_head list; /* Link contexts in error recovery */
1098c2ecf20Sopenharmony_ci};
1108c2ecf20Sopenharmony_ci
1118c2ecf20Sopenharmony_cistruct cxlflash_global {
1128c2ecf20Sopenharmony_ci	struct mutex mutex;
1138c2ecf20Sopenharmony_ci	struct list_head gluns;/* list of glun_info structs */
1148c2ecf20Sopenharmony_ci	struct page *err_page; /* One page of all 0xF for error notification */
1158c2ecf20Sopenharmony_ci};
1168c2ecf20Sopenharmony_ci
1178c2ecf20Sopenharmony_ciint cxlflash_vlun_resize(struct scsi_device *sdev,
1188c2ecf20Sopenharmony_ci			 struct dk_cxlflash_resize *resize);
1198c2ecf20Sopenharmony_ciint _cxlflash_vlun_resize(struct scsi_device *sdev, struct ctx_info *ctxi,
1208c2ecf20Sopenharmony_ci			  struct dk_cxlflash_resize *resize);
1218c2ecf20Sopenharmony_ci
1228c2ecf20Sopenharmony_ciint cxlflash_disk_release(struct scsi_device *sdev,
1238c2ecf20Sopenharmony_ci			  struct dk_cxlflash_release *release);
1248c2ecf20Sopenharmony_ciint _cxlflash_disk_release(struct scsi_device *sdev, struct ctx_info *ctxi,
1258c2ecf20Sopenharmony_ci			   struct dk_cxlflash_release *release);
1268c2ecf20Sopenharmony_ci
1278c2ecf20Sopenharmony_ciint cxlflash_disk_clone(struct scsi_device *sdev,
1288c2ecf20Sopenharmony_ci			struct dk_cxlflash_clone *clone);
1298c2ecf20Sopenharmony_ci
1308c2ecf20Sopenharmony_ciint cxlflash_disk_virtual_open(struct scsi_device *sdev, void *arg);
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_ciint cxlflash_lun_attach(struct glun_info *gli, enum lun_mode mode, bool locked);
1338c2ecf20Sopenharmony_civoid cxlflash_lun_detach(struct glun_info *gli);
1348c2ecf20Sopenharmony_ci
1358c2ecf20Sopenharmony_cistruct ctx_info *get_context(struct cxlflash_cfg *cfg, u64 rctxit, void *arg,
1368c2ecf20Sopenharmony_ci			     enum ctx_ctrl ctrl);
1378c2ecf20Sopenharmony_civoid put_context(struct ctx_info *ctxi);
1388c2ecf20Sopenharmony_ci
1398c2ecf20Sopenharmony_cistruct sisl_rht_entry *get_rhte(struct ctx_info *ctxi, res_hndl_t rhndl,
1408c2ecf20Sopenharmony_ci				struct llun_info *lli);
1418c2ecf20Sopenharmony_ci
1428c2ecf20Sopenharmony_cistruct sisl_rht_entry *rhte_checkout(struct ctx_info *ctxi,
1438c2ecf20Sopenharmony_ci				     struct llun_info *lli);
1448c2ecf20Sopenharmony_civoid rhte_checkin(struct ctx_info *ctxi, struct sisl_rht_entry *rhte);
1458c2ecf20Sopenharmony_ci
1468c2ecf20Sopenharmony_civoid cxlflash_ba_terminate(struct ba_lun *ba_lun);
1478c2ecf20Sopenharmony_ci
1488c2ecf20Sopenharmony_ciint cxlflash_manage_lun(struct scsi_device *sdev,
1498c2ecf20Sopenharmony_ci			struct dk_cxlflash_manage_lun *manage);
1508c2ecf20Sopenharmony_ci
1518c2ecf20Sopenharmony_ciint check_state(struct cxlflash_cfg *cfg);
1528c2ecf20Sopenharmony_ci
1538c2ecf20Sopenharmony_ci#endif /* ifndef _CXLFLASH_SUPERPIPE_H */
154