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