xref: /illumos-gate/usr/src/uts/common/sys/gpio/kgpio.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_KGPIO_H
17*fd71220bSRobert Mustacchi #define	_SYS_GPIO_KGPIO_H
18*fd71220bSRobert Mustacchi 
19*fd71220bSRobert Mustacchi /*
20*fd71220bSRobert Mustacchi  * User / Kernel kgpio interface
21*fd71220bSRobert Mustacchi  */
22*fd71220bSRobert Mustacchi 
23*fd71220bSRobert Mustacchi #include <sys/stdint.h>
24*fd71220bSRobert Mustacchi #include <sys/param.h>
25*fd71220bSRobert Mustacchi #include <sys/gpio/kgpio_attr.h>
26*fd71220bSRobert Mustacchi 
27*fd71220bSRobert Mustacchi #ifdef __cplusplus
28*fd71220bSRobert Mustacchi extern "C" {
29*fd71220bSRobert Mustacchi #endif
30*fd71220bSRobert Mustacchi 
31*fd71220bSRobert Mustacchi #define	KGPIO_IOC	(('k' << 24) | ('g' << 16) | ('p' << 8))
32*fd71220bSRobert Mustacchi 
33*fd71220bSRobert Mustacchi /*
34*fd71220bSRobert Mustacchi  * Obtain basic information about a GPIO controller.
35*fd71220bSRobert Mustacchi  */
36*fd71220bSRobert Mustacchi #define	KGPIO_IOC_CTRL_INFO	(KGPIO_IOC | 1)
37*fd71220bSRobert Mustacchi typedef struct {
38*fd71220bSRobert Mustacchi 	uint32_t	kci_ngroups;
39*fd71220bSRobert Mustacchi 	uint32_t	kci_ngpios;
40*fd71220bSRobert Mustacchi 	uint32_t	kci_ndpios;
41*fd71220bSRobert Mustacchi 	uint32_t	kci_pad;
42*fd71220bSRobert Mustacchi 	char		kci_devpath[MAXPATHLEN];
43*fd71220bSRobert Mustacchi } kgpio_ctrl_info_t;
44*fd71220bSRobert Mustacchi 
45*fd71220bSRobert Mustacchi /*
46*fd71220bSRobert Mustacchi  * This gets detailed information about a given GPIO. It includes all the
47*fd71220bSRobert Mustacchi  * provider's attributes as well for the GPIO.
48*fd71220bSRobert Mustacchi  */
49*fd71220bSRobert Mustacchi #define	KGPIO_IOC_GPIO_INFO	(KGPIO_IOC | 2)
50*fd71220bSRobert Mustacchi 
51*fd71220bSRobert Mustacchi typedef enum {
52*fd71220bSRobert Mustacchi 	KGPIO_GPIO_F_DPIO	= 1 << 0
53*fd71220bSRobert Mustacchi } kgpio_gpio_flags_t;
54*fd71220bSRobert Mustacchi 
55*fd71220bSRobert Mustacchi typedef struct {
56*fd71220bSRobert Mustacchi 	uint32_t		kgi_id;
57*fd71220bSRobert Mustacchi 	kgpio_gpio_flags_t	kgi_flags;
58*fd71220bSRobert Mustacchi 	uintptr_t		kgi_attr;
59*fd71220bSRobert Mustacchi 	size_t			kgi_attr_len;
60*fd71220bSRobert Mustacchi } kgpio_gpio_info_t;
61*fd71220bSRobert Mustacchi 
62*fd71220bSRobert Mustacchi /*
63*fd71220bSRobert Mustacchi  * This is used to set the attributes of a given GPIO. It takes an nvlist_t and
64*fd71220bSRobert Mustacchi  * also returns an nvlist_t of errors.
65*fd71220bSRobert Mustacchi  */
66*fd71220bSRobert Mustacchi #define	KGPIO_IOC_GPIO_UPDATE	(KGPIO_IOC | 3)
67*fd71220bSRobert Mustacchi 
68*fd71220bSRobert Mustacchi typedef enum {
69*fd71220bSRobert Mustacchi 	/*
70*fd71220bSRobert Mustacchi 	 * This flag is set by the kernel on return. If the system returns 0,
71*fd71220bSRobert Mustacchi 	 * then this must be checked to see if there were errors available.
72*fd71220bSRobert Mustacchi 	 */
73*fd71220bSRobert Mustacchi 	KGPIO_UPDATE_ERROR = 1 << 0,
74*fd71220bSRobert Mustacchi 	/*
75*fd71220bSRobert Mustacchi 	 * Indicates that the information in the error NVL is valid.
76*fd71220bSRobert Mustacchi 	 */
77*fd71220bSRobert Mustacchi 	KGPIO_UPDATE_ERR_NVL_VALID = 1 << 1
78*fd71220bSRobert Mustacchi } kgpio_update_flags_t;
79*fd71220bSRobert Mustacchi 
80*fd71220bSRobert Mustacchi typedef struct {
81*fd71220bSRobert Mustacchi 	uint32_t		kgu_id;
82*fd71220bSRobert Mustacchi 	kgpio_update_flags_t	kgu_flags;
83*fd71220bSRobert Mustacchi 	uintptr_t		kgu_attr;
84*fd71220bSRobert Mustacchi 	size_t			kgu_attr_len;
85*fd71220bSRobert Mustacchi 	uintptr_t		kgu_err;
86*fd71220bSRobert Mustacchi 	size_t			kgu_err_len;
87*fd71220bSRobert Mustacchi } kgpio_update_t;
88*fd71220bSRobert Mustacchi 
89*fd71220bSRobert Mustacchi /*
90*fd71220bSRobert Mustacchi  * This is used to create a DPIO from a given GPIO.
91*fd71220bSRobert Mustacchi  */
92*fd71220bSRobert Mustacchi #define	KGPIO_IOC_DPIO_CREATE	(KGPIO_IOC | 4)
93*fd71220bSRobert Mustacchi 
94*fd71220bSRobert Mustacchi typedef enum {
95*fd71220bSRobert Mustacchi 	/*
96*fd71220bSRobert Mustacchi 	 * Indicates that reading the input value of the DPIO is allowed.
97*fd71220bSRobert Mustacchi 	 */
98*fd71220bSRobert Mustacchi 	KGPIO_DPIO_F_READ	= 1 << 0,
99*fd71220bSRobert Mustacchi 	/*
100*fd71220bSRobert Mustacchi 	 * Indicates that setting the output value of the DPIO is allowed.
101*fd71220bSRobert Mustacchi 	 */
102*fd71220bSRobert Mustacchi 	KGPIO_DPIO_F_WRITE	= 1 << 1,
103*fd71220bSRobert Mustacchi 	/*
104*fd71220bSRobert Mustacchi 	 * Indicates that the DPIO should be restricted to only the kernel.
105*fd71220bSRobert Mustacchi 	 */
106*fd71220bSRobert Mustacchi 	KGPIO_DPIO_F_KERNEL	= 1 << 2
107*fd71220bSRobert Mustacchi } kgpio_dpio_flags_t;
108*fd71220bSRobert Mustacchi 
109*fd71220bSRobert Mustacchi #define	KGPIO_DPIO_NAMELEN	32
110*fd71220bSRobert Mustacchi 
111*fd71220bSRobert Mustacchi typedef struct {
112*fd71220bSRobert Mustacchi 	uint32_t		kdc_id;
113*fd71220bSRobert Mustacchi 	kgpio_dpio_flags_t	kdc_flags;
114*fd71220bSRobert Mustacchi 	char			kdc_name[KGPIO_DPIO_NAMELEN];
115*fd71220bSRobert Mustacchi } kgpio_dpio_create_t;
116*fd71220bSRobert Mustacchi 
117*fd71220bSRobert Mustacchi /*
118*fd71220bSRobert Mustacchi  * This is used to destroy a DPIO that is bound to the specific GPIO.
119*fd71220bSRobert Mustacchi  */
120*fd71220bSRobert Mustacchi #define	KGPIO_IOC_DPIO_DESTROY	(KGPIO_IOC | 5)
121*fd71220bSRobert Mustacchi typedef struct {
122*fd71220bSRobert Mustacchi 	uint32_t	kdd_id;
123*fd71220bSRobert Mustacchi 	uint32_t	kdd_pad;
124*fd71220bSRobert Mustacchi } kgpio_dpio_destroy_t;
125*fd71220bSRobert Mustacchi 
126*fd71220bSRobert Mustacchi /*
127*fd71220bSRobert Mustacchi  * Determines if a GPIO with the specified name is present on the given
128*fd71220bSRobert Mustacchi  * controller. If so, its ID is returned.
129*fd71220bSRobert Mustacchi  */
130*fd71220bSRobert Mustacchi #define	KGPIO_IOC_GPIO_NAME2ID	(KGPIO_IOC | 6)
131*fd71220bSRobert Mustacchi typedef struct {
132*fd71220bSRobert Mustacchi 	char		kin_name[MAXPATHLEN];
133*fd71220bSRobert Mustacchi 	uint32_t	kin_id;
134*fd71220bSRobert Mustacchi } kgpio_ioc_name2id_t;
135*fd71220bSRobert Mustacchi 
136*fd71220bSRobert Mustacchi /*
137*fd71220bSRobert Mustacchi  * Kernel-specific views for 32-bit.
138*fd71220bSRobert Mustacchi  */
139*fd71220bSRobert Mustacchi #ifdef	_KERNEL
140*fd71220bSRobert Mustacchi typedef struct {
141*fd71220bSRobert Mustacchi 	uint32_t		kgi_id;
142*fd71220bSRobert Mustacchi 	kgpio_gpio_flags_t	kgi_flags;
143*fd71220bSRobert Mustacchi 	uintptr32_t		kgi_attr;
144*fd71220bSRobert Mustacchi 	size32_t		kgi_attr_len;
145*fd71220bSRobert Mustacchi } kgpio_gpio_info32_t;
146*fd71220bSRobert Mustacchi 
147*fd71220bSRobert Mustacchi typedef struct {
148*fd71220bSRobert Mustacchi 	uint32_t		kgu_id;
149*fd71220bSRobert Mustacchi 	kgpio_update_flags_t	kgu_flags;
150*fd71220bSRobert Mustacchi 	uintptr32_t		kgu_attr;
151*fd71220bSRobert Mustacchi 	size32_t		kgu_attr_len;
152*fd71220bSRobert Mustacchi 	uintptr32_t		kgu_err;
153*fd71220bSRobert Mustacchi 	size32_t		kgu_err_len;
154*fd71220bSRobert Mustacchi } kgpio_update32_t;
155*fd71220bSRobert Mustacchi #endif	/* _KERNEL */
156*fd71220bSRobert Mustacchi 
157*fd71220bSRobert Mustacchi #ifdef __cplusplus
158*fd71220bSRobert Mustacchi }
159*fd71220bSRobert Mustacchi #endif
160*fd71220bSRobert Mustacchi 
161*fd71220bSRobert Mustacchi #endif /* _SYS_GPIO_KGPIO_H */
162