xref: /illumos-gate/usr/src/uts/common/sys/gpio/zen_gpio.h (revision fd71220ba0fafcc9cf5ea0785db206f3f31336e7)
1*fd71220bSRobert Mustacchi /*
2*fd71220bSRobert Mustacchi  * This file and its contents are supplied under the terms of the
3*fd71220bSRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
4*fd71220bSRobert Mustacchi  * You may only use this file in accordance with the terms of version
5*fd71220bSRobert Mustacchi  * 1.0 of the CDDL.
6*fd71220bSRobert Mustacchi  *
7*fd71220bSRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
8*fd71220bSRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
9*fd71220bSRobert Mustacchi  * http://www.illumos.org/license/CDDL.
10*fd71220bSRobert Mustacchi  */
11*fd71220bSRobert Mustacchi 
12*fd71220bSRobert Mustacchi /*
13*fd71220bSRobert Mustacchi  * Copyright 2022 Oxide Computer Company
14*fd71220bSRobert Mustacchi  */
15*fd71220bSRobert Mustacchi 
16*fd71220bSRobert Mustacchi #ifndef _SYS_GPIO_ZEN_GPIO_H
17*fd71220bSRobert Mustacchi #define	_SYS_GPIO_ZEN_GPIO_H
18*fd71220bSRobert Mustacchi 
19*fd71220bSRobert Mustacchi /*
20*fd71220bSRobert Mustacchi  * AMD Zen GPIO attribute definitions.
21*fd71220bSRobert Mustacchi  *
22*fd71220bSRobert Mustacchi  * This covers most attributes for Zen 1 - 4 based GPIOs (and possibly earlier
23*fd71220bSRobert Mustacchi  * families). Most attributes are passed through for user consumption with a few
24*fd71220bSRobert Mustacchi  * exceptions right now around interrupt and wake control as those are not
25*fd71220bSRobert Mustacchi  * things that we expect to be manipulated.
26*fd71220bSRobert Mustacchi  */
27*fd71220bSRobert Mustacchi 
28*fd71220bSRobert Mustacchi #ifdef __cplusplus
29*fd71220bSRobert Mustacchi extern "C" {
30*fd71220bSRobert Mustacchi #endif
31*fd71220bSRobert Mustacchi 
32*fd71220bSRobert Mustacchi /*
33*fd71220bSRobert Mustacchi  * These five attributes are used to communicate basic identifying information
34*fd71220bSRobert Mustacchi  * about the GPIO.
35*fd71220bSRobert Mustacchi  *
36*fd71220bSRobert Mustacchi  * KGPIO_ATTR_NAME -- ro
37*fd71220bSRobert Mustacchi  *	string
38*fd71220bSRobert Mustacchi  *
39*fd71220bSRobert Mustacchi  * This contains the GPIO's name. This is the GPIO portion of the name that the
40*fd71220bSRobert Mustacchi  * PPR uses.
41*fd71220bSRobert Mustacchi  *
42*fd71220bSRobert Mustacchi  * ZEN_GPIO_ATTR_PAD_NAME -- ro
43*fd71220bSRobert Mustacchi  *	string
44*fd71220bSRobert Mustacchi  *
45*fd71220bSRobert Mustacchi  * This contains the name of the pad that the GPIO uses according to the PPR.
46*fd71220bSRobert Mustacchi  * This may match the GPIO's name, but may be different.
47*fd71220bSRobert Mustacchi  *
48*fd71220bSRobert Mustacchi  * ZEN_GPIO_ATTR_PAD_TYPE -- ro
49*fd71220bSRobert Mustacchi  *	uint32_t -- zen_gpio_pad_type_t
50*fd71220bSRobert Mustacchi  *
51*fd71220bSRobert Mustacchi  * This describes the type of pad that we have.
52*fd71220bSRobert Mustacchi  *
53*fd71220bSRobert Mustacchi  * ZEN_GPIO_ATTR_PIN -- ro
54*fd71220bSRobert Mustacchi  *	string
55*fd71220bSRobert Mustacchi  *
56*fd71220bSRobert Mustacchi  * This contains the name of the pin on the socket.
57*fd71220bSRobert Mustacchi  *
58*fd71220bSRobert Mustacchi  * ZEN_GPIO_ATTR_CAPS -- ro
59*fd71220bSRobert Mustacchi  *
60*fd71220bSRobert Mustacchi  * This contains some of the internal notes on the capabilities the pin
61*fd71220bSRobert Mustacchi  * theoretially has.
62*fd71220bSRobert Mustacchi  */
63*fd71220bSRobert Mustacchi #define	ZEN_GPIO_ATTR_PAD_NAME	"zen:pad_name"
64*fd71220bSRobert Mustacchi #define	ZEN_GPIO_ATTR_PAD_TYPE	"zen:pad_type"
65*fd71220bSRobert Mustacchi #define	ZEN_GPIO_ATTR_PIN	"zen:pin"
66*fd71220bSRobert Mustacchi #define	ZEN_GPIO_ATTR_CAPS	"zen:caps"
67*fd71220bSRobert Mustacchi 
68*fd71220bSRobert Mustacchi typedef enum {
69*fd71220bSRobert Mustacchi 	ZEN_GPIO_PAD_TYPE_GPIO,
70*fd71220bSRobert Mustacchi 	ZEN_GPIO_PAD_TYPE_SD,
71*fd71220bSRobert Mustacchi 	ZEN_GPIO_PAD_TYPE_I2C,
72*fd71220bSRobert Mustacchi 	ZEN_GPIO_PAD_TYPE_I3C
73*fd71220bSRobert Mustacchi } zen_gpio_pad_type_t;
74*fd71220bSRobert Mustacchi 
75*fd71220bSRobert Mustacchi typedef enum {
76*fd71220bSRobert Mustacchi 	/*
77*fd71220bSRobert Mustacchi 	 * Indicates that the GPIO supports interrupts.
78*fd71220bSRobert Mustacchi 	 */
79*fd71220bSRobert Mustacchi 	ZEN_GPIO_C_AGPIO = 1 << 0,
80*fd71220bSRobert Mustacchi 	/*
81*fd71220bSRobert Mustacchi 	 * Indicates that the GPIO is part of a remote block, which
82*fd71220bSRobert Mustacchi 	 * means more shenanigans to get it to work.
83*fd71220bSRobert Mustacchi 	 */
84*fd71220bSRobert Mustacchi 	ZEN_GPIO_C_REMOTE = 1 << 1
85*fd71220bSRobert Mustacchi } zen_gpio_cap_t;
86*fd71220bSRobert Mustacchi 
87*fd71220bSRobert Mustacchi /*
88*fd71220bSRobert Mustacchi  * ZEN_GPIO_ATTR_OUTPUT_DRIVER -- ro
89*fd71220bSRobert Mustacchi  *	uint32_t -- zen_gpio_driver_mode_t
90*fd71220bSRobert Mustacchi  *
91*fd71220bSRobert Mustacchi  * This describes the mode of the output driver for a given GPIO. Note, in Zen 4
92*fd71220bSRobert Mustacchi  * this is configurable for I3C based GPIOs.
93*fd71220bSRobert Mustacchi  */
94*fd71220bSRobert Mustacchi #define	ZEN_GPIO_ATTR_OUTPUT_DRIVER	"zen:output_driver"
95*fd71220bSRobert Mustacchi typedef enum {
96*fd71220bSRobert Mustacchi 	ZEN_GPIO_DRIVER_UNKNOWN,
97*fd71220bSRobert Mustacchi 	ZEN_GPIO_DRIVER_PUSH_PULL,
98*fd71220bSRobert Mustacchi 	ZEN_GPIO_DRIVER_OPEN_DRAIN
99*fd71220bSRobert Mustacchi } zen_gpio_driver_mode_t;
100*fd71220bSRobert Mustacchi 
101*fd71220bSRobert Mustacchi /*
102*fd71220bSRobert Mustacchi  * ZEN_GPIO_ATTR_OUTPUT -- rw
103*fd71220bSRobert Mustacchi  *	uint32_t -- zen_gpio_output_t
104*fd71220bSRobert Mustacchi  *
105*fd71220bSRobert Mustacchi  * This controls what the GPIO's output is. For open-drain style pins, the only
106*fd71220bSRobert Mustacchi  * options that are valid are disabled and low.
107*fd71220bSRobert Mustacchi  */
108*fd71220bSRobert Mustacchi #define	ZEN_GPIO_ATTR_OUTPUT	"zen:output"
109*fd71220bSRobert Mustacchi typedef enum {
110*fd71220bSRobert Mustacchi 	ZEN_GPIO_OUTPUT_DISABLED,
111*fd71220bSRobert Mustacchi 	ZEN_GPIO_OUTPUT_LOW,
112*fd71220bSRobert Mustacchi 	ZEN_GPIO_OUTPUT_HIGH
113*fd71220bSRobert Mustacchi } zen_gpio_output_t;
114*fd71220bSRobert Mustacchi 
115*fd71220bSRobert Mustacchi /*
116*fd71220bSRobert Mustacchi  * ZEN_GPIO_ATTR_INPUT -- ro
117*fd71220bSRobert Mustacchi  *	uint32_t -- zen_gpio_input_t
118*fd71220bSRobert Mustacchi  *
119*fd71220bSRobert Mustacchi  * This describes the current input value of the pin.
120*fd71220bSRobert Mustacchi  */
121*fd71220bSRobert Mustacchi #define	ZEN_GPIO_ATTR_INPUT	"zen:input"
122*fd71220bSRobert Mustacchi typedef enum {
123*fd71220bSRobert Mustacchi 	ZEN_GPIO_INPUT_LOW,
124*fd71220bSRobert Mustacchi 	ZEN_GPIO_INPUT_HIGH
125*fd71220bSRobert Mustacchi } zen_gpio_input_t;
126*fd71220bSRobert Mustacchi 
127*fd71220bSRobert Mustacchi /*
128*fd71220bSRobert Mustacchi  * ZEN_GPIO_ATTR_VOLTAGE -- ro
129*fd71220bSRobert Mustacchi  *	zen_gpio_voltage_t
130*fd71220bSRobert Mustacchi  *
131*fd71220bSRobert Mustacchi  * This describes the different type of voltages that a given pin supports.
132*fd71220bSRobert Mustacchi  * Note, all the pad registers are not driven as part of the GPIO driver and
133*fd71220bSRobert Mustacchi  * therefore changes to this are not supported (today).
134*fd71220bSRobert Mustacchi  */
135*fd71220bSRobert Mustacchi #define	ZEN_GPIO_ATTR_VOLTAGE	"zen:voltage"
136*fd71220bSRobert Mustacchi 
137*fd71220bSRobert Mustacchi typedef enum {
138*fd71220bSRobert Mustacchi 	ZEN_GPIO_V_UNKNOWN = 0,
139*fd71220bSRobert Mustacchi 	ZEN_GPIO_V_1P1_S3 = 1 << 0,
140*fd71220bSRobert Mustacchi 	ZEN_GPIO_V_1P8_S5 = 1 << 1,
141*fd71220bSRobert Mustacchi 	ZEN_GPIO_V_1P8_S0 = 1 << 2,
142*fd71220bSRobert Mustacchi 	ZEN_GPIO_V_3P3_S5 = 1 << 3,
143*fd71220bSRobert Mustacchi 	ZEN_GPIO_V_3P3_S0 = 1 << 4
144*fd71220bSRobert Mustacchi } zen_gpio_voltage_t;
145*fd71220bSRobert Mustacchi 
146*fd71220bSRobert Mustacchi /*
147*fd71220bSRobert Mustacchi  * ZEN_GPIO_ATTR_PULL -- rw
148*fd71220bSRobert Mustacchi  *	uint32_t -- zen_gpio_pull_t
149*fd71220bSRobert Mustacchi  *
150*fd71220bSRobert Mustacchi  * This controls the pull and strength of a GPIO. Note, some pins require a
151*fd71220bSRobert Mustacchi  * strength to be specified where as others do not support this. This varies
152*fd71220bSRobert Mustacchi  * based on the specific chip and socket.
153*fd71220bSRobert Mustacchi  */
154*fd71220bSRobert Mustacchi #define	ZEN_GPIO_ATTR_PULL	"zen:pull"
155*fd71220bSRobert Mustacchi 
156*fd71220bSRobert Mustacchi typedef enum {
157*fd71220bSRobert Mustacchi 	ZEN_GPIO_PULL_DISABLED = 0,
158*fd71220bSRobert Mustacchi 	ZEN_GPIO_PULL_DOWN,
159*fd71220bSRobert Mustacchi 	ZEN_GPIO_PULL_UP_4K,
160*fd71220bSRobert Mustacchi 	ZEN_GPIO_PULL_UP_8K,
161*fd71220bSRobert Mustacchi 	ZEN_GPIO_PULL_UP,
162*fd71220bSRobert Mustacchi 	/*
163*fd71220bSRobert Mustacchi 	 * The following are possible values, but not ones that we allow to be
164*fd71220bSRobert Mustacchi 	 * set. That is, these are illegal combinations, but there is nothing
165*fd71220bSRobert Mustacchi 	 * that stops hardware from being able to shout them at us.
166*fd71220bSRobert Mustacchi 	 */
167*fd71220bSRobert Mustacchi 	ZEN_GPIO_PULL_DOWN_UP,
168*fd71220bSRobert Mustacchi 	ZEN_GPIO_PULL_DOWN_UP_4K,
169*fd71220bSRobert Mustacchi 	ZEN_GPIO_PULL_DOWN_UP_8K
170*fd71220bSRobert Mustacchi } zen_gpio_pull_t;
171*fd71220bSRobert Mustacchi 
172*fd71220bSRobert Mustacchi /*
173*fd71220bSRobert Mustacchi  * ZEN_GPIO_ATTR_DRIVE_STRENGTH -- rw
174*fd71220bSRobert Mustacchi  *	uint32_t -- zen_gpio_drive_strength_t
175*fd71220bSRobert Mustacchi  */
176*fd71220bSRobert Mustacchi #define	ZEN_GPIO_ATTR_DRIVE_STRENGTH	"zen:drive_strength"
177*fd71220bSRobert Mustacchi 
178*fd71220bSRobert Mustacchi typedef enum {
179*fd71220bSRobert Mustacchi 	ZEN_GPIO_DRIVE_UNKNOWN,
180*fd71220bSRobert Mustacchi 	ZEN_GPIO_DRIVE_40R,
181*fd71220bSRobert Mustacchi 	ZEN_GPIO_DRIVE_60R,
182*fd71220bSRobert Mustacchi 	ZEN_GPIO_DRIVE_80R
183*fd71220bSRobert Mustacchi } zen_gpio_drive_strength_t;
184*fd71220bSRobert Mustacchi 
185*fd71220bSRobert Mustacchi /*
186*fd71220bSRobert Mustacchi  * These three attributes are used to control the debounce configuration which
187*fd71220bSRobert Mustacchi  * ties into interrupt generation.
188*fd71220bSRobert Mustacchi  *
189*fd71220bSRobert Mustacchi  * ZEN_GPIO_ATTR_DEBOUNCE_MODE -- rw
190*fd71220bSRobert Mustacchi  *	uint32 -- zen_gpio_debounce_mode_t
191*fd71220bSRobert Mustacchi  *
192*fd71220bSRobert Mustacchi  * This controls how the debounce logic works internally and what actions should
193*fd71220bSRobert Mustacchi  * be taken.
194*fd71220bSRobert Mustacchi  *
195*fd71220bSRobert Mustacchi  * ZEN_GPIO_ATTR_DEBOUNCE_UNIT -- rw
196*fd71220bSRobert Mustacchi  *	uint32_t -- zen_gpio_debounce_unit_t
197*fd71220bSRobert Mustacchi  *
198*fd71220bSRobert Mustacchi  * This controls the unit and graunlarity. This is phrased in terms of units of
199*fd71220bSRobert Mustacchi  * the RTC clock and translates into 61 us, 244 us, 15.6 ms, and 62.5 ms.
200*fd71220bSRobert Mustacchi  *
201*fd71220bSRobert Mustacchi  * ZEN_GPIO_ATTR_DEBOUNCE_COUNT -- rw
202*fd71220bSRobert Mustacchi  *	 uint32_t
203*fd71220bSRobert Mustacchi  *
204*fd71220bSRobert Mustacchi  * This is the number of debounce count units should be used. This is capped to
205*fd71220bSRobert Mustacchi  * a 4-bit value.
206*fd71220bSRobert Mustacchi  */
207*fd71220bSRobert Mustacchi #define	ZEN_GPIO_ATTR_DEBOUNCE_MODE	"zen:debounce_mode"
208*fd71220bSRobert Mustacchi #define	ZEN_GPIO_ATTR_DEBOUNCE_UNIT	"zen:debounce_unit"
209*fd71220bSRobert Mustacchi #define	ZEN_GPIO_ATTR_DEBOUNCE_COUNT	"zen:debounce_count"
210*fd71220bSRobert Mustacchi 
211*fd71220bSRobert Mustacchi typedef enum {
212*fd71220bSRobert Mustacchi 	ZEN_GPIO_DEBOUNCE_MODE_NONE = 0,
213*fd71220bSRobert Mustacchi 	ZEN_GPIO_DEBOUNCE_MODE_KEEP_LOW,
214*fd71220bSRobert Mustacchi 	ZEN_GPIO_DEBOUNCE_MODE_KEEP_HIGH,
215*fd71220bSRobert Mustacchi 	ZEN_GPIO_DEBOUNCE_MODE_REMOVE,
216*fd71220bSRobert Mustacchi } zen_gpio_debounce_mode_t;
217*fd71220bSRobert Mustacchi 
218*fd71220bSRobert Mustacchi typedef enum {
219*fd71220bSRobert Mustacchi 	ZEN_GPIO_DEBOUNCE_UNIT_2RTC = 0,
220*fd71220bSRobert Mustacchi 	ZEN_GPIO_DEBOUNCE_UNIT_8RTC,
221*fd71220bSRobert Mustacchi 	ZEN_GPIO_DEBOUNCE_UNIT_512RTC,
222*fd71220bSRobert Mustacchi 	ZEN_GPIO_DEBOUNCE_UNIT_2048RTC,
223*fd71220bSRobert Mustacchi } zen_gpio_debounce_unit_t;
224*fd71220bSRobert Mustacchi 
225*fd71220bSRobert Mustacchi /*
226*fd71220bSRobert Mustacchi  * ZEN_GPIO_ATTR_TRIGGER_MODE -- rw -- uint32_t zen_gpio_trigger_t enum
227*fd71220bSRobert Mustacchi  *
228*fd71220bSRobert Mustacchi  * This attribute controls how the device generates interrupts. In particular,
229*fd71220bSRobert Mustacchi  * this covers whether it's edge or level triggered and what constitutes and
230*fd71220bSRobert Mustacchi  * edge. Debounce logic still applies.
231*fd71220bSRobert Mustacchi  */
232*fd71220bSRobert Mustacchi #define	ZEN_GPIO_ATTR_TRIGGER_MODE	"zen:trigger_mode"
233*fd71220bSRobert Mustacchi 
234*fd71220bSRobert Mustacchi typedef enum {
235*fd71220bSRobert Mustacchi 	ZEN_GPIO_TRIGGER_UNKNOWN = 0,
236*fd71220bSRobert Mustacchi 	ZEN_GPIO_TRIGGER_EDGE_HIGH,
237*fd71220bSRobert Mustacchi 	ZEN_GPIO_TRIGGER_EDGE_LOW,
238*fd71220bSRobert Mustacchi 	ZEN_GPIO_TRIGGER_EDGE_BOTH,
239*fd71220bSRobert Mustacchi 	ZEN_GPIO_TRIGGER_LEVEL_HIGH,
240*fd71220bSRobert Mustacchi 	ZEN_GPIO_TRIGGER_LEVEL_LOW
241*fd71220bSRobert Mustacchi } zen_gpio_trigger_t;
242*fd71220bSRobert Mustacchi 
243*fd71220bSRobert Mustacchi /*
244*fd71220bSRobert Mustacchi  * ZEN_GPIO_ATTR_STATUS -- ro
245*fd71220bSRobert Mustacchi  *	uint32_t -- zen_gpio_status_t
246*fd71220bSRobert Mustacchi  *
247*fd71220bSRobert Mustacchi  * This enumeration is a bitfield of status flags that the gpio has.
248*fd71220bSRobert Mustacchi  */
249*fd71220bSRobert Mustacchi #define	ZEN_GPIO_ATTR_STATUS	"zen:status"
250*fd71220bSRobert Mustacchi 
251*fd71220bSRobert Mustacchi typedef enum {
252*fd71220bSRobert Mustacchi 	ZEN_GPIO_STATUS_WAKE	= 1 << 0,
253*fd71220bSRobert Mustacchi 	ZEN_GPIO_STATUS_INTR	= 1 << 1,
254*fd71220bSRobert Mustacchi } zen_gpio_status_t;
255*fd71220bSRobert Mustacchi 
256*fd71220bSRobert Mustacchi /*
257*fd71220bSRobert Mustacchi  * ZEN_GPIO_ATTR_RAW_REG -- ro
258*fd71220bSRobert Mustacchi  *	uint32_t
259*fd71220bSRobert Mustacchi  *
260*fd71220bSRobert Mustacchi  * This is an attribute which includes the raw register value for the gpio
261*fd71220bSRobert Mustacchi  * register. This is here for debugging purposes.
262*fd71220bSRobert Mustacchi  */
263*fd71220bSRobert Mustacchi #define	ZEN_GPIO_ATTR_RAW_REG	"zen:raw_reg"
264*fd71220bSRobert Mustacchi 
265*fd71220bSRobert Mustacchi #ifdef __cplusplus
266*fd71220bSRobert Mustacchi }
267*fd71220bSRobert Mustacchi #endif
268*fd71220bSRobert Mustacchi 
269*fd71220bSRobert Mustacchi #endif /* _SYS_GPIO_ZEN_GPIO_H */
270