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