devlist.c revision 253458
1252265Sjimharris/*- 2252265Sjimharris * Copyright (C) 2012-2013 Intel Corporation 3252265Sjimharris * All rights reserved. 4252265Sjimharris * 5252265Sjimharris * Redistribution and use in source and binary forms, with or without 6252265Sjimharris * modification, are permitted provided that the following conditions 7252265Sjimharris * are met: 8252265Sjimharris * 1. Redistributions of source code must retain the above copyright 9252265Sjimharris * notice, this list of conditions and the following disclaimer. 10252265Sjimharris * 2. Redistributions in binary form must reproduce the above copyright 11252265Sjimharris * notice, this list of conditions and the following disclaimer in the 12252265Sjimharris * documentation and/or other materials provided with the distribution. 13252265Sjimharris * 14252265Sjimharris * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15252265Sjimharris * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16252265Sjimharris * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17252265Sjimharris * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18252265Sjimharris * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19252265Sjimharris * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20252265Sjimharris * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21252265Sjimharris * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22252265Sjimharris * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23252265Sjimharris * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24252265Sjimharris * SUCH DAMAGE. 25252265Sjimharris */ 26252265Sjimharris 27252265Sjimharris#include <sys/cdefs.h> 28252265Sjimharris__FBSDID("$FreeBSD: head/sbin/nvmecontrol/devlist.c 253458 2013-07-18 23:12:44Z jimharris $"); 29252265Sjimharris 30252265Sjimharris#include <sys/param.h> 31252265Sjimharris 32253109Sjimharris#include <err.h> 33253458Sjimharris#include <errno.h> 34252265Sjimharris#include <fcntl.h> 35252265Sjimharris#include <stddef.h> 36252265Sjimharris#include <stdio.h> 37252265Sjimharris#include <stdlib.h> 38252265Sjimharris#include <string.h> 39252265Sjimharris#include <unistd.h> 40252265Sjimharris 41252265Sjimharris#include "nvmecontrol.h" 42252265Sjimharris 43252265Sjimharrisstatic void 44252265Sjimharrisdevlist_usage(void) 45252265Sjimharris{ 46252265Sjimharris fprintf(stderr, "usage:\n"); 47252265Sjimharris fprintf(stderr, DEVLIST_USAGE); 48253109Sjimharris exit(1); 49252265Sjimharris} 50252265Sjimharris 51252265Sjimharrisstatic inline uint32_t 52252265Sjimharrisns_get_sector_size(struct nvme_namespace_data *nsdata) 53252265Sjimharris{ 54252265Sjimharris 55252265Sjimharris return (1 << nsdata->lbaf[0].lbads); 56252265Sjimharris} 57252265Sjimharris 58252265Sjimharrisvoid 59252265Sjimharrisdevlist(int argc, char *argv[]) 60252265Sjimharris{ 61252265Sjimharris struct nvme_controller_data cdata; 62252265Sjimharris struct nvme_namespace_data nsdata; 63252265Sjimharris char name[64]; 64252265Sjimharris uint32_t i; 65253109Sjimharris int ch, ctrlr, fd, found, ret; 66252265Sjimharris 67252265Sjimharris while ((ch = getopt(argc, argv, "")) != -1) { 68252265Sjimharris switch ((char)ch) { 69252265Sjimharris default: 70252265Sjimharris devlist_usage(); 71252265Sjimharris } 72252265Sjimharris } 73252265Sjimharris 74252265Sjimharris ctrlr = -1; 75252265Sjimharris found = 0; 76252265Sjimharris 77252265Sjimharris while (1) { 78252265Sjimharris ctrlr++; 79252270Sjimharris sprintf(name, "%s%d", NVME_CTRLR_PREFIX, ctrlr); 80252265Sjimharris 81253109Sjimharris ret = open_dev(name, &fd, 0, 0); 82252265Sjimharris 83253109Sjimharris if (ret != 0) { 84253458Sjimharris if (ret == EACCES) { 85253109Sjimharris warnx("could not open /dev/%s\n", name); 86253109Sjimharris continue; 87253109Sjimharris } else 88253109Sjimharris break; 89252265Sjimharris } 90252265Sjimharris 91252265Sjimharris found++; 92252265Sjimharris read_controller_data(fd, &cdata); 93253437Sjimharris printf("%6s: %.*s\n", name, NVME_MODEL_NUMBER_LENGTH, cdata.mn); 94252265Sjimharris 95252265Sjimharris for (i = 0; i < cdata.nn; i++) { 96252270Sjimharris sprintf(name, "%s%d%s%d", NVME_CTRLR_PREFIX, ctrlr, 97252270Sjimharris NVME_NS_PREFIX, i+1); 98252265Sjimharris read_namespace_data(fd, i+1, &nsdata); 99252265Sjimharris printf(" %10s (%lldGB)\n", 100252265Sjimharris name, 101252265Sjimharris nsdata.nsze * 102252265Sjimharris (long long)ns_get_sector_size(&nsdata) / 103252265Sjimharris 1024 / 1024 / 1024); 104252265Sjimharris } 105252265Sjimharris 106252265Sjimharris close(fd); 107252265Sjimharris } 108252265Sjimharris 109252265Sjimharris if (found == 0) 110252265Sjimharris printf("No NVMe controllers found.\n"); 111252265Sjimharris 112253109Sjimharris exit(1); 113252265Sjimharris} 114