1 1.12 andvar /* $NetBSD: siisatareg.h,v 1.12 2021/07/31 20:29:37 andvar Exp $ */ 2 1.1 jnemeth 3 1.6 jakllsch /* 4 1.7 jakllsch * Copyright (c) 2007, 2008, 2009, 2010, 2011 Jonathan A. Kollasch. 5 1.1 jnemeth * All rights reserved. 6 1.1 jnemeth * 7 1.1 jnemeth * Redistribution and use in source and binary forms, with or without 8 1.1 jnemeth * modification, are permitted provided that the following conditions 9 1.1 jnemeth * are met: 10 1.1 jnemeth * 1. Redistributions of source code must retain the above copyright 11 1.1 jnemeth * notice, this list of conditions and the following disclaimer. 12 1.1 jnemeth * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 jnemeth * notice, this list of conditions and the following disclaimer in the 14 1.1 jnemeth * documentation and/or other materials provided with the distribution. 15 1.1 jnemeth * 16 1.1 jnemeth * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 1.1 jnemeth * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 1.1 jnemeth * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 1.1 jnemeth * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20 1.1 jnemeth * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21 1.1 jnemeth * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 1.1 jnemeth * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 1.1 jnemeth * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 1.1 jnemeth * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25 1.1 jnemeth * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 1.1 jnemeth * 27 1.1 jnemeth */ 28 1.1 jnemeth 29 1.6 jakllsch #ifndef _IC_SIISATAREG_H_ 30 1.6 jakllsch #define _IC_SIISATAREG_H_ 31 1.6 jakllsch 32 1.1 jnemeth /* Silicon Image SATA 2 controller register defines */ 33 1.1 jnemeth 34 1.1 jnemeth #include <sys/cdefs.h> 35 1.1 jnemeth 36 1.1 jnemeth /* the SiI3124 has 4 ports, all others so far have less */ 37 1.1 jnemeth #define SIISATA_MAX_PORTS 4 38 1.3 jakllsch /* all parts have a full complement of slots (so far) */ 39 1.1 jnemeth #define SIISATA_MAX_SLOTS 31 40 1.1 jnemeth 41 1.1 jnemeth /* structures */ 42 1.1 jnemeth 43 1.1 jnemeth /* Scatter/Gather Entry */ 44 1.1 jnemeth struct siisata_sge { 45 1.1 jnemeth #if 0 46 1.1 jnemeth uint32_t sge_dal; /* data address low */ 47 1.1 jnemeth uint32_t sge_dah; /* " " high */ 48 1.1 jnemeth #else 49 1.1 jnemeth uint64_t sge_da; 50 1.1 jnemeth #endif 51 1.1 jnemeth uint32_t sge_dc; /* data count (bytes) */ 52 1.1 jnemeth uint32_t sge_flags; /* */ 53 1.1 jnemeth #define SGE_FLAG_TRM __BIT(31) 54 1.1 jnemeth #define SGE_FLAG_LNK __BIT(30) 55 1.1 jnemeth #define SGE_FLAG_DRD __BIT(29) 56 1.1 jnemeth #define SGE_FLAG_XCF __BIT(28) 57 1.7 jakllsch } __packed __aligned(8); 58 1.1 jnemeth 59 1.1 jnemeth /* Scatter/Gather Table */ 60 1.1 jnemeth /* must be aligned to 64-bit boundary */ 61 1.1 jnemeth struct siisata_sgt { 62 1.1 jnemeth struct siisata_sge sgt_sge[4]; 63 1.7 jakllsch } __packed __aligned(8); 64 1.1 jnemeth 65 1.1 jnemeth /* Port Request Block */ 66 1.1 jnemeth struct siisata_prb { 67 1.1 jnemeth uint16_t prb_control; /* Control Field */ 68 1.1 jnemeth #define PRB_CF_PROTOCOL_OVERRIDE __BIT(0) 69 1.1 jnemeth #define PRB_CF_RETRANSMIT __BIT(1) 70 1.1 jnemeth #define PRB_CF_EXTERNAL_COMMAND __BIT(2) 71 1.1 jnemeth #define PRB_CF_RECEIVE __BIT(3) 72 1.1 jnemeth #define PRB_CF_PACKET_READ __BIT(4) 73 1.1 jnemeth #define PRB_CF_PACKET_WRITE __BIT(5) 74 1.1 jnemeth #define PRB_CF_INTERRUPT_MASK __BIT(6) 75 1.1 jnemeth #define PRB_CF_SOFT_RESET __BIT(7) 76 1.1 jnemeth uint16_t prb_protocol_override; 77 1.1 jnemeth #define PRB_PO_PACKET __BIT(0) 78 1.1 jnemeth #define PRB_PO_LCQ __BIT(1) 79 1.1 jnemeth #define PRB_PO_NCQ __BIT(2) 80 1.1 jnemeth #define PRB_PO_READ __BIT(3) 81 1.1 jnemeth #define PRB_PO_WRITE __BIT(4) 82 1.1 jnemeth #define PRB_PO_TRANSPARENT __BIT(5) 83 1.1 jnemeth uint32_t prb_transfer_count; 84 1.1 jnemeth uint8_t prb_fis[20]; 85 1.1 jnemeth uint32_t prb_reserved_0x1C; /* "must be zero" */ 86 1.1 jnemeth /* First SGE in PRB is always reserved for ATAPI in this implementation. */ 87 1.1 jnemeth uint8_t prb_atapi[16]; /* zero for non-ATAPI */ 88 1.1 jnemeth struct siisata_sge prb_sge[1]; /* extended to NSGE */ 89 1.7 jakllsch } __packed __aligned(8); 90 1.1 jnemeth 91 1.1 jnemeth 92 1.1 jnemeth #define SIISATA_NSGE ((MAXPHYS/PAGE_SIZE) + 1) 93 1.1 jnemeth #define SIISATA_CMD_ALIGN 0x7f 94 1.1 jnemeth #define SIISATA_CMD_SIZE \ 95 1.1 jnemeth ( ( sizeof(struct siisata_prb) + (SIISATA_NSGE - 1) * sizeof(struct siisata_sge) + SIISATA_CMD_ALIGN ) & ~SIISATA_CMD_ALIGN ) 96 1.1 jnemeth 97 1.1 jnemeth /* PCI stuff */ 98 1.1 jnemeth #define SIISATA_PCI_BAR0 0x10 99 1.1 jnemeth #define SIISATA_PCI_BAR1 0x18 100 1.1 jnemeth #define SIISATA_PCI_BAR2 0x20 101 1.1 jnemeth 102 1.5 kiyohara /* Cardbus stuff */ 103 1.5 kiyohara #define SIISATA_CARDBUS_BAR0 SIISATA_PCI_BAR0 104 1.5 kiyohara #define SIISATA_CARDBUS_BAR1 SIISATA_PCI_BAR1 105 1.5 kiyohara #define SIISATA_CARDBUS_BAR2 SIISATA_PCI_BAR2 106 1.5 kiyohara 107 1.1 jnemeth /* BAR 0 */ 108 1.1 jnemeth 109 1.1 jnemeth /* port n slot status */ 110 1.1 jnemeth #define GR_PXSS(n) (n*4) 111 1.1 jnemeth /* global control */ 112 1.1 jnemeth #define GR_GC 0x40 113 1.1 jnemeth /* global interrupt status */ 114 1.1 jnemeth #define GR_GIS 0x44 115 1.1 jnemeth /* phy config - don't touch */ 116 1.1 jnemeth #define GR_PHYC 0x48 117 1.1 jnemeth /* BIST */ 118 1.1 jnemeth #define GR_BIST_CONTROL 0x50 119 1.1 jnemeth #define GR_BIST_PATTERN 0x54 120 1.1 jnemeth #define GR_BIST_STATUS 0x58 121 1.1 jnemeth /* I2C SiI3132 */ 122 1.1 jnemeth #define GR_SII3132_IICCONTROL 0x60 123 1.1 jnemeth #define GR_SII3132_IICSTATUS 0x64 124 1.1 jnemeth #define GR_SII3132_IICSLAVEADDR 0x68 125 1.1 jnemeth #define GR_SII3132_IICDATA 0x6c 126 1.1 jnemeth /* Flash */ 127 1.1 jnemeth #define GR_FLSHADDR 0x70 128 1.1 jnemeth #define GR_FLSHDATA 0x74 129 1.1 jnemeth /* I2C SiI3124 */ 130 1.1 jnemeth #define GR_SII3124_IICADDR 0x78 131 1.1 jnemeth #define GR_SII3124_IICDATA 0x7c 132 1.1 jnemeth 133 1.1 jnemeth 134 1.1 jnemeth /* GR_GC bits */ 135 1.1 jnemeth #define GR_GC_GLBLRST __BIT(31) 136 1.1 jnemeth #define GR_GC_MSIACK __BIT(30) 137 1.1 jnemeth #define GR_GC_I2CINTEN __BIT(29) 138 1.1 jnemeth #define GR_GC_PERRRPTDSBL __BIT(28) 139 1.1 jnemeth #define GR_GC_3GBPS __BIT(24) 140 1.1 jnemeth #define GR_GC_REQ64 __BIT(20) 141 1.1 jnemeth #define GR_GC_DEVSEL __BIT(19) 142 1.1 jnemeth #define GR_GC_STOP __BIT(18) 143 1.1 jnemeth #define GR_GC_TRDY __BIT(17) 144 1.8 jakllsch #define GR_GC_M66EN __BIT(16) 145 1.1 jnemeth #define GR_GC_PXIE_MASK __BITS(SIISATA_MAX_PORTS - 1, 0) 146 1.1 jnemeth #define GR_GC_PXIE(n) __SHIFTIN(__BIT(n), GR_GC_PXIE_MASK) 147 1.1 jnemeth 148 1.1 jnemeth /* GR_GIS bits */ 149 1.1 jnemeth #define GR_GIS_I2C __BIT(29) 150 1.1 jnemeth #define GR_GIS_PXIS_MASK __BITS(SIISATA_MAX_PORTS - 1, 0) 151 1.1 jnemeth #define GR_GIS_PXIS(n) __SHIFTIN(__BIT(n), GR_GIS_PXIS_MASK) 152 1.1 jnemeth 153 1.1 jnemeth 154 1.1 jnemeth /* BAR 1 */ 155 1.1 jnemeth 156 1.1 jnemeth /* hmm, this could use a better name */ 157 1.1 jnemeth #define PR_PORT_SIZE 0x2000 158 1.1 jnemeth #define PR_SLOT_SIZE 0x80 159 1.1 jnemeth /* get the register by port number and offset */ 160 1.1 jnemeth #define PRO(p) (PR_PORT_SIZE * p) 161 1.1 jnemeth #define PRX(p,r) (PRO(p) + r) 162 1.1 jnemeth #define PRSX(p,s,o) (PRX(p, PR_SLOT_SIZE * s + o)) 163 1.1 jnemeth 164 1.11 dholland #define PRSO_RTC 0x04 /* received transfer count */ 165 1.1 jnemeth #define PRSO_FIS 0x08 /* base of FIS */ 166 1.1 jnemeth 167 1.10 jdolecek #define PRO_PMPSTS(i) (0x0f80 + i * 8) 168 1.10 jdolecek #define PRO_PMPQACT(i) (0x0f80 + i * 8 + 4) 169 1.1 jnemeth #define PRO_PCS 0x1000 /* (write) port control set */ 170 1.1 jnemeth #define PRO_PS PRO_PCS /* (read) port status */ 171 1.1 jnemeth #define PRO_PCC 0x1004 /* port control clear */ 172 1.1 jnemeth #define PRO_PIS 0x1008 /* port interrupt status */ 173 1.1 jnemeth #define PRO_PIES 0x1010 /* port interrupt enable set */ 174 1.1 jnemeth #define PRO_PIEC 0x1014 /* port interrupt enable clear */ 175 1.1 jnemeth #define PRO_32BAUA 0x101c /* 32-bit activation upper address */ 176 1.1 jnemeth #define PRO_PCEF 0x1020 /* port command execution fifo */ 177 1.1 jnemeth #define PRO_PCE 0x1024 /* port command error */ 178 1.1 jnemeth #define PRO_PFISC 0x1028 /* port FIS config */ 179 1.12 andvar #define PRO_PCIRFIFOT 0x102c /* pci request fifo threshold */ 180 1.1 jnemeth #define PRO_P8B10BDEC 0x1040 /* port 8B/10B decode error counter */ 181 1.1 jnemeth #define PRO_PCRCEC 0x1044 /* port crc error count */ 182 1.1 jnemeth #define PRO_PHEC 0x1048 /* port handshake error count */ 183 1.1 jnemeth #define PRO_PPHYC 0x1050 /* phy config */ 184 1.1 jnemeth #define PRO_PSS 0x1800 /* port slot status */ 185 1.1 jnemeth /* technically this is a shadow of the CAR */ 186 1.10 jdolecek #define PRO_CAR 0x1c00 /* command activation register */ 187 1.1 jnemeth 188 1.10 jdolecek #define PRO_CARX(p,s) (PRX(p, PRO_CAR) + (s) * sizeof(uint64_t)) 189 1.1 jnemeth 190 1.1 jnemeth #define PRO_PCR 0x1e04 /* port context register */ 191 1.10 jdolecek #define PRO_PCR_SLOT(x) (((x) & __BITS(4, 0)) >> 0) /* Slot */ 192 1.10 jdolecek #define PRO_PCR_PMP(x) (((x) & __BITS(8, 5)) >> 5) /* PM Port */ 193 1.1 jnemeth #define PRO_SCONTROL 0x1f00 /* SControl */ 194 1.1 jnemeth #define PRO_SSTATUS 0x1f04 /* SStatus */ 195 1.1 jnemeth #define PRO_SERROR 0x1f08 /* SError */ 196 1.1 jnemeth #define PRO_SACTIVE 0x1f0c /* SActive */ 197 1.1 jnemeth 198 1.1 jnemeth 199 1.1 jnemeth /* Port Command Error */ 200 1.1 jnemeth #define PR_PCE_DEVICEERROR 1 201 1.1 jnemeth #define PR_PCE_SDBERROR 2 202 1.1 jnemeth #define PR_PCE_DATAFISERROR 3 203 1.1 jnemeth #define PR_PCE_SENDFISERROR 4 204 1.1 jnemeth #define PR_PCE_INCONSISTENTSTATE 5 205 1.1 jnemeth #define PR_PCE_DIRECTIONERROR 6 206 1.1 jnemeth #define PR_PCE_UNDERRUNERROR 7 207 1.1 jnemeth #define PR_PCE_OVERRUNERROR 8 208 1.1 jnemeth #define PR_PCE_LINKFIFOOVERRUN 9 209 1.1 jnemeth #define PR_PCE_PACKETPROTOCOLERROR 11 210 1.1 jnemeth #define PR_PCE_PLDSGTERRORBOUNDARY 16 211 1.1 jnemeth #define PR_PCE_PLDSGTERRORTARGETABORT 17 212 1.1 jnemeth #define PR_PCE_PLDSGTERRORMASTERABORT 18 213 1.1 jnemeth #define PR_PCE_PLDSGTERRORPCIPERR 19 214 1.1 jnemeth #define PR_PCE_PLDCMDERRORBOUNDARY 24 215 1.1 jnemeth #define PR_PCE_PLDCMDERRORTARGETABORT 25 216 1.1 jnemeth #define PR_PCE_PLDCMDERRORMASTERABORT 26 217 1.1 jnemeth #define PR_PCE_PLDCMDERRORPCIPERR 27 218 1.1 jnemeth #define PR_PCE_PSDERRORTARGETABORT 33 219 1.1 jnemeth #define PR_PCE_PSDERRORMASTERABORT 34 220 1.1 jnemeth #define PR_PCE_PSDERRORPCIPERR 35 221 1.1 jnemeth #define PR_PCE_SENDSERVICEERROROR 36 222 1.1 jnemeth 223 1.1 jnemeth 224 1.1 jnemeth #define PR_PIS_UNMASKED_SHIFT 16 225 1.1 jnemeth #define PR_PIS_CMDCMPL __BIT(0) /* command completion */ 226 1.1 jnemeth #define PR_PIS_CMDERRR __BIT(1) /* command error */ 227 1.1 jnemeth #define PR_PIS_PRTRDY __BIT(2) /* port ready */ 228 1.1 jnemeth #define PR_PIS_PMCHNG __BIT(3) /* power management state change */ 229 1.1 jnemeth #define PR_PIS_PHYRDYCHG __BIT(4) 230 1.1 jnemeth #define PR_PIS_COMWAKE __BIT(5) 231 1.1 jnemeth #define PR_PIS_UNRECFIS __BIT(6) 232 1.1 jnemeth #define PR_PIS_DEVEXCHG __BIT(7) 233 1.1 jnemeth #define PR_PIS_8B10BDET __BIT(8) 234 1.1 jnemeth #define PR_PIS_CRCET __BIT(9) 235 1.1 jnemeth #define PR_PIS_HET __BIT(10) 236 1.1 jnemeth #define PR_PIS_SDBN __BIT(11) 237 1.1 jnemeth 238 1.1 jnemeth #define PR_PC_PORT_RESET __BIT(0) 239 1.1 jnemeth #define PR_PC_DEVICE_RESET __BIT(1) 240 1.1 jnemeth #define PR_PC_PORT_INITIALIZE __BIT(2) 241 1.1 jnemeth #define PR_PC_INCOR __BIT(3) 242 1.1 jnemeth #define PR_PC_LED_DISABLE __BIT(4) 243 1.1 jnemeth #define PR_PC_PACKET_LENGTH __BIT(5) 244 1.1 jnemeth #define PR_PC_RESUME __BIT(6) 245 1.1 jnemeth #define PR_PC_TXBIST __BIT(7) 246 1.1 jnemeth #define PR_PC_CONT_DISABLE __BIT(8) 247 1.1 jnemeth #define PR_PC_SCRAMBLER_DISABLE __BIT(9) 248 1.1 jnemeth #define PR_PC_32BA __BIT(10) 249 1.1 jnemeth #define PR_PC_INTERLOCK_REJECT __BIT(11) 250 1.1 jnemeth #define PR_PC_INTERLOCK_ACCEPT __BIT(12) 251 1.1 jnemeth #define PR_PC_PMP_ENABLE __BIT(13) 252 1.1 jnemeth #define PR_PC_AIA __BIT(14) 253 1.1 jnemeth #define PR_PC_LED_ON __BIT(15) 254 1.9 jakllsch #define PR_PS_ACTIVE_SLOT_MASK __BITS(20,16) 255 1.9 jakllsch #define PR_PS_ACTIVE_SLOT(x) __SHIFTOUT((x), PR_PS_ACTIVE_SLOT_MASK) 256 1.1 jnemeth #define PR_PC_OOB_BYPASS __BIT(25) 257 1.1 jnemeth #define PR_PS_PORT_READY __BIT(31) 258 1.1 jnemeth 259 1.1 jnemeth #define PR_PSS_ATTENTION __BIT(31) 260 1.1 jnemeth #define PR_PSS_SLOT_MASK __BITS(30, 0) 261 1.1 jnemeth #define PR_PXSS(n) __SHIFTIN(__BIT(n), PR_PSS_SLOT_MASK) 262 1.6 jakllsch 263 1.6 jakllsch #endif /* !_IC_SIISATAREG_H_ */ 264