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