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