xref: /illumos-gate/usr/src/uts/common/io/i2c/ctrl/ismt/ismt.h (revision c1733db148ded3d78431de26089fc479e0ee37e4)
1*c1733db1SRobert Mustacchi /*
2*c1733db1SRobert Mustacchi  * This file and its contents are supplied under the terms of the
3*c1733db1SRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
4*c1733db1SRobert Mustacchi  * You may only use this file in accordance with the terms of version
5*c1733db1SRobert Mustacchi  * 1.0 of the CDDL.
6*c1733db1SRobert Mustacchi  *
7*c1733db1SRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
8*c1733db1SRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
9*c1733db1SRobert Mustacchi  * http://www.illumos.org/license/CDDL.
10*c1733db1SRobert Mustacchi  */
11*c1733db1SRobert Mustacchi 
12*c1733db1SRobert Mustacchi /*
13*c1733db1SRobert Mustacchi  * Copyright 2025 Oxide Computer Company
14*c1733db1SRobert Mustacchi  */
15*c1733db1SRobert Mustacchi 
16*c1733db1SRobert Mustacchi #ifndef _ISMT_H
17*c1733db1SRobert Mustacchi #define	_ISMT_H
18*c1733db1SRobert Mustacchi 
19*c1733db1SRobert Mustacchi /*
20*c1733db1SRobert Mustacchi  * Intel SMBus Message Target Register Definitions
21*c1733db1SRobert Mustacchi  */
22*c1733db1SRobert Mustacchi 
23*c1733db1SRobert Mustacchi #include <sys/types.h>
24*c1733db1SRobert Mustacchi #include <sys/bitext.h>
25*c1733db1SRobert Mustacchi 
26*c1733db1SRobert Mustacchi #ifdef __cplusplus
27*c1733db1SRobert Mustacchi extern "C" {
28*c1733db1SRobert Mustacchi #endif
29*c1733db1SRobert Mustacchi 
30*c1733db1SRobert Mustacchi /*
31*c1733db1SRobert Mustacchi  * General control register.
32*c1733db1SRobert Mustacchi  */
33*c1733db1SRobert Mustacchi #define	ISMT_R_GCTRL		0x000
34*c1733db1SRobert Mustacchi #define	ISMT_R_GCTRL_SET_SRST(r, v)	bitset32(r, 6, 6, v)
35*c1733db1SRobert Mustacchi #define	ISMT_R_GCTRL_SET_KILL(r, v)	bitset32(r, 3, 3, v)
36*c1733db1SRobert Mustacchi #define	ISMT_R_GCTRL_SET_TRST(r, v)	bitset32(r, 2, 2, v)
37*c1733db1SRobert Mustacchi 
38*c1733db1SRobert Mustacchi /*
39*c1733db1SRobert Mustacchi  * Interrupt cause DMA logging. While we don't actually use this information, we
40*c1733db1SRobert Mustacchi  * assume that hwarwdare may want to write to it.
41*c1733db1SRobert Mustacchi  */
42*c1733db1SRobert Mustacchi #define	ISMT_R_SMTICL		0x008
43*c1733db1SRobert Mustacchi 
44*c1733db1SRobert Mustacchi /*
45*c1733db1SRobert Mustacchi  * These registers contain error masks that in theory firmware might manipulate.
46*c1733db1SRobert Mustacchi  * We don't mask any errors by default and leave these at their defaults. The
47*c1733db1SRobert Mustacchi  * last one is the current error status. Errors here are from the Xeon
48*c1733db1SRobert Mustacchi  * D-1700/1800/2700/2800. We don't know if they're used across more devices or
49*c1733db1SRobert Mustacchi  * not.
50*c1733db1SRobert Mustacchi  */
51*c1733db1SRobert Mustacchi #define	ISMT_R_ERRINTMSK	0x010
52*c1733db1SRobert Mustacchi #define	ISMT_R_ERRAERMSK	0x014
53*c1733db1SRobert Mustacchi #define	ISMT_R_ERRSTS		0x018
54*c1733db1SRobert Mustacchi typedef enum {
55*c1733db1SRobert Mustacchi 	ISMT_ERR_CPE	= 1 << 0,
56*c1733db1SRobert Mustacchi 	ISMT_ERR_SPDWE	= 1 << 1,
57*c1733db1SRobert Mustacchi 	ISMT_ERR_IRE	= 1 << 8,
58*c1733db1SRobert Mustacchi 	ISMT_ERR_IRDPE	= 1 << 9,
59*c1733db1SRobert Mustacchi 	ISMT_ERR_ITE	= 1 << 10,
60*c1733db1SRobert Mustacchi 	ISMT_ERR_IMAE	= 1 << 11,
61*c1733db1SRobert Mustacchi 	ISMT_ERR_IHIE	= 1 << 12,
62*c1733db1SRobert Mustacchi 	ISMT_ERR_TRBAF	= 1 << 16,
63*c1733db1SRobert Mustacchi 	ISMT_ERR_TRBF	= 1 << 17,
64*c1733db1SRobert Mustacchi 	ISMT_ERR_CKLTO	= 1 << 24
65*c1733db1SRobert Mustacchi } ismt_err_t;
66*c1733db1SRobert Mustacchi 
67*c1733db1SRobert Mustacchi /*
68*c1733db1SRobert Mustacchi  * When an error occurs this is used to set information about what errors
69*c1733db1SRobert Mustacchi  * occurred in the ERRSTS register.
70*c1733db1SRobert Mustacchi  */
71*c1733db1SRobert Mustacchi #define	ISMT_R_ERRINFO		0x01c
72*c1733db1SRobert Mustacchi #define	ISMT_R_ERRINFO_GET_INFO2(r)	bitx32(r, 15, 13)
73*c1733db1SRobert Mustacchi #define	ISMT_R_ERRINFO_GET_PTRO2(r)	bitx32(r, 12, 8)
74*c1733db1SRobert Mustacchi #define	ISMT_R_ERRINFO_GET_INFO1(r)	bitx32(r, 7, 5)
75*c1733db1SRobert Mustacchi #define	ISMT_R_ERRINFO_GET_PTRO1(r)	bitx32(r, 4, 0)
76*c1733db1SRobert Mustacchi 
77*c1733db1SRobert Mustacchi /*
78*c1733db1SRobert Mustacchi  * Controller-specific registers.
79*c1733db1SRobert Mustacchi  */
80*c1733db1SRobert Mustacchi 
81*c1733db1SRobert Mustacchi /*
82*c1733db1SRobert Mustacchi  * Controller descriptor base address. Must be 64 byte aligned.
83*c1733db1SRobert Mustacchi  */
84*c1733db1SRobert Mustacchi #define	ISMT_R_MDBA		0x100
85*c1733db1SRobert Mustacchi 
86*c1733db1SRobert Mustacchi /*
87*c1733db1SRobert Mustacchi  * Controller control register.
88*c1733db1SRobert Mustacchi  */
89*c1733db1SRobert Mustacchi #define	ISMT_R_MCTRL		0x108
90*c1733db1SRobert Mustacchi #define	ISMT_R_MCTRL_SET_FMHP(r, v)	bitset32(r, 23, 16, v)
91*c1733db1SRobert Mustacchi #define	ISMT_R_MCTRL_SET_MEIE(r, v)	bitset32(r, 4, 4, v)
92*c1733db1SRobert Mustacchi #define	ISMT_R_MCTRL_GET_SPDDIS(r, v)	bitx32(r, 3, 3)
93*c1733db1SRobert Mustacchi #define	ISMT_R_MCTRL_SET_SS(r, v)	bitset32(r, 0, 0, v)
94*c1733db1SRobert Mustacchi 
95*c1733db1SRobert Mustacchi /*
96*c1733db1SRobert Mustacchi  * Controller status register.
97*c1733db1SRobert Mustacchi  */
98*c1733db1SRobert Mustacchi #define	ISMT_R_MSTS		0x10c
99*c1733db1SRobert Mustacchi #define	ISMT_R_MSTS_GET_HMTP(r)		bitx32(r, 23, 16)
100*c1733db1SRobert Mustacchi #define	ISMT_R_MSTS_SET_HMTP(r, v)	bitset32(r, 23, 16, v)
101*c1733db1SRobert Mustacchi #define	ISMT_R_MSTS_GET_MIS(r)		bitx32(r, 5, 5)
102*c1733db1SRobert Mustacchi #define	ISMT_R_MSTS_GET_MEIS(r)		bitx32(r, 4, 4)
103*c1733db1SRobert Mustacchi #define	ISMT_R_MSTS_GET_IP(r)		bitx32(r, 0, 0)
104*c1733db1SRobert Mustacchi 
105*c1733db1SRobert Mustacchi /*
106*c1733db1SRobert Mustacchi  * Controller descriptor size register. Sets the descriptor ring size. The
107*c1733db1SRobert Mustacchi  * value is 0s based, menaing the actual value is x + 1.
108*c1733db1SRobert Mustacchi  */
109*c1733db1SRobert Mustacchi #define	ISMT_R_MDS		0x110
110*c1733db1SRobert Mustacchi #define	ISMT_R_MDS_SET_SIZE(r, v)	bitset32(r, 7, 0, v)
111*c1733db1SRobert Mustacchi 
112*c1733db1SRobert Mustacchi /*
113*c1733db1SRobert Mustacchi  * This register controls the various retry policy aspects.
114*c1733db1SRobert Mustacchi  */
115*c1733db1SRobert Mustacchi #define	ISMT_R_RPOLICY		0x114
116*c1733db1SRobert Mustacchi 
117*c1733db1SRobert Mustacchi /*
118*c1733db1SRobert Mustacchi  * Timing related registers. These are more registers that are in theory
119*c1733db1SRobert Mustacchi  * supposed to only be manipulated by firmware and several of these are supposed
120*c1733db1SRobert Mustacchi  * to be fused. We expose these mostly as read-only properties.
121*c1733db1SRobert Mustacchi  */
122*c1733db1SRobert Mustacchi #define	ISMT_R_SPGT		0x300
123*c1733db1SRobert Mustacchi #define	ISMT_R_SPGT_GET_SPD(r)		bitx32(r, 31, 30)
124*c1733db1SRobert Mustacchi #define	ISMT_R_SPT_SPD_80K	0
125*c1733db1SRobert Mustacchi #define	ISMT_R_SPT_SPD_100K	1
126*c1733db1SRobert Mustacchi #define	ISMT_R_SPT_SPD_400K	2
127*c1733db1SRobert Mustacchi #define	ISMT_R_SPT_SPD_1M	3
128*c1733db1SRobert Mustacchi #define	ISMT_R_SPGT_GET_THDDAT(r)	bitx32(r, 19, 16)
129*c1733db1SRobert Mustacchi #define	ISMT_R_SPGT_GET_TSUDAT(r)	bitx32(r, 11, 8)
130*c1733db1SRobert Mustacchi #define	ISMT_R_SPGT_GET_DG(r)		bitx32(r, 7, 0)
131*c1733db1SRobert Mustacchi #define	ISMT_R_SPMT		0x304
132*c1733db1SRobert Mustacchi #define	ISMT_R_SPMT_GET_THIGH(r)	bitx32(r, 31, 24)
133*c1733db1SRobert Mustacchi #define	ISMT_R_SPMT_GET_TLOW(r)		bitx32(r, 23, 16)
134*c1733db1SRobert Mustacchi #define	ISMT_R_SPMT_GET_THDSTA(r)	bitx32(r, 15, 12)
135*c1733db1SRobert Mustacchi #define	ISMT_R_SPMT_GET_TSUSTA(r)	bitx32(r, 11, 8)
136*c1733db1SRobert Mustacchi #define	ISMT_R_SPMT_GET_TBUF(r)		bitx32(r, 7, 4)
137*c1733db1SRobert Mustacchi #define	ISMT_R_SPMT_GET_TSUSTO(r)	bitx32(r, 3, 0)
138*c1733db1SRobert Mustacchi 
139*c1733db1SRobert Mustacchi typedef struct {
140*c1733db1SRobert Mustacchi 	uint32_t id_cmd_addr;
141*c1733db1SRobert Mustacchi 	uint32_t id_status;
142*c1733db1SRobert Mustacchi 	uint32_t id_low;
143*c1733db1SRobert Mustacchi 	uint32_t id_high;
144*c1733db1SRobert Mustacchi } ismt_desc_t;
145*c1733db1SRobert Mustacchi 
146*c1733db1SRobert Mustacchi /*
147*c1733db1SRobert Mustacchi  * Flags that control various behaviors:
148*c1733db1SRobert Mustacchi  */
149*c1733db1SRobert Mustacchi #define	ISMT_DESC_CMD_SET_SOE(r, v)	bitset32(r, 31, 31, v)
150*c1733db1SRobert Mustacchi #define	ISMT_DESC_CMD_SET_INT(r, v)	bitset32(r, 30, 30, v)
151*c1733db1SRobert Mustacchi #define	ISMT_DESC_CMD_SET_I2C(r, v)	bitset32(r, 29, 29, v)
152*c1733db1SRobert Mustacchi #define	ISMT_DESC_CMD_SET_PEC(r, v)	bitset32(r, 28, 28, v)
153*c1733db1SRobert Mustacchi #define	ISMT_DESC_CMD_SET_FAIR(r, v)	bitset32(r, 27, 27, v)
154*c1733db1SRobert Mustacchi #define	ISMT_DESC_CMD_SET_BLK(r, v)	bitset32(r, 26, 26, v)
155*c1733db1SRobert Mustacchi #define	ISMT_DESC_CMD_SET_CWRL(r, v)	bitset32(r, 24, 24, v)
156*c1733db1SRobert Mustacchi 
157*c1733db1SRobert Mustacchi /*
158*c1733db1SRobert Mustacchi  * This sets the read and write lenths, as well as the address.
159*c1733db1SRobert Mustacchi  */
160*c1733db1SRobert Mustacchi #define	ISMT_DESC_CMD_SET_RDLEN(r, v)	bitset32(r, 23, 16, v)
161*c1733db1SRobert Mustacchi #define	ISMT_DESC_CMD_SET_WRLEN(r, v)	bitset32(r, 15, 8, v)
162*c1733db1SRobert Mustacchi #define	ISMT_DESC_CMD_SET_ADDR(r, v)	bitset32(r, 7, 1, v)
163*c1733db1SRobert Mustacchi #define	ISMT_DESC_CMD_SET_RW(r, v)	bitset32(r, 0, 0, v)
164*c1733db1SRobert Mustacchi #define	ISMT_DESC_CMD_RW_READ		1
165*c1733db1SRobert Mustacchi #define	ISMT_DESC_CMD_RW_WRITE		0
166*c1733db1SRobert Mustacchi 
167*c1733db1SRobert Mustacchi /*
168*c1733db1SRobert Mustacchi  * Actual number of transmitted and read bytes.
169*c1733db1SRobert Mustacchi  */
170*c1733db1SRobert Mustacchi #define	ISMT_DESC_STS_GET_WRLEN(r)	bitx32(r, 31, 24)
171*c1733db1SRobert Mustacchi #define	ISMT_DESC_STS_GET_RDLEN(r)	bitx32(r, 23, 16)
172*c1733db1SRobert Mustacchi #define	ISMT_DESC_STS_GET_COLRTRY(r)	bitx32(r, 14, 12)
173*c1733db1SRobert Mustacchi #define	ISMT_DESC_STS_GET_RETRY(r)	bitx32(r, 11, 8)
174*c1733db1SRobert Mustacchi #define	ISMT_DESC_STS_GET_LPR(r)	bitx32(r, 7, 7)
175*c1733db1SRobert Mustacchi #define	ISMT_DESC_STS_GET_COL(r)	bitx32(r, 6, 6)
176*c1733db1SRobert Mustacchi #define	ISMT_DESC_STS_GET_CLTO(r)	bitx32(r, 5, 5)
177*c1733db1SRobert Mustacchi #define	ISMT_DESC_STS_GET_CRC(r)	bitx32(r, 4, 4)
178*c1733db1SRobert Mustacchi #define	ISMT_DESC_STS_GET_NACK(r)	bitx32(r, 3, 3)
179*c1733db1SRobert Mustacchi #define	ISMT_DESC_STS_GET_SCS(r)	bitx32(r, 0, 0)
180*c1733db1SRobert Mustacchi 
181*c1733db1SRobert Mustacchi /*
182*c1733db1SRobert Mustacchi  * Hardware maximum read and write lengths. The maximum write length includes
183*c1733db1SRobert Mustacchi  * the address byte and any command codes. The documentation is not the clearest
184*c1733db1SRobert Mustacchi  * around maximums (using Intel doc #595910, Rev 2.3) as an example.
185*c1733db1SRobert Mustacchi  *
186*c1733db1SRobert Mustacchi  * It says at various points that I2C transactions can be up to 240 bytes.
187*c1733db1SRobert Mustacchi  * However, it also says in the context of internal buffers that reads needs to
188*c1733db1SRobert Mustacchi  * be less than 32 bytes and writes less than 80 bytes. However, this is also
189*c1733db1SRobert Mustacchi  * referenced to a section about PEC. The 80 byte value is also supposed to
190*c1733db1SRobert Mustacchi  * include the command and the address, meaning that it would be limited to 78
191*c1733db1SRobert Mustacchi  * bytes. Ultimately, we constrain any SMBus style transaction to 32 bytes and
192*c1733db1SRobert Mustacchi  * allow all I2C transactions to be up to 240.
193*c1733db1SRobert Mustacchi  */
194*c1733db1SRobert Mustacchi #define	ISMT_MAX_SMBUS	32
195*c1733db1SRobert Mustacchi #define	ISMT_MAX_I2C	240
196*c1733db1SRobert Mustacchi 
197*c1733db1SRobert Mustacchi #ifdef __cplusplus
198*c1733db1SRobert Mustacchi }
199*c1733db1SRobert Mustacchi #endif
200*c1733db1SRobert Mustacchi 
201*c1733db1SRobert Mustacchi #endif /* _ISMT_H */
202