summaryrefslogtreecommitdiff
path: root/sbin/nvmectl/nvme.h
blob: 5f4d50c30d04852bc92e5e6e90570c6c348c58b8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*	$NetBSD: nvme.h,v 1.3 2018/04/18 10:11:44 nonaka Exp $	*/

/*-
 * Copyright (C) 2012-2013 Intel Corporation
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * $FreeBSD: head/sys/dev/nvme/nvme.h 314888 2017-03-07 23:02:59Z imp $
 */

#ifndef __NVME_H__
#define __NVME_H__

/* Cap nvme to 1MB transfers driver explodes with larger sizes */
#define NVME_MAX_XFER_SIZE		(MAXPHYS < (1<<20) ? MAXPHYS : (1<<20))

/* Get Log Page */
#define	NVME_LOG_ERROR					0x01
#define	NVME_LOG_HEALTH_INFORMATION			0x02
#define	NVME_LOG_FIRMWARE_SLOT				0x03
#define	NVME_LOG_CHANGED_NAMESPACE_LIST			0x04
#define	NVME_LOG_COMMAND_EFFECTS_LOG			0x05
#define	NVME_LOG_RESERVATION_NOTIFICATION		0x80
/*
 * The following are Intel Specific log pages, but they seem
 * to be widely implemented.
 */
#define	INTEL_LOG_READ_LAT_LOG				0xc1
#define	INTEL_LOG_WRITE_LAT_LOG				0xc2
#define	INTEL_LOG_TEMP_STATS				0xc5
#define	INTEL_LOG_ADD_SMART				0xca
#define	INTEL_LOG_DRIVE_MKT_NAME			0xdd
/*
 * HGST log page, with lots ofs sub pages.
 */
#define	HGST_INFO_LOG					0xc1

/* Error Information Log (Log Identifier 01h) */
struct nvme_error_information_entry {
	uint64_t		error_count;
	uint16_t		sqid;
	uint16_t		cid;
	uint16_t		status;
	uint16_t		error_location;
	uint64_t		lba;
	uint32_t		nsid;
	uint8_t			vendor_specific;
	uint8_t			_reserved1[3];
	uint64_t		command_specific;
	uint8_t			reserved[24];
} __packed __aligned(4);

/* SMART / Health Information Log (Log Identifier 02h) */
struct nvme_health_information_page {
	uint8_t			critical_warning;
#define	NVME_HEALTH_PAGE_CW_VOLATILE_MEMORY_BACKUP	__BIT(4)
#define	NVME_HEALTH_PAGE_CW_READ_ONLY			__BIT(3)
#define	NVME_HEALTH_PAGE_CW_DEVICE_RELIABLITY		__BIT(2)
#define	NVME_HEALTH_PAGE_CW_TEMPERTURE			__BIT(1)
#define	NVME_HEALTH_PAGE_CW_AVAIL_SPARE			__BIT(0)
	uint16_t		composite_temperature;
	uint8_t			available_spare;
	uint8_t			available_spare_threshold;
	uint8_t			percentage_used;

	uint8_t			_reserved1[26];

	uint64_t		data_units_read[2];
	uint64_t		data_units_written[2];
	uint64_t		host_read_commands[2];
	uint64_t		host_write_commands[2];
	uint64_t		controller_busy_time[2];
	uint64_t		power_cycles[2];
	uint64_t		power_on_hours[2];
	uint64_t		unsafe_shutdowns[2];
	uint64_t		media_errors[2];
	uint64_t		num_error_info_log_entries[2];
	uint32_t		warning_temp_time;
	uint32_t		error_temp_time;
	uint16_t		temp_sensor[8];

	uint8_t			reserved[296];
} __packed __aligned(4);

/* Firmware Commit */
#define	NVME_COMMIT_ACTION_REPLACE_NO_ACTIVATE	0
#define	NVME_COMMIT_ACTION_REPLACE_ACTIVATE	1
#define	NVME_COMMIT_ACTION_ACTIVATE_RESET	2
#define	NVME_COMMIT_ACTION_ACTIVATE_NO_RESET	3

/* Firmware Slot Information (Log Identifier 03h) */
struct nvme_firmware_page {
	uint8_t			afi;
#define	NVME_FW_PAGE_AFI_SLOT_RST	__BITS(4, 6)
#define	NVME_FW_PAGE_AFI_SLOT		__BITS(0, 2)
	uint8_t			_reserved1[7];

	uint64_t		revision[7];	/* revisions for 7 slots */

	uint8_t			reserved[448];
} __packed __aligned(4);

struct intel_log_temp_stats {
	uint64_t	current;
	uint64_t	overtemp_flag_last;
	uint64_t	overtemp_flag_life;
	uint64_t	max_temp;
	uint64_t	min_temp;
	uint64_t	_rsvd[5];
	uint64_t	max_oper_temp;
	uint64_t	min_oper_temp;
	uint64_t	est_offset;
} __packed __aligned(4);

/* Commands Supported and Effects (Log Identifier 05h) */
struct nvme_command_effeects_page {
	uint32_t		acs[256];
#define	NVME_CE_PAGE_CS_CSE		__BITS(16, 18)
#define	NVME_CE_PAGE_CS_CCC		__BIT(4)
#define	NVME_CE_PAGE_CS_NIC		__BIT(3)
#define	NVME_CE_PAGE_CS_NCC		__BIT(2)
#define	NVME_CE_PAGE_CS_LBCC		__BIT(1)
#define	NVME_CE_PAGE_CS_CSUPP		__BIT(0)
	uint32_t		iocs[256];

	uint8_t			reserved[2048];
} __packed __aligned(4);

#endif	/* __NVME_H__ */