nvme_ns_cmd.c revision 240616
1/*-
2 * Copyright (C) 2012 Intel Corporation
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
27#include <sys/cdefs.h>
28__FBSDID("$FreeBSD: head/sys/dev/nvme/nvme_ns_cmd.c 240616 2012-09-17 19:23:01Z jimharris $");
29
30#include "nvme_private.h"
31
32void
33nvme_ns_cmd_read(struct nvme_namespace *ns, void *payload, uint64_t lba,
34    uint32_t lba_count, nvme_cb_fn_t cb_fn, void *cb_arg)
35{
36	struct nvme_tracker	*tr;
37	struct nvme_command	*cmd;
38	int			err;
39
40	tr = nvme_allocate_tracker(ns->ctrlr, FALSE, cb_fn, cb_arg,
41	    lba_count*512, payload);
42
43	cmd = &tr->cmd;
44	cmd->opc = NVME_OPC_READ;
45	cmd->nsid = ns->id;
46
47	/* TODO: create a read command data structure */
48	*(uint64_t *)&cmd->cdw10 = lba;
49	cmd->cdw12 = lba_count-1;
50
51	err = bus_dmamap_load(tr->qpair->dma_tag, tr->dma_map, payload,
52	    tr->payload_size, nvme_payload_map, tr, 0);
53
54	KASSERT(err == 0, ("bus_dmamap_load returned non-zero!\n"));
55}
56
57void
58nvme_ns_cmd_write(struct nvme_namespace *ns, void *payload, uint64_t lba,
59    uint32_t lba_count, nvme_cb_fn_t cb_fn, void *cb_arg)
60{
61	struct nvme_tracker	*tr;
62	struct nvme_command	*cmd;
63	int 			err;
64
65	tr = nvme_allocate_tracker(ns->ctrlr, FALSE, cb_fn, cb_arg,
66	    lba_count*512, payload);
67
68	cmd = &tr->cmd;
69	cmd->opc = NVME_OPC_WRITE;
70	cmd->nsid = ns->id;
71
72	/* TODO: create a write command data structure */
73	*(uint64_t *)&cmd->cdw10 = lba;
74	cmd->cdw12 = lba_count-1;
75
76	err = bus_dmamap_load(tr->qpair->dma_tag, tr->dma_map, payload,
77	    tr->payload_size, nvme_payload_map, tr, 0);
78
79	KASSERT(err == 0, ("bus_dmamap_load returned non-zero!\n"));
80}
81
82void
83nvme_ns_cmd_deallocate(struct nvme_namespace *ns, void *payload,
84    uint8_t num_ranges, nvme_cb_fn_t cb_fn, void *cb_arg)
85{
86	struct nvme_tracker	*tr;
87	struct nvme_command	*cmd;
88	int 			err;
89
90	tr = nvme_allocate_tracker(ns->ctrlr, FALSE, cb_fn, cb_arg,
91	    num_ranges * sizeof(struct nvme_dsm_range), payload);
92
93	cmd = &tr->cmd;
94	cmd->opc = NVME_OPC_DATASET_MANAGEMENT;
95	cmd->nsid = ns->id;
96
97	/* TODO: create a delete command data structure */
98	cmd->cdw10 = num_ranges;
99	cmd->cdw11 = NVME_DSM_ATTR_DEALLOCATE;
100
101	err = bus_dmamap_load(tr->qpair->dma_tag, tr->dma_map, payload,
102	    tr->payload_size, nvme_payload_map, tr, 0);
103
104	KASSERT(err == 0, ("bus_dmamap_load returned non-zero!\n"));
105}
106
107void
108nvme_ns_cmd_flush(struct nvme_namespace *ns, nvme_cb_fn_t cb_fn, void *cb_arg)
109{
110	struct nvme_tracker	*tr;
111	struct nvme_command	*cmd;
112
113	tr = nvme_allocate_tracker(ns->ctrlr, FALSE, cb_fn, cb_arg, 0, NULL);
114
115	cmd = &tr->cmd;
116	cmd->opc = NVME_OPC_FLUSH;
117	cmd->nsid = ns->id;
118
119	nvme_qpair_submit_cmd(tr->qpair, tr);
120}
121