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