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