devlist.c revision 253437
1238384Sjkim/*- 2238384Sjkim * Copyright (C) 2012-2013 Intel Corporation 3238384Sjkim * All rights reserved. 4238384Sjkim * 5238384Sjkim * Redistribution and use in source and binary forms, with or without 6238384Sjkim * modification, are permitted provided that the following conditions 7238384Sjkim * are met: 8238384Sjkim * 1. Redistributions of source code must retain the above copyright 9238384Sjkim * notice, this list of conditions and the following disclaimer. 10238384Sjkim * 2. Redistributions in binary form must reproduce the above copyright 11238384Sjkim * notice, this list of conditions and the following disclaimer in the 12238384Sjkim * documentation and/or other materials provided with the distribution. 13238384Sjkim * 14238384Sjkim * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15238384Sjkim * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16238384Sjkim * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17238384Sjkim * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18238384Sjkim * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19238384Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20238384Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21238384Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22238384Sjkim * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23238384Sjkim * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24238384Sjkim * SUCH DAMAGE. 25238384Sjkim */ 26238384Sjkim 27238384Sjkim#include <sys/cdefs.h> 28238384Sjkim__FBSDID("$FreeBSD: head/sbin/nvmecontrol/devlist.c 253437 2013-07-17 23:23:38Z jimharris $"); 29238384Sjkim 30238384Sjkim#include <sys/param.h> 31238384Sjkim 32238384Sjkim#include <err.h> 33238384Sjkim#include <fcntl.h> 34238384Sjkim#include <stddef.h> 35238384Sjkim#include <stdio.h> 36238384Sjkim#include <stdlib.h> 37238384Sjkim#include <string.h> 38238384Sjkim#include <unistd.h> 39238384Sjkim 40238384Sjkim#include "nvmecontrol.h" 41238384Sjkim 42238384Sjkimstatic void 43238384Sjkimdevlist_usage(void) 44238384Sjkim{ 45238384Sjkim fprintf(stderr, "usage:\n"); 46238384Sjkim fprintf(stderr, DEVLIST_USAGE); 47238384Sjkim exit(1); 48238384Sjkim} 49238384Sjkim 50238384Sjkimstatic inline uint32_t 51238384Sjkimns_get_sector_size(struct nvme_namespace_data *nsdata) 52238384Sjkim{ 53238384Sjkim 54238384Sjkim return (1 << nsdata->lbaf[0].lbads); 55238384Sjkim} 56238384Sjkim 57238384Sjkimvoid 58238384Sjkimdevlist(int argc, char *argv[]) 59238384Sjkim{ 60238384Sjkim struct nvme_controller_data cdata; 61238384Sjkim struct nvme_namespace_data nsdata; 62238384Sjkim char name[64]; 63238384Sjkim uint32_t i; 64238384Sjkim int ch, ctrlr, fd, found, ret; 65238384Sjkim 66238384Sjkim while ((ch = getopt(argc, argv, "")) != -1) { 67238384Sjkim switch ((char)ch) { 68238384Sjkim default: 69238384Sjkim devlist_usage(); 70238384Sjkim } 71238384Sjkim } 72238384Sjkim 73238384Sjkim ctrlr = -1; 74238384Sjkim found = 0; 75238384Sjkim 76238384Sjkim while (1) { 77238384Sjkim ctrlr++; 78238384Sjkim sprintf(name, "%s%d", NVME_CTRLR_PREFIX, ctrlr); 79238384Sjkim 80238384Sjkim ret = open_dev(name, &fd, 0, 0); 81238384Sjkim 82238384Sjkim if (ret != 0) { 83238384Sjkim if (fd < 0) { 84238384Sjkim warnx("could not open /dev/%s\n", name); 85238384Sjkim continue; 86238384Sjkim } else 87238384Sjkim break; 88238384Sjkim } 89238384Sjkim 90238384Sjkim found++; 91238384Sjkim read_controller_data(fd, &cdata); 92238384Sjkim printf("%6s: %.*s\n", name, NVME_MODEL_NUMBER_LENGTH, cdata.mn); 93238384Sjkim 94238384Sjkim for (i = 0; i < cdata.nn; i++) { 95238384Sjkim sprintf(name, "%s%d%s%d", NVME_CTRLR_PREFIX, ctrlr, 96238384Sjkim NVME_NS_PREFIX, i+1); 97238384Sjkim read_namespace_data(fd, i+1, &nsdata); 98238384Sjkim printf(" %10s (%lldGB)\n", 99238384Sjkim name, 100238384Sjkim nsdata.nsze * 101238384Sjkim (long long)ns_get_sector_size(&nsdata) / 102238384Sjkim 1024 / 1024 / 1024); 103238384Sjkim } 104238384Sjkim 105238384Sjkim close(fd); 106238384Sjkim } 107238384Sjkim 108238384Sjkim if (found == 0) 109238384Sjkim printf("No NVMe controllers found.\n"); 110238384Sjkim 111238384Sjkim exit(1); 112238384Sjkim} 113238384Sjkim