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$"); 29252265Sjimharris 30252265Sjimharris#include <sys/param.h> 31252265Sjimharris 32253109Sjimharris#include <err.h> 33253458Sjimharris#include <errno.h> 34252265Sjimharris#include <fcntl.h> 35253459Sjimharris#include <paths.h> 36252265Sjimharris#include <stddef.h> 37252265Sjimharris#include <stdio.h> 38252265Sjimharris#include <stdlib.h> 39252265Sjimharris#include <string.h> 40252265Sjimharris#include <unistd.h> 41252265Sjimharris 42252265Sjimharris#include "nvmecontrol.h" 43252265Sjimharris 44252265Sjimharrisstatic void 45252265Sjimharrisdevlist_usage(void) 46252265Sjimharris{ 47252265Sjimharris fprintf(stderr, "usage:\n"); 48252265Sjimharris fprintf(stderr, DEVLIST_USAGE); 49253109Sjimharris exit(1); 50252265Sjimharris} 51252265Sjimharris 52252265Sjimharrisstatic inline uint32_t 53252265Sjimharrisns_get_sector_size(struct nvme_namespace_data *nsdata) 54252265Sjimharris{ 55252265Sjimharris 56253474Sjimharris return (1 << nsdata->lbaf[nsdata->flbas.format].lbads); 57252265Sjimharris} 58252265Sjimharris 59252265Sjimharrisvoid 60252265Sjimharrisdevlist(int argc, char *argv[]) 61252265Sjimharris{ 62252265Sjimharris struct nvme_controller_data cdata; 63252265Sjimharris struct nvme_namespace_data nsdata; 64252265Sjimharris char name[64]; 65253476Sjimharris uint8_t mn[64]; 66252265Sjimharris uint32_t i; 67253109Sjimharris int ch, ctrlr, fd, found, ret; 68252265Sjimharris 69252265Sjimharris while ((ch = getopt(argc, argv, "")) != -1) { 70252265Sjimharris switch ((char)ch) { 71252265Sjimharris default: 72252265Sjimharris devlist_usage(); 73252265Sjimharris } 74252265Sjimharris } 75252265Sjimharris 76252265Sjimharris ctrlr = -1; 77252265Sjimharris found = 0; 78252265Sjimharris 79252265Sjimharris while (1) { 80252265Sjimharris ctrlr++; 81252270Sjimharris sprintf(name, "%s%d", NVME_CTRLR_PREFIX, ctrlr); 82252265Sjimharris 83253109Sjimharris ret = open_dev(name, &fd, 0, 0); 84252265Sjimharris 85253109Sjimharris if (ret != 0) { 86253458Sjimharris if (ret == EACCES) { 87253459Sjimharris warnx("could not open "_PATH_DEV"%s\n", name); 88253109Sjimharris continue; 89253109Sjimharris } else 90253109Sjimharris break; 91252265Sjimharris } 92252265Sjimharris 93252265Sjimharris found++; 94252265Sjimharris read_controller_data(fd, &cdata); 95253476Sjimharris nvme_strvis(mn, cdata.mn, sizeof(mn), NVME_MODEL_NUMBER_LENGTH); 96253476Sjimharris printf("%6s: %s\n", name, mn); 97252265Sjimharris 98252265Sjimharris for (i = 0; i < cdata.nn; i++) { 99252270Sjimharris sprintf(name, "%s%d%s%d", NVME_CTRLR_PREFIX, ctrlr, 100252270Sjimharris NVME_NS_PREFIX, i+1); 101252265Sjimharris read_namespace_data(fd, i+1, &nsdata); 102252265Sjimharris printf(" %10s (%lldGB)\n", 103252265Sjimharris name, 104252265Sjimharris nsdata.nsze * 105252265Sjimharris (long long)ns_get_sector_size(&nsdata) / 106252265Sjimharris 1024 / 1024 / 1024); 107252265Sjimharris } 108252265Sjimharris 109252265Sjimharris close(fd); 110252265Sjimharris } 111252265Sjimharris 112252265Sjimharris if (found == 0) 113252265Sjimharris printf("No NVMe controllers found.\n"); 114252265Sjimharris 115253109Sjimharris exit(1); 116252265Sjimharris} 117