Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F133556716
D10247.id29674.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
6 KB
Referenced Files
None
Subscribers
None
D10247.id29674.diff
View Options
Index: sys/cam/cam_ccb.h
===================================================================
--- sys/cam/cam_ccb.h
+++ sys/cam/cam_ccb.h
@@ -206,7 +206,7 @@
/* Serial Management Protocol */
XPT_NVME_IO = 0x1c | XPT_FC_DEV_QUEUED,
- /* Execiute the requestred NVMe I/O operation */
+ /* Execute the requested NVMe I/O operation */
XPT_MMCSD_IO = 0x1d | XPT_FC_DEV_QUEUED,
/* Placeholder for MMC / SD / SDIO I/O stuff */
@@ -215,6 +215,9 @@
| XPT_FC_XPT_ONLY,
/* Scan Target */
+ XPT_NVME_ADMIN = 0x1f | XPT_FC_DEV_QUEUED,
+ /* Execute the requested NVMe Admin operation */
+
/* HBA engine commands 0x20->0x2F */
XPT_ENG_INQ = 0x20 | XPT_FC_XPT_ONLY,
/* HBA engine feature inquiry */
@@ -805,7 +808,7 @@
};
/*
- * NVMe I/O Request CCB used for the XPT_NVME_IO function code.
+ * NVMe I/O Request CCB used for the XPT_NVME_IO and XPT_NVME_ADMIN function codes.
*/
struct ccb_nvmeio {
struct ccb_hdr ccb_h;
@@ -1443,6 +1446,21 @@
nvmeio->data_ptr = data_ptr;
nvmeio->dxfer_len = dxfer_len;
}
+
+static __inline void
+cam_fill_nvmeadmin(struct ccb_nvmeio *nvmeio, u_int32_t retries,
+ void (*cbfcnp)(struct cam_periph *, union ccb *),
+ u_int32_t flags, u_int8_t *data_ptr, u_int32_t dxfer_len,
+ u_int32_t timeout)
+{
+ nvmeio->ccb_h.func_code = XPT_NVME_ADMIN;
+ nvmeio->ccb_h.flags = flags;
+ nvmeio->ccb_h.retry_count = retries;
+ nvmeio->ccb_h.cbfcnp = cbfcnp;
+ nvmeio->ccb_h.timeout = timeout;
+ nvmeio->data_ptr = data_ptr;
+ nvmeio->dxfer_len = dxfer_len;
+}
__END_DECLS
#endif /* _CAM_CAM_CCB_H */
Index: sys/cam/cam_periph.c
===================================================================
--- sys/cam/cam_periph.c
+++ sys/cam/cam_periph.c
@@ -826,6 +826,17 @@
dirs[1] = CAM_DIR_IN;
numbufs = 2;
break;
+ case XPT_NVME_IO:
+ case XPT_NVME_ADMIN:
+ if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_NONE)
+ return (0);
+ if ((ccb->ccb_h.flags & CAM_DATA_MASK) != CAM_DATA_VADDR)
+ return (EINVAL);
+ data_ptrs[0] = &ccb->nvmeio.data_ptr;
+ lengths[0] = ccb->nvmeio.dxfer_len;
+ dirs[0] = ccb->ccb_h.flags & CAM_DIR_MASK;
+ numbufs = 1;
+ break;
case XPT_DEV_ADVINFO:
if (ccb->cdai.bufsiz == 0)
return (0);
@@ -992,6 +1003,11 @@
numbufs = min(mapinfo->num_bufs_used, 1);
data_ptrs[0] = (uint8_t **)&ccb->cdai.buf;
break;
+ case XPT_NVME_IO:
+ case XPT_NVME_ADMIN:
+ data_ptrs[0] = &ccb->nvmeio.data_ptr;
+ numbufs = min(mapinfo->num_bufs_used, 1);
+ break;
default:
/* allow ourselves to be swapped once again */
PRELE(curproc);
Index: sys/cam/cam_xpt.c
===================================================================
--- sys/cam/cam_xpt.c
+++ sys/cam/cam_xpt.c
@@ -2687,8 +2687,8 @@
start_ccb->ataio.resid = 0;
/* FALLTHROUGH */
case XPT_NVME_IO:
- if (start_ccb->ccb_h.func_code == XPT_NVME_IO)
- start_ccb->nvmeio.resid = 0;
+ /* FALLTHROUGH */
+ case XPT_NVME_ADMIN:
/* FALLTHROUGH */
case XPT_RESET_DEV:
case XPT_ENG_EXEC:
@@ -5543,6 +5543,7 @@
{ XPT_MMCSD_IO, "XPT_MMCSD_IO" },
{ XPT_SMP_IO, "XPT_SMP_IO" },
{ XPT_SCAN_TGT, "XPT_SCAN_TGT" },
+ { XPT_NVME_ADMIN, "XPT_NVME_ADMIN" },
{ XPT_ENG_INQ, "XPT_ENG_INQ" },
{ XPT_ENG_EXEC, "XPT_ENG_EXEC" },
{ XPT_EN_LUN, "XPT_EN_LUN" },
Index: sys/cam/scsi/scsi_pass.c
===================================================================
--- sys/cam/scsi/scsi_pass.c
+++ sys/cam/scsi/scsi_pass.c
@@ -1146,6 +1146,11 @@
numbufs = min(io_req->num_bufs, 1);
data_ptrs[0] = (uint8_t **)&ccb->cdai.buf;
break;
+ case XPT_NVME_IO:
+ case XPT_NVME_ADMIN:
+ data_ptrs[0] = &ccb->nvmeio.data_ptr;
+ numbufs = min(io_req->num_bufs, 1);
+ break;
default:
/* allow ourselves to be swapped once again */
return;
@@ -1384,6 +1389,25 @@
dirs[0] = CAM_DIR_IN;
numbufs = 1;
break;
+ case XPT_NVME_ADMIN:
+ case XPT_NVME_IO:
+ if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_NONE)
+ return (0);
+
+ io_req->data_flags = ccb->ccb_h.flags & CAM_DATA_MASK;
+
+ /*
+ * We only support a single virtual address for NVMe
+ */
+ if ((ccb->ccb_h.flags & CAM_DATA_MASK) != CAM_DATA_VADDR)
+ return (EINVAL);
+
+ data_ptrs[0] = &ccb->nvmeio.data_ptr;
+ lengths[0] = ccb->nvmeio.dxfer_len;
+ dirs[0] = ccb->ccb_h.flags & CAM_DIR_MASK;
+ numbufs = 1;
+ maxmap = softc->maxio;
+ break;
default:
return(EINVAL);
break; /* NOTREACHED */
@@ -1957,7 +1981,8 @@
*/
if ((fc == XPT_SCSI_IO) || (fc == XPT_ATA_IO)
|| (fc == XPT_SMP_IO) || (fc == XPT_DEV_MATCH)
- || (fc == XPT_DEV_ADVINFO)) {
+ || (fc == XPT_DEV_ADVINFO)
+ || (fc == XPT_NVME_ADMIN) || (fc == XPT_NVME_IO)) {
error = passmemsetup(periph, io_req);
if (error != 0)
goto camioqueue_error;
@@ -2202,6 +2227,7 @@
*/
fc = ccb->ccb_h.func_code;
if ((fc == XPT_SCSI_IO) || (fc == XPT_ATA_IO) || (fc == XPT_SMP_IO)
+ || (fc == XPT_NVME_IO) || (fc == XPT_NVME_ADMIN)
|| (fc == XPT_DEV_MATCH) || (fc == XPT_DEV_ADVINFO)) {
bzero(&mapinfo, sizeof(mapinfo));
Index: sys/dev/nvme/nvme_sim.c
===================================================================
--- sys/dev/nvme/nvme_sim.c
+++ sys/dev/nvme/nvme_sim.c
@@ -110,7 +110,10 @@
memcpy(&req->cmd, &ccb->nvmeio.cmd, sizeof(ccb->nvmeio.cmd));
- nvme_ctrlr_submit_io_request(ctrlr, req);
+ if (ccb->ccb_h.func_code == XPT_NVME_IO)
+ nvme_ctrlr_submit_io_request(ctrlr, req);
+ else
+ nvme_ctrlr_submit_admin_request(ctrlr, req);
ccb->ccb_h.status |= CAM_SIM_QUEUED;
}
@@ -225,6 +228,7 @@
ccb->ccb_h.status = CAM_REQ_CMP;
break;
case XPT_NVME_IO: /* Execute the requested I/O operation */
+ case XPT_NVME_ADMIN: /* or Admin operation */
nvme_sim_nvmeio(sim, ccb);
return; /* no done */
default:
Index: sys/kern/subr_bus_dma.c
===================================================================
--- sys/kern/subr_bus_dma.c
+++ sys/kern/subr_bus_dma.c
@@ -218,6 +218,16 @@
sglist_cnt = 0;
break;
}
+ case XPT_NVME_IO:
+ case XPT_NVME_ADMIN: {
+ struct ccb_nvmeio *nvmeio;
+
+ nvmeio = &ccb->nvmeio;
+ data_ptr = nvmeio->data_ptr;
+ dxfer_len = nvmeio->dxfer_len;
+ sglist_cnt = 0;
+ break;
+ }
default:
panic("_bus_dmamap_load_ccb: Unsupported func code %d",
ccb_h->func_code);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Oct 27, 3:38 PM (14 h, 17 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
24300931
Default Alt Text
D10247.id29674.diff (6 KB)
Attached To
Mode
D10247: Add CAM passthrough for NVMe
Attached
Detach File
Event Timeline
Log In to Comment