| /* |
| * CXL Flash Device Driver |
| * |
| * Written by: Manoj N. Kumar <manoj@linux.vnet.ibm.com>, IBM Corporation |
| * Matthew R. Ochs <mrochs@linux.vnet.ibm.com>, IBM Corporation |
| * |
| * Copyright (C) 2015 IBM Corporation |
| * |
| * This program is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU General Public License |
| * as published by the Free Software Foundation; either version |
| * 2 of the License, or (at your option) any later version. |
| */ |
| |
| #ifndef _CXLFLASH_SUPERPIPE_H |
| #define _CXLFLASH_SUPERPIPE_H |
| |
| extern struct cxlflash_global global; |
| |
| /* |
| * Terminology: use afu (and not adapter) to refer to the HW. |
| * Adapter is the entire slot and includes PSL out of which |
| * only the AFU is visible to user space. |
| */ |
| |
| /* Chunk size parms: note sislite minimum chunk size is |
| * 0x10000 LBAs corresponding to a NMASK or 16. |
| */ |
| #define MC_CHUNK_SIZE (1 << MC_RHT_NMASK) /* in LBAs */ |
| |
| #define CMD_TIMEOUT 30 /* 30 secs */ |
| #define CMD_RETRIES 5 /* 5 retries for scsi_execute */ |
| |
| #define MAX_SECTOR_UNIT 512 /* max_sector is in 512 byte multiples */ |
| |
| enum lun_mode { |
| MODE_NONE = 0, |
| MODE_VIRTUAL, |
| MODE_PHYSICAL |
| }; |
| |
| /* Global (entire driver, spans adapters) lun_info structure */ |
| struct glun_info { |
| u64 max_lba; /* from read cap(16) */ |
| u32 blk_len; /* from read cap(16) */ |
| enum lun_mode mode; /* NONE, VIRTUAL, PHYSICAL */ |
| int users; /* Number of users w/ references to LUN */ |
| |
| u8 wwid[16]; |
| |
| struct mutex mutex; |
| |
| struct blka blka; |
| struct list_head list; |
| }; |
| |
| /* Local (per-adapter) lun_info structure */ |
| struct llun_info { |
| u64 lun_id[MAX_FC_PORTS]; /* from REPORT_LUNS */ |
| u32 lun_index; /* Index in the LUN table */ |
| u32 host_no; /* host_no from Scsi_host */ |
| u32 port_sel; /* What port to use for this LUN */ |
| bool in_table; /* Whether a LUN table entry was created */ |
| |
| u8 wwid[16]; /* Keep a duplicate copy here? */ |
| |
| struct glun_info *parent; /* Pointer to entry in global LUN structure */ |
| struct scsi_device *sdev; |
| struct list_head list; |
| }; |
| |
| struct lun_access { |
| struct llun_info *lli; |
| struct scsi_device *sdev; |
| struct list_head list; |
| }; |
| |
| enum ctx_ctrl { |
| CTX_CTRL_CLONE = (1 << 1), |
| CTX_CTRL_ERR = (1 << 2), |
| CTX_CTRL_ERR_FALLBACK = (1 << 3), |
| CTX_CTRL_NOPID = (1 << 4), |
| CTX_CTRL_FILE = (1 << 5) |
| }; |
| |
| #define ENCODE_CTXID(_ctx, _id) (((((u64)_ctx) & 0xFFFFFFFF0ULL) << 28) | _id) |
| #define DECODE_CTXID(_val) (_val & 0xFFFFFFFF) |
| |
| struct ctx_info { |
| struct sisl_ctrl_map __iomem *ctrl_map; /* initialized at startup */ |
| struct sisl_rht_entry *rht_start; /* 1 page (req'd for alignment), |
| * alloc/free on attach/detach |
| */ |
| u32 rht_out; /* Number of checked out RHT entries */ |
| u32 rht_perms; /* User-defined permissions for RHT entries */ |
| struct llun_info **rht_lun; /* Mapping of RHT entries to LUNs */ |
| u8 *rht_needs_ws; /* User-desired write-same function per RHTE */ |
| |
| struct cxl_ioctl_start_work work; |
| u64 ctxid; |
| pid_t pid; |
| bool initialized; |
| bool unavail; |
| bool err_recovery_active; |
| struct mutex mutex; /* Context protection */ |
| struct kref kref; |
| struct cxl_context *ctx; |
| struct cxlflash_cfg *cfg; |
| struct list_head luns; /* LUNs attached to this context */ |
| const struct vm_operations_struct *cxl_mmap_vmops; |
| struct file *file; |
| struct list_head list; /* Link contexts in error recovery */ |
| }; |
| |
| struct cxlflash_global { |
| struct mutex mutex; |
| struct list_head gluns;/* list of glun_info structs */ |
| struct page *err_page; /* One page of all 0xF for error notification */ |
| }; |
| |
| int cxlflash_vlun_resize(struct scsi_device *sdev, |
| struct dk_cxlflash_resize *resize); |
| int _cxlflash_vlun_resize(struct scsi_device *sdev, struct ctx_info *ctxi, |
| struct dk_cxlflash_resize *resize); |
| |
| int cxlflash_disk_release(struct scsi_device *sdev, |
| struct dk_cxlflash_release *release); |
| int _cxlflash_disk_release(struct scsi_device *sdev, struct ctx_info *ctxi, |
| struct dk_cxlflash_release *release); |
| |
| int cxlflash_disk_clone(struct scsi_device *sdev, |
| struct dk_cxlflash_clone *clone); |
| |
| int cxlflash_disk_virtual_open(struct scsi_device *sdev, void *arg); |
| |
| int cxlflash_lun_attach(struct glun_info *gli, enum lun_mode mode, bool locked); |
| void cxlflash_lun_detach(struct glun_info *gli); |
| |
| struct ctx_info *get_context(struct cxlflash_cfg *cfg, u64 rctxit, void *arg, |
| enum ctx_ctrl ctrl); |
| void put_context(struct ctx_info *ctxi); |
| |
| struct sisl_rht_entry *get_rhte(struct ctx_info *ctxi, res_hndl_t rhndl, |
| struct llun_info *lli); |
| |
| struct sisl_rht_entry *rhte_checkout(struct ctx_info *ctxi, |
| struct llun_info *lli); |
| void rhte_checkin(struct ctx_info *ctxi, struct sisl_rht_entry *rhte); |
| |
| void cxlflash_ba_terminate(struct ba_lun *ba_lun); |
| |
| int cxlflash_manage_lun(struct scsi_device *sdev, |
| struct dk_cxlflash_manage_lun *manage); |
| |
| int check_state(struct cxlflash_cfg *cfg); |
| |
| #endif /* ifndef _CXLFLASH_SUPERPIPE_H */ |