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