svn commit: r301778 - in head: etc/mtree include sys/cam sys/cam/nvme sys/conf sys/dev/nvme
Warner Losh
imp at FreeBSD.org
Fri Jun 10 06:04:55 UTC 2016
Author: imp
Date: Fri Jun 10 06:04:53 2016
New Revision: 301778
URL: https://svnweb.freebsd.org/changeset/base/301778
Log:
Commit the bits of nda that were missed. This should fix the build.
Approved by: re@
Modified:
head/etc/mtree/BSD.include.dist
head/include/Makefile
head/sys/cam/cam_ccb.h
head/sys/cam/nvme/nvme_xpt.c
head/sys/conf/files
head/sys/dev/nvme/nvme.h
head/sys/dev/nvme/nvme_ctrlr.c
head/sys/dev/nvme/nvme_ns_cmd.c
head/sys/dev/nvme/nvme_private.h
Modified: head/etc/mtree/BSD.include.dist
==============================================================================
--- head/etc/mtree/BSD.include.dist Fri Jun 10 05:21:52 2016 (r301777)
+++ head/etc/mtree/BSD.include.dist Fri Jun 10 06:04:53 2016 (r301778)
@@ -90,6 +90,8 @@
cam
ata
..
+ nvme
+ ..
scsi
..
..
Modified: head/include/Makefile
==============================================================================
--- head/include/Makefile Fri Jun 10 05:21:52 2016 (r301777)
+++ head/include/Makefile Fri Jun 10 06:04:53 2016 (r301778)
@@ -42,7 +42,7 @@ LHDRS= aio.h errno.h fcntl.h linker_set.
LDIRS= bsm cam geom net net80211 netgraph netinet netinet6 \
netipsec netnatm netsmb nfs nfsclient nfsserver sys vm
-LSUBDIRS= cam/ata cam/scsi \
+LSUBDIRS= cam/ata cam/nvme cam/scsi \
dev/acpica dev/agp dev/an dev/bktr dev/ciss dev/filemon dev/firewire \
dev/hwpmc \
dev/ic dev/iicbus dev/io dev/lmc dev/mfi dev/nvme \
Modified: head/sys/cam/cam_ccb.h
==============================================================================
--- head/sys/cam/cam_ccb.h Fri Jun 10 05:21:52 2016 (r301777)
+++ head/sys/cam/cam_ccb.h Fri Jun 10 06:04:53 2016 (r301778)
@@ -359,6 +359,8 @@ struct ccb_getdev {
u_int8_t serial_num[252];
u_int8_t inq_flags;
u_int8_t serial_num_len;
+ const struct nvme_controller_data *nvme_cdata;
+ const struct nvme_namespace_data *nvme_data;
};
/* Device Statistics CCB */
@@ -619,6 +621,11 @@ struct ccb_pathinq_settings_fc {
struct ccb_pathinq_settings_sas {
u_int32_t bitrate; /* Mbps */
};
+
+struct ccb_pathinq_settings_nvme {
+ uint16_t nsid; /* Namespace ID for this path */
+};
+
#define PATHINQ_SETTINGS_SIZE 128
struct ccb_pathinq {
@@ -649,6 +656,7 @@ struct ccb_pathinq {
struct ccb_pathinq_settings_spi spi;
struct ccb_pathinq_settings_fc fc;
struct ccb_pathinq_settings_sas sas;
+ struct ccb_pathinq_settings_nvme nvme;
char ccb_pathinq_settings_opaque[PATHINQ_SETTINGS_SIZE];
} xport_specific;
u_int maxio; /* Max supported I/O size, in bytes. */
@@ -975,6 +983,18 @@ struct ccb_trans_settings_sata {
#define CTS_SATA_CAPS_D_APST 0x00020000
};
+struct ccb_trans_settings_nvme
+{
+ u_int valid; /* Which fields to honor */
+#define CTS_NVME_VALID_SPEC 0x01
+#define CTS_NVME_VALID_CAPS 0x02
+ u_int spec_major; /* Major version of spec supported */
+ u_int spec_minor; /* Minor verison of spec supported */
+ u_int spec_tiny; /* Tiny version of spec supported */
+ u_int max_xfer; /* Max transfer size (0 -> unlimited */
+ u_int caps;
+};
+
/* Get/Set transfer rate/width/disconnection/tag queueing settings */
struct ccb_trans_settings {
struct ccb_hdr ccb_h;
@@ -987,6 +1007,7 @@ struct ccb_trans_settings {
u_int valid; /* Which fields to honor */
struct ccb_trans_settings_ata ata;
struct ccb_trans_settings_scsi scsi;
+ struct ccb_trans_settings_nvme nvme;
} proto_specific;
union {
u_int valid; /* Which fields to honor */
@@ -995,6 +1016,7 @@ struct ccb_trans_settings {
struct ccb_trans_settings_sas sas;
struct ccb_trans_settings_pata ata;
struct ccb_trans_settings_sata sata;
+ struct ccb_trans_settings_nvme nvme;
} xport_specific;
};
Modified: head/sys/cam/nvme/nvme_xpt.c
==============================================================================
--- head/sys/cam/nvme/nvme_xpt.c Fri Jun 10 05:21:52 2016 (r301777)
+++ head/sys/cam/nvme/nvme_xpt.c Fri Jun 10 06:04:53 2016 (r301778)
@@ -137,7 +137,7 @@ static cam_status nvme_probe_register(st
static void nvme_probe_schedule(struct cam_periph *nvme_probe_periph);
static void nvme_probe_start(struct cam_periph *periph, union ccb *start_ccb);
static void nvme_probe_cleanup(struct cam_periph *periph);
-static void nvme_find_quirk(struct cam_ed *device);
+//static void nvme_find_quirk(struct cam_ed *device);
static void nvme_scan_lun(struct cam_periph *periph,
struct cam_path *path, cam_flags flags,
union ccb *ccb);
@@ -312,6 +312,7 @@ nvme_probe_cleanup(struct cam_periph *pe
free(periph->softc, M_CAMXPT);
}
+#if 0
/* XXX should be used, don't delete */
static void
nvme_find_quirk(struct cam_ed *device)
@@ -334,6 +335,7 @@ nvme_find_quirk(struct cam_ed *device)
device->maxtags = quirk->maxtags;
}
}
+#endif
static void
nvme_scan_lun(struct cam_periph *periph, struct cam_path *path,
Modified: head/sys/conf/files
==============================================================================
--- head/sys/conf/files Fri Jun 10 05:21:52 2016 (r301777)
+++ head/sys/conf/files Fri Jun 10 06:04:53 2016 (r301778)
@@ -87,7 +87,7 @@ cam/ata/ata_all.c optional scbus
cam/ata/ata_xpt.c optional scbus
cam/ata/ata_pmp.c optional scbus
cam/nvme/nvme_all.c optional scbus nvme
-cam/nvme/nvme_da.c optional scbus nvme da
+cam/nvme/nvme_da.c optional scbus nvme da !nvd
cam/nvme/nvme_xpt.c optional scbus nvme
cam/scsi/scsi_xpt.c optional scbus
cam/scsi/scsi_all.c optional scbus
Modified: head/sys/dev/nvme/nvme.h
==============================================================================
--- head/sys/dev/nvme/nvme.h Fri Jun 10 05:21:52 2016 (r301777)
+++ head/sys/dev/nvme/nvme.h Fri Jun 10 06:04:53 2016 (r301778)
@@ -47,7 +47,8 @@
*/
#define NVME_GLOBAL_NAMESPACE_TAG ((uint32_t)0xFFFFFFFF)
-#define NVME_MAX_XFER_SIZE MAXPHYS
+/* Cap nvme to 1MB transfers driver explodes with larger sizes */
+#define NVME_MAX_XFER_SIZE (MAXPHYS < (1<<20) ? MAXPHYS : (1<<20))
union cap_lo_register {
uint32_t raw;
@@ -903,6 +904,52 @@ uint32_t nvme_ns_get_stripesize(struct n
int nvme_ns_bio_process(struct nvme_namespace *ns, struct bio *bp,
nvme_cb_fn_t cb_fn);
+/* Command building helper functions -- shared with CAM */
+static inline
+void nvme_ns_flush_cmd(struct nvme_command *cmd, uint16_t nsid)
+{
+
+ cmd->opc = NVME_OPC_FLUSH;
+ cmd->nsid = nsid;
+}
+
+static inline
+void nvme_ns_rw_cmd(struct nvme_command *cmd, uint32_t rwcmd, uint16_t nsid,
+ uint64_t lba, uint32_t count)
+{
+ cmd->opc = rwcmd;
+ cmd->nsid = nsid;
+ *(uint64_t *)&cmd->cdw10 = lba;
+ cmd->cdw12 = count-1;
+ cmd->cdw13 = 0;
+ cmd->cdw14 = 0;
+ cmd->cdw15 = 0;
+}
+
+static inline
+void nvme_ns_write_cmd(struct nvme_command *cmd, uint16_t nsid,
+ uint64_t lba, uint32_t count)
+{
+ nvme_ns_rw_cmd(cmd, NVME_OPC_WRITE, nsid, lba, count);
+}
+
+static inline
+void nvme_ns_read_cmd(struct nvme_command *cmd, uint16_t nsid,
+ uint64_t lba, uint32_t count)
+{
+ nvme_ns_rw_cmd(cmd, NVME_OPC_READ, nsid, lba, count);
+}
+
+static inline
+void nvme_ns_trim_cmd(struct nvme_command *cmd, uint16_t nsid,
+ uint32_t num_ranges)
+{
+ cmd->opc = NVME_OPC_DATASET_MANAGEMENT;
+ cmd->nsid = nsid;
+ cmd->cdw10 = num_ranges - 1;
+ cmd->cdw11 = NVME_DSM_ATTR_DEALLOCATE;
+}
+
#endif /* _KERNEL */
#endif /* __NVME_H__ */
Modified: head/sys/dev/nvme/nvme_ctrlr.c
==============================================================================
--- head/sys/dev/nvme/nvme_ctrlr.c Fri Jun 10 05:21:52 2016 (r301777)
+++ head/sys/dev/nvme/nvme_ctrlr.c Fri Jun 10 06:04:53 2016 (r301778)
@@ -27,6 +27,8 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include "opt_cam.h"
+
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/buf.h>
@@ -801,7 +803,7 @@ nvme_ctrlr_reset_task(void *arg, int pen
atomic_cmpset_32(&ctrlr->is_resetting, 1, 0);
}
-static void
+void
nvme_ctrlr_intx_handler(void *arg)
{
struct nvme_controller *ctrlr = arg;
Modified: head/sys/dev/nvme/nvme_ns_cmd.c
==============================================================================
--- head/sys/dev/nvme/nvme_ns_cmd.c Fri Jun 10 05:21:52 2016 (r301777)
+++ head/sys/dev/nvme/nvme_ns_cmd.c Fri Jun 10 06:04:53 2016 (r301778)
@@ -34,20 +34,14 @@ nvme_ns_cmd_read(struct nvme_namespace *
uint32_t lba_count, nvme_cb_fn_t cb_fn, void *cb_arg)
{
struct nvme_request *req;
- struct nvme_command *cmd;
req = nvme_allocate_request_vaddr(payload,
lba_count*nvme_ns_get_sector_size(ns), cb_fn, cb_arg);
if (req == NULL)
return (ENOMEM);
- cmd = &req->cmd;
- cmd->opc = NVME_OPC_READ;
- cmd->nsid = ns->id;
- /* TODO: create a read command data structure */
- *(uint64_t *)&cmd->cdw10 = lba;
- cmd->cdw12 = lba_count-1;
+ nvme_ns_read_cmd(&req->cmd, ns->id, lba, lba_count);
nvme_ctrlr_submit_io_request(ns->ctrlr, req);
@@ -59,7 +53,6 @@ nvme_ns_cmd_read_bio(struct nvme_namespa
nvme_cb_fn_t cb_fn, void *cb_arg)
{
struct nvme_request *req;
- struct nvme_command *cmd;
uint64_t lba;
uint64_t lba_count;
@@ -67,16 +60,10 @@ nvme_ns_cmd_read_bio(struct nvme_namespa
if (req == NULL)
return (ENOMEM);
- cmd = &req->cmd;
- cmd->opc = NVME_OPC_READ;
- cmd->nsid = ns->id;
lba = bp->bio_offset / nvme_ns_get_sector_size(ns);
lba_count = bp->bio_bcount / nvme_ns_get_sector_size(ns);
-
- /* TODO: create a read command data structure */
- *(uint64_t *)&cmd->cdw10 = lba;
- cmd->cdw12 = lba_count-1;
+ nvme_ns_read_cmd(&req->cmd, ns->id, lba, lba_count);
nvme_ctrlr_submit_io_request(ns->ctrlr, req);
@@ -88,7 +75,6 @@ nvme_ns_cmd_write(struct nvme_namespace
uint32_t lba_count, nvme_cb_fn_t cb_fn, void *cb_arg)
{
struct nvme_request *req;
- struct nvme_command *cmd;
req = nvme_allocate_request_vaddr(payload,
lba_count*nvme_ns_get_sector_size(ns), cb_fn, cb_arg);
@@ -96,13 +82,7 @@ nvme_ns_cmd_write(struct nvme_namespace
if (req == NULL)
return (ENOMEM);
- cmd = &req->cmd;
- cmd->opc = NVME_OPC_WRITE;
- cmd->nsid = ns->id;
-
- /* TODO: create a write command data structure */
- *(uint64_t *)&cmd->cdw10 = lba;
- cmd->cdw12 = lba_count-1;
+ nvme_ns_write_cmd(&req->cmd, ns->id, lba, lba_count);
nvme_ctrlr_submit_io_request(ns->ctrlr, req);
@@ -114,7 +94,6 @@ nvme_ns_cmd_write_bio(struct nvme_namesp
nvme_cb_fn_t cb_fn, void *cb_arg)
{
struct nvme_request *req;
- struct nvme_command *cmd;
uint64_t lba;
uint64_t lba_count;
@@ -122,16 +101,9 @@ nvme_ns_cmd_write_bio(struct nvme_namesp
if (req == NULL)
return (ENOMEM);
- cmd = &req->cmd;
- cmd->opc = NVME_OPC_WRITE;
- cmd->nsid = ns->id;
-
lba = bp->bio_offset / nvme_ns_get_sector_size(ns);
lba_count = bp->bio_bcount / nvme_ns_get_sector_size(ns);
-
- /* TODO: create a write command data structure */
- *(uint64_t *)&cmd->cdw10 = lba;
- cmd->cdw12 = lba_count-1;
+ nvme_ns_write_cmd(&req->cmd, ns->id, lba, lba_count);
nvme_ctrlr_submit_io_request(ns->ctrlr, req);
@@ -168,17 +140,13 @@ int
nvme_ns_cmd_flush(struct nvme_namespace *ns, nvme_cb_fn_t cb_fn, void *cb_arg)
{
struct nvme_request *req;
- struct nvme_command *cmd;
req = nvme_allocate_request_null(cb_fn, cb_arg);
if (req == NULL)
return (ENOMEM);
- cmd = &req->cmd;
- cmd->opc = NVME_OPC_FLUSH;
- cmd->nsid = ns->id;
-
+ nvme_ns_flush_cmd(&req->cmd, ns->id);
nvme_ctrlr_submit_io_request(ns->ctrlr, req);
return (0);
Modified: head/sys/dev/nvme/nvme_private.h
==============================================================================
--- head/sys/dev/nvme/nvme_private.h Fri Jun 10 05:21:52 2016 (r301777)
+++ head/sys/dev/nvme/nvme_private.h Fri Jun 10 06:04:53 2016 (r301778)
@@ -245,6 +245,10 @@ struct nvme_controller {
struct mtx lock;
+ struct cam_sim *sim;
+ struct cam_path *path;
+ int cam_ref;
+
uint32_t ready_timeout_in_ms;
bus_space_tag_t bus_tag;
@@ -528,4 +532,6 @@ void nvme_notify_async_consumers(struct
void nvme_notify_fail_consumers(struct nvme_controller *ctrlr);
void nvme_notify_new_controller(struct nvme_controller *ctrlr);
+void nvme_ctrlr_intx_handler(void *arg);
+
#endif /* __NVME_PRIVATE_H__ */
More information about the svn-src-head
mailing list