Skip to content

Commit c21e0bb

Browse files
Matthew R. OchsJames Bottomley
authored andcommitted
cxlflash: Base support for IBM CXL Flash Adapter
SCSI device driver to support filesystem access on the IBM CXL Flash adapter. Supported-by: Stephen Bates <stephen.bates@pmcs.com> Reviewed-by: Michael Neuling <mikey@neuling.org> Signed-off-by: Matthew R. Ochs <mrochs@linux.vnet.ibm.com> Signed-off-by: Manoj N. Kumar <manoj@linux.vnet.ibm.com> Reviewed-by: Brian King <brking@linux.vnet.ibm.com> Signed-off-by: James Bottomley <JBottomley@Odin.com>
1 parent 2dc127b commit c21e0bb

File tree

8 files changed

+3058
-0
lines changed

8 files changed

+3058
-0
lines changed

drivers/scsi/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,7 @@ source "drivers/scsi/cxgbi/Kconfig"
345345
source "drivers/scsi/bnx2i/Kconfig"
346346
source "drivers/scsi/bnx2fc/Kconfig"
347347
source "drivers/scsi/be2iscsi/Kconfig"
348+
source "drivers/scsi/cxlflash/Kconfig"
348349

349350
config SGIWD93_SCSI
350351
tristate "SGI WD93C93 SCSI Driver"

drivers/scsi/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ obj-$(CONFIG_SCSI_7000FASST) += wd7000.o
102102
obj-$(CONFIG_SCSI_EATA) += eata.o
103103
obj-$(CONFIG_SCSI_DC395x) += dc395x.o
104104
obj-$(CONFIG_SCSI_AM53C974) += esp_scsi.o am53c974.o
105+
obj-$(CONFIG_CXLFLASH) += cxlflash/
105106
obj-$(CONFIG_MEGARAID_LEGACY) += megaraid.o
106107
obj-$(CONFIG_MEGARAID_NEWGEN) += megaraid/
107108
obj-$(CONFIG_MEGARAID_SAS) += megaraid/

drivers/scsi/cxlflash/Kconfig

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#
2+
# IBM CXL-attached Flash Accelerator SCSI Driver
3+
#
4+
5+
config CXLFLASH
6+
tristate "Support for IBM CAPI Flash"
7+
depends on PCI && SCSI && CXL
8+
default m
9+
help
10+
Allows CAPI Accelerated IO to Flash
11+
If unsure, say N.

drivers/scsi/cxlflash/Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
obj-$(CONFIG_CXLFLASH) += cxlflash.o
2+
cxlflash-y += main.o

drivers/scsi/cxlflash/common.h

Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
/*
2+
* CXL Flash Device Driver
3+
*
4+
* Written by: Manoj N. Kumar <manoj@linux.vnet.ibm.com>, IBM Corporation
5+
* Matthew R. Ochs <mrochs@linux.vnet.ibm.com>, IBM Corporation
6+
*
7+
* Copyright (C) 2015 IBM Corporation
8+
*
9+
* This program is free software; you can redistribute it and/or
10+
* modify it under the terms of the GNU General Public License
11+
* as published by the Free Software Foundation; either version
12+
* 2 of the License, or (at your option) any later version.
13+
*/
14+
15+
#ifndef _CXLFLASH_COMMON_H
16+
#define _CXLFLASH_COMMON_H
17+
18+
#include <linux/list.h>
19+
#include <linux/types.h>
20+
#include <scsi/scsi.h>
21+
#include <scsi/scsi_device.h>
22+
23+
24+
#define MAX_CONTEXT CXLFLASH_MAX_CONTEXT /* num contexts per afu */
25+
26+
#define CXLFLASH_BLOCK_SIZE 4096 /* 4K blocks */
27+
#define CXLFLASH_MAX_XFER_SIZE 16777216 /* 16MB transfer */
28+
#define CXLFLASH_MAX_SECTORS (CXLFLASH_MAX_XFER_SIZE/512) /* SCSI wants
29+
max_sectors
30+
in units of
31+
512 byte
32+
sectors
33+
*/
34+
35+
#define NUM_RRQ_ENTRY 16 /* for master issued cmds */
36+
#define MAX_RHT_PER_CONTEXT (PAGE_SIZE / sizeof(struct sisl_rht_entry))
37+
38+
/* AFU command retry limit */
39+
#define MC_RETRY_CNT 5 /* sufficient for SCSI check and
40+
certain AFU errors */
41+
42+
/* Command management definitions */
43+
#define CXLFLASH_NUM_CMDS (2 * CXLFLASH_MAX_CMDS) /* Must be a pow2 for
44+
alignment and more
45+
efficient array
46+
index derivation
47+
*/
48+
49+
#define CXLFLASH_MAX_CMDS 16
50+
#define CXLFLASH_MAX_CMDS_PER_LUN CXLFLASH_MAX_CMDS
51+
52+
53+
static inline void check_sizes(void)
54+
{
55+
BUILD_BUG_ON_NOT_POWER_OF_2(CXLFLASH_NUM_CMDS);
56+
}
57+
58+
/* AFU defines a fixed size of 4K for command buffers (borrow 4K page define) */
59+
#define CMD_BUFSIZE SIZE_4K
60+
61+
/* flags in IOA status area for host use */
62+
#define B_DONE 0x01
63+
#define B_ERROR 0x02 /* set with B_DONE */
64+
#define B_TIMEOUT 0x04 /* set with B_DONE & B_ERROR */
65+
66+
enum cxlflash_lr_state {
67+
LINK_RESET_INVALID,
68+
LINK_RESET_REQUIRED,
69+
LINK_RESET_COMPLETE
70+
};
71+
72+
enum cxlflash_init_state {
73+
INIT_STATE_NONE,
74+
INIT_STATE_PCI,
75+
INIT_STATE_AFU,
76+
INIT_STATE_SCSI
77+
};
78+
79+
/*
80+
* Each context has its own set of resource handles that is visible
81+
* only from that context.
82+
*/
83+
84+
struct cxlflash_cfg {
85+
struct afu *afu;
86+
struct cxl_context *mcctx;
87+
88+
struct pci_dev *dev;
89+
struct pci_device_id *dev_id;
90+
struct Scsi_Host *host;
91+
92+
ulong cxlflash_regs_pci;
93+
94+
wait_queue_head_t eeh_waitq;
95+
96+
struct work_struct work_q;
97+
enum cxlflash_init_state init_state;
98+
enum cxlflash_lr_state lr_state;
99+
int lr_port;
100+
101+
struct cxl_afu *cxl_afu;
102+
103+
struct pci_pool *cxlflash_cmd_pool;
104+
struct pci_dev *parent_dev;
105+
106+
wait_queue_head_t tmf_waitq;
107+
bool tmf_active;
108+
u8 err_recovery_active:1;
109+
};
110+
111+
struct afu_cmd {
112+
struct sisl_ioarcb rcb; /* IOARCB (cache line aligned) */
113+
struct sisl_ioasa sa; /* IOASA must follow IOARCB */
114+
spinlock_t slock;
115+
struct completion cevent;
116+
char *buf; /* per command buffer */
117+
struct afu *parent;
118+
int slot;
119+
atomic_t free;
120+
121+
u8 cmd_tmf:1;
122+
123+
/* As per the SISLITE spec the IOARCB EA has to be 16-byte aligned.
124+
* However for performance reasons the IOARCB/IOASA should be
125+
* cache line aligned.
126+
*/
127+
} __aligned(cache_line_size());
128+
129+
struct afu {
130+
/* Stuff requiring alignment go first. */
131+
132+
u64 rrq_entry[NUM_RRQ_ENTRY]; /* 128B RRQ */
133+
/*
134+
* Command & data for AFU commands.
135+
*/
136+
struct afu_cmd cmd[CXLFLASH_NUM_CMDS];
137+
138+
/* Beware of alignment till here. Preferably introduce new
139+
* fields after this point
140+
*/
141+
142+
/* AFU HW */
143+
struct cxl_ioctl_start_work work;
144+
struct cxlflash_afu_map *afu_map; /* entire MMIO map */
145+
struct sisl_host_map *host_map; /* MC host map */
146+
struct sisl_ctrl_map *ctrl_map; /* MC control map */
147+
148+
ctx_hndl_t ctx_hndl; /* master's context handle */
149+
u64 *hrrq_start;
150+
u64 *hrrq_end;
151+
u64 *hrrq_curr;
152+
bool toggle;
153+
bool read_room;
154+
atomic64_t room;
155+
u64 hb;
156+
u32 cmd_couts; /* Number of command checkouts */
157+
u32 internal_lun; /* User-desired LUN mode for this AFU */
158+
159+
char version[8];
160+
u64 interface_version;
161+
162+
struct cxlflash_cfg *parent; /* Pointer back to parent cxlflash_cfg */
163+
164+
};
165+
166+
static inline u64 lun_to_lunid(u64 lun)
167+
{
168+
u64 lun_id;
169+
170+
int_to_scsilun(lun, (struct scsi_lun *)&lun_id);
171+
return swab64(lun_id);
172+
}
173+
174+
int cxlflash_send_cmd(struct afu *, struct afu_cmd *);
175+
void cxlflash_wait_resp(struct afu *, struct afu_cmd *);
176+
int cxlflash_afu_reset(struct cxlflash_cfg *);
177+
struct afu_cmd *cxlflash_cmd_checkout(struct afu *);
178+
void cxlflash_cmd_checkin(struct afu_cmd *);
179+
int cxlflash_afu_sync(struct afu *, ctx_hndl_t, res_hndl_t, u8);
180+
#endif /* ifndef _CXLFLASH_COMMON_H */

0 commit comments

Comments
 (0)