forked from Minki/linux
2cb79266d6
Add support for physical LUN segmentation (virtual LUNs) to device driver supporting the IBM CXL Flash adapter. This patch allows user space applications to virtually segment a physical LUN into N virtual LUNs, taking advantage of the translation features provided by this adapter. Signed-off-by: Matthew R. Ochs <mrochs@linux.vnet.ibm.com> Signed-off-by: Manoj N. Kumar <manoj@linux.vnet.ibm.com> Reviewed-by: Michael Neuling <mikey@neuling.org> Reviewed-by: Wen Xiong <wenxiong@linux.vnet.ibm.com> Signed-off-by: James Bottomley <JBottomley@Odin.com>
87 lines
2.8 KiB
C
87 lines
2.8 KiB
C
/*
|
|
* 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_VLUN_H
|
|
#define _CXLFLASH_VLUN_H
|
|
|
|
/* RHT - Resource Handle Table */
|
|
#define MC_RHT_NMASK 16 /* in bits */
|
|
#define MC_CHUNK_SHIFT MC_RHT_NMASK /* shift to go from LBA to chunk# */
|
|
|
|
#define HIBIT (BITS_PER_LONG - 1)
|
|
|
|
#define MAX_AUN_CLONE_CNT 0xFF
|
|
|
|
/*
|
|
* LXT - LBA Translation Table
|
|
*
|
|
* +-------+-------+-------+-------+-------+-------+-------+---+---+
|
|
* | RLBA_BASE |LUN_IDX| P |SEL|
|
|
* +-------+-------+-------+-------+-------+-------+-------+---+---+
|
|
*
|
|
* The LXT Entry contains the physical LBA where the chunk starts (RLBA_BASE).
|
|
* AFU ORes the low order bits from the virtual LBA (offset into the chunk)
|
|
* with RLBA_BASE. The result is the physical LBA to be sent to storage.
|
|
* The LXT Entry also contains an index to a LUN TBL and a bitmask of which
|
|
* outgoing (FC) * ports can be selected. The port select bit-mask is ANDed
|
|
* with a global port select bit-mask maintained by the driver.
|
|
* In addition, it has permission bits that are ANDed with the
|
|
* RHT permissions to arrive at the final permissions for the chunk.
|
|
*
|
|
* LXT tables are allocated dynamically in groups. This is done to avoid
|
|
* a malloc/free overhead each time the LXT has to grow or shrink.
|
|
*
|
|
* Based on the current lxt_cnt (used), it is always possible to know
|
|
* how many are allocated (used+free). The number of allocated entries is
|
|
* not stored anywhere.
|
|
*
|
|
* The LXT table is re-allocated whenever it needs to cross into another group.
|
|
*/
|
|
#define LXT_GROUP_SIZE 8
|
|
#define LXT_NUM_GROUPS(lxt_cnt) (((lxt_cnt) + 7)/8) /* alloc'ed groups */
|
|
#define LXT_LUNIDX_SHIFT 8 /* LXT entry, shift for LUN index */
|
|
#define LXT_PERM_SHIFT 4 /* LXT entry, shift for permission bits */
|
|
|
|
struct ba_lun_info {
|
|
u64 *lun_alloc_map;
|
|
u32 lun_bmap_size;
|
|
u32 total_aus;
|
|
u64 free_aun_cnt;
|
|
|
|
/* indices to be used for elevator lookup of free map */
|
|
u32 free_low_idx;
|
|
u32 free_curr_idx;
|
|
u32 free_high_idx;
|
|
|
|
u8 *aun_clone_map;
|
|
};
|
|
|
|
struct ba_lun {
|
|
u64 lun_id;
|
|
u64 wwpn;
|
|
size_t lsize; /* LUN size in number of LBAs */
|
|
size_t lba_size; /* LBA size in number of bytes */
|
|
size_t au_size; /* Allocation Unit size in number of LBAs */
|
|
struct ba_lun_info *ba_lun_handle;
|
|
};
|
|
|
|
/* Block Allocator */
|
|
struct blka {
|
|
struct ba_lun ba_lun;
|
|
u64 nchunk; /* number of chunks */
|
|
struct mutex mutex;
|
|
};
|
|
|
|
#endif /* ifndef _CXLFLASH_SUPERPIPE_H */
|