1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright (c) 2011 The Chromium OS Authors. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * This file is derived from the flashrom project. 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef _ICH_H_ 10*4882a593Smuzhiyun #define _ICH_H_ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun struct ich7_spi_regs { 13*4882a593Smuzhiyun uint16_t spis; 14*4882a593Smuzhiyun uint16_t spic; 15*4882a593Smuzhiyun uint32_t spia; 16*4882a593Smuzhiyun uint64_t spid[8]; 17*4882a593Smuzhiyun uint64_t _pad; 18*4882a593Smuzhiyun uint32_t bbar; 19*4882a593Smuzhiyun uint16_t preop; 20*4882a593Smuzhiyun uint16_t optype; 21*4882a593Smuzhiyun uint8_t opmenu[8]; 22*4882a593Smuzhiyun } __packed; 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun struct ich9_spi_regs { 25*4882a593Smuzhiyun uint32_t bfpr; /* 0x00 */ 26*4882a593Smuzhiyun uint16_t hsfs; 27*4882a593Smuzhiyun uint16_t hsfc; 28*4882a593Smuzhiyun uint32_t faddr; 29*4882a593Smuzhiyun uint32_t _reserved0; 30*4882a593Smuzhiyun uint32_t fdata[16]; /* 0x10 */ 31*4882a593Smuzhiyun uint32_t frap; /* 0x50 */ 32*4882a593Smuzhiyun uint32_t freg[5]; 33*4882a593Smuzhiyun uint32_t _reserved1[3]; 34*4882a593Smuzhiyun uint32_t pr[5]; /* 0x74 */ 35*4882a593Smuzhiyun uint32_t _reserved2[2]; 36*4882a593Smuzhiyun uint8_t ssfs; /* 0x90 */ 37*4882a593Smuzhiyun uint8_t ssfc[3]; 38*4882a593Smuzhiyun uint16_t preop; /* 0x94 */ 39*4882a593Smuzhiyun uint16_t optype; 40*4882a593Smuzhiyun uint8_t opmenu[8]; /* 0x98 */ 41*4882a593Smuzhiyun uint32_t bbar; 42*4882a593Smuzhiyun uint8_t _reserved3[12]; 43*4882a593Smuzhiyun uint32_t fdoc; /* 0xb0 */ 44*4882a593Smuzhiyun uint32_t fdod; 45*4882a593Smuzhiyun uint8_t _reserved4[8]; 46*4882a593Smuzhiyun uint32_t afc; /* 0xc0 */ 47*4882a593Smuzhiyun uint32_t lvscc; 48*4882a593Smuzhiyun uint32_t uvscc; 49*4882a593Smuzhiyun uint8_t _reserved5[4]; 50*4882a593Smuzhiyun uint32_t fpb; /* 0xd0 */ 51*4882a593Smuzhiyun uint8_t _reserved6[28]; 52*4882a593Smuzhiyun uint32_t srdl; /* 0xf0 */ 53*4882a593Smuzhiyun uint32_t srdc; 54*4882a593Smuzhiyun uint32_t scs; 55*4882a593Smuzhiyun uint32_t bcr; 56*4882a593Smuzhiyun } __packed; 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun enum { 59*4882a593Smuzhiyun SPIS_SCIP = 0x0001, 60*4882a593Smuzhiyun SPIS_GRANT = 0x0002, 61*4882a593Smuzhiyun SPIS_CDS = 0x0004, 62*4882a593Smuzhiyun SPIS_FCERR = 0x0008, 63*4882a593Smuzhiyun SSFS_AEL = 0x0010, 64*4882a593Smuzhiyun SPIS_LOCK = 0x8000, 65*4882a593Smuzhiyun SPIS_RESERVED_MASK = 0x7ff0, 66*4882a593Smuzhiyun SSFS_RESERVED_MASK = 0x7fe2 67*4882a593Smuzhiyun }; 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun enum { 70*4882a593Smuzhiyun SPIC_SCGO = 0x000002, 71*4882a593Smuzhiyun SPIC_ACS = 0x000004, 72*4882a593Smuzhiyun SPIC_SPOP = 0x000008, 73*4882a593Smuzhiyun SPIC_DBC = 0x003f00, 74*4882a593Smuzhiyun SPIC_DS = 0x004000, 75*4882a593Smuzhiyun SPIC_SME = 0x008000, 76*4882a593Smuzhiyun SSFC_SCF_MASK = 0x070000, 77*4882a593Smuzhiyun SSFC_RESERVED = 0xf80000, 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun /* Mask for speed byte, biuts 23:16 of SSFC */ 80*4882a593Smuzhiyun SSFC_SCF_33MHZ = 0x01, 81*4882a593Smuzhiyun }; 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun enum { 84*4882a593Smuzhiyun HSFS_FDONE = 0x0001, 85*4882a593Smuzhiyun HSFS_FCERR = 0x0002, 86*4882a593Smuzhiyun HSFS_AEL = 0x0004, 87*4882a593Smuzhiyun HSFS_BERASE_MASK = 0x0018, 88*4882a593Smuzhiyun HSFS_BERASE_SHIFT = 3, 89*4882a593Smuzhiyun HSFS_SCIP = 0x0020, 90*4882a593Smuzhiyun HSFS_FDOPSS = 0x2000, 91*4882a593Smuzhiyun HSFS_FDV = 0x4000, 92*4882a593Smuzhiyun HSFS_FLOCKDN = 0x8000 93*4882a593Smuzhiyun }; 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun enum { 96*4882a593Smuzhiyun HSFC_FGO = 0x0001, 97*4882a593Smuzhiyun HSFC_FCYCLE_MASK = 0x0006, 98*4882a593Smuzhiyun HSFC_FCYCLE_SHIFT = 1, 99*4882a593Smuzhiyun HSFC_FDBC_MASK = 0x3f00, 100*4882a593Smuzhiyun HSFC_FDBC_SHIFT = 8, 101*4882a593Smuzhiyun HSFC_FSMIE = 0x8000 102*4882a593Smuzhiyun }; 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun enum { 105*4882a593Smuzhiyun ICH_MAX_CMD_LEN = 5, 106*4882a593Smuzhiyun }; 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun struct spi_trans { 109*4882a593Smuzhiyun uint8_t cmd[ICH_MAX_CMD_LEN]; 110*4882a593Smuzhiyun int cmd_len; 111*4882a593Smuzhiyun const uint8_t *out; 112*4882a593Smuzhiyun uint32_t bytesout; 113*4882a593Smuzhiyun uint8_t *in; 114*4882a593Smuzhiyun uint32_t bytesin; 115*4882a593Smuzhiyun uint8_t type; 116*4882a593Smuzhiyun uint8_t opcode; 117*4882a593Smuzhiyun uint32_t offset; 118*4882a593Smuzhiyun }; 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun #define SPI_OPCODE_WRSR 0x01 121*4882a593Smuzhiyun #define SPI_OPCODE_PAGE_PROGRAM 0x02 122*4882a593Smuzhiyun #define SPI_OPCODE_READ 0x03 123*4882a593Smuzhiyun #define SPI_OPCODE_WRDIS 0x04 124*4882a593Smuzhiyun #define SPI_OPCODE_RDSR 0x05 125*4882a593Smuzhiyun #define SPI_OPCODE_WREN 0x06 126*4882a593Smuzhiyun #define SPI_OPCODE_FAST_READ 0x0b 127*4882a593Smuzhiyun #define SPI_OPCODE_ERASE_SECT 0x20 128*4882a593Smuzhiyun #define SPI_OPCODE_READ_ID 0x9f 129*4882a593Smuzhiyun #define SPI_OPCODE_ERASE_BLOCK 0xd8 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun #define SPI_OPCODE_TYPE_READ_NO_ADDRESS 0 132*4882a593Smuzhiyun #define SPI_OPCODE_TYPE_WRITE_NO_ADDRESS 1 133*4882a593Smuzhiyun #define SPI_OPCODE_TYPE_READ_WITH_ADDRESS 2 134*4882a593Smuzhiyun #define SPI_OPCODE_TYPE_WRITE_WITH_ADDRESS 3 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun #define SPI_OPMENU_0 SPI_OPCODE_WRSR 137*4882a593Smuzhiyun #define SPI_OPTYPE_0 SPI_OPCODE_TYPE_WRITE_NO_ADDRESS 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun #define SPI_OPMENU_1 SPI_OPCODE_PAGE_PROGRAM 140*4882a593Smuzhiyun #define SPI_OPTYPE_1 SPI_OPCODE_TYPE_WRITE_WITH_ADDRESS 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun #define SPI_OPMENU_2 SPI_OPCODE_READ 143*4882a593Smuzhiyun #define SPI_OPTYPE_2 SPI_OPCODE_TYPE_READ_WITH_ADDRESS 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun #define SPI_OPMENU_3 SPI_OPCODE_RDSR 146*4882a593Smuzhiyun #define SPI_OPTYPE_3 SPI_OPCODE_TYPE_READ_NO_ADDRESS 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun #define SPI_OPMENU_4 SPI_OPCODE_ERASE_SECT 149*4882a593Smuzhiyun #define SPI_OPTYPE_4 SPI_OPCODE_TYPE_WRITE_WITH_ADDRESS 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun #define SPI_OPMENU_5 SPI_OPCODE_READ_ID 152*4882a593Smuzhiyun #define SPI_OPTYPE_5 SPI_OPCODE_TYPE_READ_NO_ADDRESS 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun #define SPI_OPMENU_6 SPI_OPCODE_ERASE_BLOCK 155*4882a593Smuzhiyun #define SPI_OPTYPE_6 SPI_OPCODE_TYPE_WRITE_WITH_ADDRESS 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun #define SPI_OPMENU_7 SPI_OPCODE_FAST_READ 158*4882a593Smuzhiyun #define SPI_OPTYPE_7 SPI_OPCODE_TYPE_READ_WITH_ADDRESS 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun #define SPI_OPPREFIX ((SPI_OPCODE_WREN << 8) | SPI_OPCODE_WREN) 161*4882a593Smuzhiyun #define SPI_OPTYPE ((SPI_OPTYPE_7 << 14) | (SPI_OPTYPE_6 << 12) | \ 162*4882a593Smuzhiyun (SPI_OPTYPE_5 << 10) | (SPI_OPTYPE_4 << 8) | \ 163*4882a593Smuzhiyun (SPI_OPTYPE_3 << 6) | (SPI_OPTYPE_2 << 4) | \ 164*4882a593Smuzhiyun (SPI_OPTYPE_1 << 2) | (SPI_OPTYPE_0 << 0)) 165*4882a593Smuzhiyun #define SPI_OPMENU_UPPER ((SPI_OPMENU_7 << 24) | (SPI_OPMENU_6 << 16) | \ 166*4882a593Smuzhiyun (SPI_OPMENU_5 << 8) | (SPI_OPMENU_4 << 0)) 167*4882a593Smuzhiyun #define SPI_OPMENU_LOWER ((SPI_OPMENU_3 << 24) | (SPI_OPMENU_2 << 16) | \ 168*4882a593Smuzhiyun (SPI_OPMENU_1 << 8) | (SPI_OPMENU_0 << 0)) 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun enum ich_version { 171*4882a593Smuzhiyun ICHV_7, 172*4882a593Smuzhiyun ICHV_9, 173*4882a593Smuzhiyun }; 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun struct ich_spi_platdata { 176*4882a593Smuzhiyun enum ich_version ich_version; /* Controller version, 7 or 9 */ 177*4882a593Smuzhiyun bool lockdown; /* lock down controller settings? */ 178*4882a593Smuzhiyun }; 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun struct ich_spi_priv { 181*4882a593Smuzhiyun int opmenu; 182*4882a593Smuzhiyun int menubytes; 183*4882a593Smuzhiyun void *base; /* Base of register set */ 184*4882a593Smuzhiyun int preop; 185*4882a593Smuzhiyun int optype; 186*4882a593Smuzhiyun int addr; 187*4882a593Smuzhiyun int data; 188*4882a593Smuzhiyun unsigned databytes; 189*4882a593Smuzhiyun int status; 190*4882a593Smuzhiyun int control; 191*4882a593Smuzhiyun int bbar; 192*4882a593Smuzhiyun int bcr; 193*4882a593Smuzhiyun uint32_t *pr; /* only for ich9 */ 194*4882a593Smuzhiyun int speed; /* pointer to speed control */ 195*4882a593Smuzhiyun ulong max_speed; /* Maximum bus speed in MHz */ 196*4882a593Smuzhiyun ulong cur_speed; /* Current bus speed */ 197*4882a593Smuzhiyun struct spi_trans trans; /* current transaction in progress */ 198*4882a593Smuzhiyun }; 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun #endif /* _ICH_H_ */ 201