nvme_ns_cmd.c revision 248913
1240616Sjimharris/*-
2240616Sjimharris * Copyright (C) 2012 Intel Corporation
3240616Sjimharris * All rights reserved.
4240616Sjimharris *
5240616Sjimharris * Redistribution and use in source and binary forms, with or without
6240616Sjimharris * modification, are permitted provided that the following conditions
7240616Sjimharris * are met:
8240616Sjimharris * 1. Redistributions of source code must retain the above copyright
9240616Sjimharris *    notice, this list of conditions and the following disclaimer.
10240616Sjimharris * 2. Redistributions in binary form must reproduce the above copyright
11240616Sjimharris *    notice, this list of conditions and the following disclaimer in the
12240616Sjimharris *    documentation and/or other materials provided with the distribution.
13240616Sjimharris *
14240616Sjimharris * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15240616Sjimharris * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16240616Sjimharris * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17240616Sjimharris * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18240616Sjimharris * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19240616Sjimharris * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20240616Sjimharris * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21240616Sjimharris * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22240616Sjimharris * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23240616Sjimharris * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24240616Sjimharris * SUCH DAMAGE.
25240616Sjimharris */
26240616Sjimharris
27240616Sjimharris#include <sys/cdefs.h>
28240616Sjimharris__FBSDID("$FreeBSD: head/sys/dev/nvme/nvme_ns_cmd.c 248913 2013-03-29 20:34:28Z jimharris $");
29240616Sjimharris
30240616Sjimharris#include "nvme_private.h"
31240616Sjimharris
32241657Sjimharrisint
33240616Sjimharrisnvme_ns_cmd_read(struct nvme_namespace *ns, void *payload, uint64_t lba,
34240616Sjimharris    uint32_t lba_count, nvme_cb_fn_t cb_fn, void *cb_arg)
35240616Sjimharris{
36241659Sjimharris	struct nvme_request	*req;
37240616Sjimharris	struct nvme_command	*cmd;
38240616Sjimharris
39248913Sjimharris	req = nvme_allocate_request_vaddr(payload, lba_count*512, cb_fn, cb_arg);
40240616Sjimharris
41241660Sjimharris	if (req == NULL)
42241657Sjimharris		return (ENOMEM);
43241659Sjimharris	cmd = &req->cmd;
44240616Sjimharris	cmd->opc = NVME_OPC_READ;
45240616Sjimharris	cmd->nsid = ns->id;
46240616Sjimharris
47240616Sjimharris	/* TODO: create a read command data structure */
48240616Sjimharris	*(uint64_t *)&cmd->cdw10 = lba;
49240616Sjimharris	cmd->cdw12 = lba_count-1;
50240616Sjimharris
51241660Sjimharris	nvme_ctrlr_submit_io_request(ns->ctrlr, req);
52240616Sjimharris
53241657Sjimharris	return (0);
54240616Sjimharris}
55240616Sjimharris
56241657Sjimharrisint
57240616Sjimharrisnvme_ns_cmd_write(struct nvme_namespace *ns, void *payload, uint64_t lba,
58240616Sjimharris    uint32_t lba_count, nvme_cb_fn_t cb_fn, void *cb_arg)
59240616Sjimharris{
60241659Sjimharris	struct nvme_request	*req;
61240616Sjimharris	struct nvme_command	*cmd;
62240616Sjimharris
63248913Sjimharris	req = nvme_allocate_request_vaddr(payload, lba_count*512, cb_fn,
64248913Sjimharris	    cb_arg);
65240616Sjimharris
66241660Sjimharris	if (req == NULL)
67241657Sjimharris		return (ENOMEM);
68241657Sjimharris
69241659Sjimharris	cmd = &req->cmd;
70240616Sjimharris	cmd->opc = NVME_OPC_WRITE;
71240616Sjimharris	cmd->nsid = ns->id;
72240616Sjimharris
73240616Sjimharris	/* TODO: create a write command data structure */
74240616Sjimharris	*(uint64_t *)&cmd->cdw10 = lba;
75240616Sjimharris	cmd->cdw12 = lba_count-1;
76240616Sjimharris
77241660Sjimharris	nvme_ctrlr_submit_io_request(ns->ctrlr, req);
78240616Sjimharris
79241657Sjimharris	return (0);
80240616Sjimharris}
81240616Sjimharris
82241657Sjimharrisint
83240616Sjimharrisnvme_ns_cmd_deallocate(struct nvme_namespace *ns, void *payload,
84240616Sjimharris    uint8_t num_ranges, nvme_cb_fn_t cb_fn, void *cb_arg)
85240616Sjimharris{
86241659Sjimharris	struct nvme_request	*req;
87240616Sjimharris	struct nvme_command	*cmd;
88240616Sjimharris
89248913Sjimharris	req = nvme_allocate_request_vaddr(payload,
90241659Sjimharris	    num_ranges * sizeof(struct nvme_dsm_range), cb_fn, cb_arg);
91240616Sjimharris
92241660Sjimharris	if (req == NULL)
93241657Sjimharris		return (ENOMEM);
94241657Sjimharris
95241659Sjimharris	cmd = &req->cmd;
96240616Sjimharris	cmd->opc = NVME_OPC_DATASET_MANAGEMENT;
97240616Sjimharris	cmd->nsid = ns->id;
98240616Sjimharris
99240616Sjimharris	/* TODO: create a delete command data structure */
100248730Sjimharris	cmd->cdw10 = num_ranges - 1;
101240616Sjimharris	cmd->cdw11 = NVME_DSM_ATTR_DEALLOCATE;
102240616Sjimharris
103241660Sjimharris	nvme_ctrlr_submit_io_request(ns->ctrlr, req);
104240616Sjimharris
105241657Sjimharris	return (0);
106240616Sjimharris}
107240616Sjimharris
108241657Sjimharrisint
109240616Sjimharrisnvme_ns_cmd_flush(struct nvme_namespace *ns, nvme_cb_fn_t cb_fn, void *cb_arg)
110240616Sjimharris{
111241659Sjimharris	struct nvme_request	*req;
112240616Sjimharris	struct nvme_command	*cmd;
113240616Sjimharris
114248913Sjimharris	req = nvme_allocate_request_null(cb_fn, cb_arg);
115240616Sjimharris
116241660Sjimharris	if (req == NULL)
117241657Sjimharris		return (ENOMEM);
118241657Sjimharris
119241659Sjimharris	cmd = &req->cmd;
120240616Sjimharris	cmd->opc = NVME_OPC_FLUSH;
121240616Sjimharris	cmd->nsid = ns->id;
122240616Sjimharris
123241660Sjimharris	nvme_ctrlr_submit_io_request(ns->ctrlr, req);
124241657Sjimharris
125241657Sjimharris	return (0);
126240616Sjimharris}
127