xref: /illumos-gate/usr/src/uts/common/sys/nvme/kioxia_cd8.h (revision 5b080c3aadfabef156c72cedee796d7b3bac5180)
1*5b080c3aSRobert Mustacchi /*
2*5b080c3aSRobert Mustacchi  * This file and its contents are supplied under the terms of the
3*5b080c3aSRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
4*5b080c3aSRobert Mustacchi  * You may only use this file in accordance with the terms of version
5*5b080c3aSRobert Mustacchi  * 1.0 of the CDDL.
6*5b080c3aSRobert Mustacchi  *
7*5b080c3aSRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
8*5b080c3aSRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
9*5b080c3aSRobert Mustacchi  * http://www.illumos.org/license/CDDL.
10*5b080c3aSRobert Mustacchi  */
11*5b080c3aSRobert Mustacchi 
12*5b080c3aSRobert Mustacchi /*
13*5b080c3aSRobert Mustacchi  * Copyright 2024 Oxide Computer Company
14*5b080c3aSRobert Mustacchi  */
15*5b080c3aSRobert Mustacchi 
16*5b080c3aSRobert Mustacchi #ifndef _SYS_NVME_KIOXIA_CD8_H
17*5b080c3aSRobert Mustacchi #define	_SYS_NVME_KIOXIA_CD8_H
18*5b080c3aSRobert Mustacchi 
19*5b080c3aSRobert Mustacchi /*
20*5b080c3aSRobert Mustacchi  * This header defines vendor-specific NVMe interfaces and is not a committed
21*5b080c3aSRobert Mustacchi  * interface. Its contents and existence are subject to change.
22*5b080c3aSRobert Mustacchi  *
23*5b080c3aSRobert Mustacchi  * Vendor-specific definitions for the Kioxia CD8 and CD8P.
24*5b080c3aSRobert Mustacchi  */
25*5b080c3aSRobert Mustacchi 
26*5b080c3aSRobert Mustacchi #include <sys/debug.h>
27*5b080c3aSRobert Mustacchi #include <sys/nvme/ocp.h>
28*5b080c3aSRobert Mustacchi 
29*5b080c3aSRobert Mustacchi #ifdef __cplusplus
30*5b080c3aSRobert Mustacchi extern "C" {
31*5b080c3aSRobert Mustacchi #endif
32*5b080c3aSRobert Mustacchi 
33*5b080c3aSRobert Mustacchi #define	KIOXIA_CD8_DID	0x1f
34*5b080c3aSRobert Mustacchi #define	KIOXIA_CD8P_DID	0x2b
35*5b080c3aSRobert Mustacchi 
36*5b080c3aSRobert Mustacchi typedef enum {
37*5b080c3aSRobert Mustacchi 	KIOXIA_CD8_LOG_OCP_SMART	= OCP_LOG_DSSD_SMART,
38*5b080c3aSRobert Mustacchi 	KIOXIA_CD8_LOG_OCP_ERRREC	= OCP_LOG_DSSD_ERROR_REC,
39*5b080c3aSRobert Mustacchi 	KIOXIA_CD8_LOG_OCP_FWACT	= OCP_LOG_DSSD_FWACT,
40*5b080c3aSRobert Mustacchi 	KIOXIA_CD8_LOG_OCP_LATENCY	= OCP_LOG_DSSD_LATENCY,
41*5b080c3aSRobert Mustacchi 	KIOXIA_CD8_LOG_OCP_DEV_CAP	= OCP_LOG_DSSD_DEV_CAP,
42*5b080c3aSRobert Mustacchi 	KIOXIA_CD8_LOG_OCP_UNSUP	= OCP_LOG_DSSD_UNSUP_REQ,
43*5b080c3aSRobert Mustacchi 	/*
44*5b080c3aSRobert Mustacchi 	 * Uses the kioxia_vul_cd8_extsmart_t.
45*5b080c3aSRobert Mustacchi 	 */
46*5b080c3aSRobert Mustacchi 	KIOXIA_CD8_LOG_EXTSMART	= 0xca
47*5b080c3aSRobert Mustacchi } kioxia_cd8_vul_t;
48*5b080c3aSRobert Mustacchi 
49*5b080c3aSRobert Mustacchi /*
50*5b080c3aSRobert Mustacchi  * All data structures must be packed to account for the layout from the various
51*5b080c3aSRobert Mustacchi  * programmer's manuals.
52*5b080c3aSRobert Mustacchi  */
53*5b080c3aSRobert Mustacchi #pragma pack(1)
54*5b080c3aSRobert Mustacchi typedef struct {
55*5b080c3aSRobert Mustacchi 	uint8_t kes_id;
56*5b080c3aSRobert Mustacchi 	uint8_t kes_rsvd1[2];
57*5b080c3aSRobert Mustacchi 	uint8_t kse_norm;
58*5b080c3aSRobert Mustacchi 	uint8_t kes_rsvd4;
59*5b080c3aSRobert Mustacchi 	uint8_t kse_raw[6];
60*5b080c3aSRobert Mustacchi 	uint8_t kse_rsvd11;
61*5b080c3aSRobert Mustacchi } kioxia_extsmart_ent_t;
62*5b080c3aSRobert Mustacchi 
63*5b080c3aSRobert Mustacchi /*
64*5b080c3aSRobert Mustacchi  * These are the different type keys that exist for the kioxia_extsmart_ent_t
65*5b080c3aSRobert Mustacchi  * above. Note, entries in the latter part of the log just use zero keys.
66*5b080c3aSRobert Mustacchi  */
67*5b080c3aSRobert Mustacchi typedef enum {
68*5b080c3aSRobert Mustacchi 	SOLIDIGM_SMART_TYPE_PROGRAM_FAIL	= 0xab,
69*5b080c3aSRobert Mustacchi 	SOLIDIGM_SMART_TYPE_ERASE_FAIL		= 0xac,
70*5b080c3aSRobert Mustacchi 	SOLIDIGM_SMART_TYPE_WEAR_LEVEL		= 0xad,
71*5b080c3aSRobert Mustacchi 	SOLIDIGM_SMART_TYPE_E2E_ERROR_DET	= 0xb8,
72*5b080c3aSRobert Mustacchi 	SOLIDIGM_SMART_TYPE_CRC_ERROR		= 0xc7,
73*5b080c3aSRobert Mustacchi 	SOLIDIGM_SMART_TYPE_NAND_WRITE		= 0xf4,
74*5b080c3aSRobert Mustacchi 	SOLIDIGM_SMART_TYPE_HOST_WRITE		= 0xf5
75*5b080c3aSRobert Mustacchi } solidigm_smart_type_t;
76*5b080c3aSRobert Mustacchi 
77*5b080c3aSRobert Mustacchi 
78*5b080c3aSRobert Mustacchi typedef struct {
79*5b080c3aSRobert Mustacchi 	kioxia_extsmart_ent_t cds_prog_fail;
80*5b080c3aSRobert Mustacchi 	kioxia_extsmart_ent_t cds_erase_fail;
81*5b080c3aSRobert Mustacchi 	kioxia_extsmart_ent_t cds_wear_level;
82*5b080c3aSRobert Mustacchi 	kioxia_extsmart_ent_t cds_e2e_det;
83*5b080c3aSRobert Mustacchi 	kioxia_extsmart_ent_t cds_crc_error;
84*5b080c3aSRobert Mustacchi 	uint8_t cds_rvsd60[132 - 60];
85*5b080c3aSRobert Mustacchi 	kioxia_extsmart_ent_t cds_nand_write;
86*5b080c3aSRobert Mustacchi 	kioxia_extsmart_ent_t cds_host_write;
87*5b080c3aSRobert Mustacchi 	uint8_t cds_rsvd156[256 - 156];
88*5b080c3aSRobert Mustacchi 	kioxia_extsmart_ent_t cds_crit_warn;
89*5b080c3aSRobert Mustacchi 	kioxia_extsmart_ent_t cds_host_read;
90*5b080c3aSRobert Mustacchi 	kioxia_extsmart_ent_t cds_comp_temp;
91*5b080c3aSRobert Mustacchi 	kioxia_extsmart_ent_t cds_life_used;
92*5b080c3aSRobert Mustacchi 	kioxia_extsmart_ent_t cds_power_cycles;
93*5b080c3aSRobert Mustacchi 	kioxia_extsmart_ent_t cds_power_hours;
94*5b080c3aSRobert Mustacchi 	kioxia_extsmart_ent_t cds_unsafe_shut;
95*5b080c3aSRobert Mustacchi 	uint8_t cds_rsvd340[512 - 340];
96*5b080c3aSRobert Mustacchi } kioxia_vul_cd8_smart_t;
97*5b080c3aSRobert Mustacchi #pragma	pack()	/* pack(1) */
98*5b080c3aSRobert Mustacchi /*
99*5b080c3aSRobert Mustacchi  * Our current version of smatch cannot handle packed structures.
100*5b080c3aSRobert Mustacchi  */
101*5b080c3aSRobert Mustacchi #ifndef __CHECKER__
102*5b080c3aSRobert Mustacchi CTASSERT(sizeof (kioxia_extsmart_ent_t) == 12);
103*5b080c3aSRobert Mustacchi CTASSERT(sizeof (kioxia_vul_cd8_smart_t) == 512);
104*5b080c3aSRobert Mustacchi #endif	/* __CHECKER__ */
105*5b080c3aSRobert Mustacchi 
106*5b080c3aSRobert Mustacchi #ifdef __cplusplus
107*5b080c3aSRobert Mustacchi }
108*5b080c3aSRobert Mustacchi #endif
109*5b080c3aSRobert Mustacchi 
110*5b080c3aSRobert Mustacchi #endif /* _SYS_NVME_KIOXIA_CD8_H */
111