1*61e87b28Sderaadt /* $OpenBSD: silireg.h,v 1.22 2013/11/26 20:33:16 deraadt Exp $ */ 2298da292Sdlg 3298da292Sdlg /* 4298da292Sdlg * Copyright (c) 2007 David Gwynne <dlg@openbsd.org> 54d02f564Sdrahn * Copyright (c) 2010 Conformal Systems LLC <info@conformal.com> 64d02f564Sdrahn * Copyright (c) 2010 Jonathan Matthew <jonathan@d14n.org> 7298da292Sdlg * 8298da292Sdlg * Permission to use, copy, modify, and distribute this software for any 9298da292Sdlg * purpose with or without fee is hereby granted, provided that the above 10298da292Sdlg * copyright notice and this permission notice appear in all copies. 11298da292Sdlg * 12298da292Sdlg * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 13298da292Sdlg * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 14298da292Sdlg * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 15298da292Sdlg * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 16298da292Sdlg * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 17298da292Sdlg * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 18298da292Sdlg * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 19298da292Sdlg */ 20298da292Sdlg 21376a756fSdlg /* PCI Registers */ 22376a756fSdlg #define SILI_PCI_BAR_GLOBAL 0x10 /* Global Registers address */ 23703e294eSdlg #define SILI_PCI_BAR_PORT 0x18 /* Port Registers address */ 24703e294eSdlg #define SILI_PCI_BAR_INDIRECT 0x20 /* Indirect IO Registers address */ 252b384e17Sdlg 26376a756fSdlg /* Global Registers */ 272b384e17Sdlg #define SILI_REG_PORT0_STATUS 0x00 /* Port 0 Slot Status */ 282b384e17Sdlg #define SILI_REG_PORT1_STATUS 0x04 /* Port 1 Slot Status */ 292b384e17Sdlg #define SILI_REG_PORT2_STATUS 0x08 /* Port 2 Slot Status */ 302b384e17Sdlg #define SILI_REG_PORT3_STATUS 0x0c /* Port 3 Slot Status */ 312b384e17Sdlg #define SILI_REG_GC 0x40 /* Global Control */ 3240702054Sdlg #define SILI_REG_GC_GR (1<<31) /* Global Reset */ 3340702054Sdlg #define SILI_REG_GC_MSIACK (1<<30) /* MSI Acknowledge */ 3440702054Sdlg #define SILI_REG_GC_I2CINT (1<<29) /* I2C Interrupt Enable */ 3540702054Sdlg #define SILI_REG_GC_PERRDIS (1<<28) /* PCI Error Report Disable */ 3640702054Sdlg #define SILI_REG_GC_REQ64 (1<<20) /* latched PCI REQ64 */ 3740702054Sdlg #define SILI_REG_GC_DEVSEL (1<<19) /* latched PCI DEVSEL */ 3840702054Sdlg #define SILI_REG_GC_STOP (1<<18) /* latched PCI STOP */ 3940702054Sdlg #define SILI_REG_GC_TRDY (1<<17) /* latched PCI TRDY */ 4040702054Sdlg #define SILI_REG_GC_M66EN (1<<16) /* M66EN PCI bus signal */ 4140702054Sdlg #define SILI_REG_GC_PIE_MASK 0x0f 4240702054Sdlg #define SILI_FMT_GC "\020" "\040GR" "\037MSIACK" "\036I2CINT" \ 4340702054Sdlg "\035PERRDIS" "\025REQ64" "\024DEVSEL" \ 4440702054Sdlg "\023STOP" "\022TRDY" "\021M66EN" \ 4540702054Sdlg "\004P3IE" "\003P2IE" "\002P1IE" "\001P0IE" 463e771b35Spascoe #define SILI_REG_GIS 0x44 /* Global Interrupt Status */ 4706bdc393Spascoe #define SILI_REG_GIS_I2C (1 << 29) 4806bdc393Spascoe #define SILI_REG_GIS_PIS_MASK 0x0f 492b384e17Sdlg #define SILI_REG_PHYCONF 0x48 /* PHY Configuration */ 502b384e17Sdlg #define SILI_REG_BISTCTL 0x50 /* BIST Control */ 512b384e17Sdlg #define SILI_REG_BISTPATTERN 0x54 /* BIST Pattern */ 522b384e17Sdlg #define SILI_REG_BISTSTAT 0x58 /* BIST Status */ 532b384e17Sdlg #define SILI_REG_FLASHADDR 0x70 /* Flash Address */ 542b384e17Sdlg #define SILI_REG_FLASHDATA 0x74 /* Flash Memory Data / GPIO Control */ 552b384e17Sdlg #define SILI_REG_GPIOCTL SILI_REG_FLASHDATA 562b384e17Sdlg #define SILI_REG_IICADDR 0x78 /* I2C Address */ 572b384e17Sdlg #define SILI_REG_IIC 0x7c /* I2C Data / Control */ 58376a756fSdlg 5985aa5668Sdlg #define SILI_PORT_SIZE 0x2000 6085aa5668Sdlg #define SILI_PORT_OFFSET(_p) ((_p) * SILI_PORT_SIZE) 6185aa5668Sdlg 62376a756fSdlg /* Port Registers */ 63376a756fSdlg #define SILI_PREG_LRAM 0x0000 /* Port LRAM */ 64fbe621a1Sdlg #define SILI_PREG_SLOT_WIDTH 0x80 65fbe621a1Sdlg #define SILI_PREG_SLOT(_s) (SILI_PREG_LRAM + (_s) * SILI_PREG_SLOT_WIDTH) 6606bdc393Spascoe #define SILI_PREG_RX_COUNT(_s) (SILI_PREG_SLOT(_s) + 0x04) 679a0811ecSdlg #define SILI_PREG_SIG_HI(_s) (SILI_PREG_SLOT(_s) + 0x0c) 689a0811ecSdlg #define SILI_PREG_SIG_HI_SHIFT 8 699a0811ecSdlg #define SILI_PREG_SIG_LO(_s) (SILI_PREG_SLOT(_s) + 0x14) 709a0811ecSdlg #define SILI_PREG_SIG_LO_MASK 0xff 714d02f564Sdrahn 724d02f564Sdrahn #define SILI_PREG_PMP_BASE 0xF80 /* PMP Device Status/QActive Registers */ 734d02f564Sdrahn #define SILI_PREG_PMP_STATUS(_p) (SILI_PREG_PMP_BASE + (_p * 8)) 744d02f564Sdrahn #define SILI_PREG_PMP_QACTIVE(_p) (SILI_PREG_PMP_BASE + 4 + (_p * 8)) 754d02f564Sdrahn #define SILI_PREG_PMP_STATUS_PIO 0x000000FF 764d02f564Sdrahn #define SILI_PREG_PMP_STATUS_ACTIVE 0x00000F00 774d02f564Sdrahn #define SILI_PREG_PMP_STATUS_BUSY (1 << 13) 784d02f564Sdrahn #define SILI_PREG_PMP_STATUS_NCQ (1 << 14) 794d02f564Sdrahn #define SILI_PREG_PMP_STATUS_LEGACY_Q (1 << 15) 804d02f564Sdrahn #define SILI_PREG_PMP_STATUS_PENDING (1 << 16) 814d02f564Sdrahn 82376a756fSdlg #define SILI_PREG_PCS 0x1000 /* Port Control Set / Status */ 8306bdc393Spascoe #define SILI_PREG_PCS_PORTRDY (1<<31) /* Port Ready */ 844a5ff9ecSdlg #define SILI_PREG_PCS_OOBB (1<<25) /* OOB Bypass */ 8506bdc393Spascoe #define SILI_PREG_PCS_ACTIVE(_x) (((_x)>>16) & 0x1f) /* Active Slot */ 864a5ff9ecSdlg #define SILI_PREG_PCS_LED_ON (1<<15) /* LED On */ 874a5ff9ecSdlg #define SILI_PREG_PCS_AIA (1<<14) /* Auto Interlock Accept */ 884a5ff9ecSdlg #define SILI_PREG_PCS_PMEN (1<<13) /* Port Mult Enable */ 894a5ff9ecSdlg #define SILI_PREG_PCS_IA (1<<12) /* Interlock Accept */ 904a5ff9ecSdlg #define SILI_PREG_PCS_IR (1<<11) /* Interlock Reject */ 914a5ff9ecSdlg #define SILI_PREG_PCS_A32B (1<<10) /* 32-bit Activation */ 924a5ff9ecSdlg #define SILI_PREG_PCS_SD (1<<9) /* Scrambler Disable */ 934a5ff9ecSdlg #define SILI_PREG_PCS_CD (1<<8) /* CONT Disable */ 944a5ff9ecSdlg #define SILI_PREG_PCS_TB (1<<7) /* Transmit BIST */ 954a5ff9ecSdlg #define SILI_PREG_PCS_RESUME (1<<6) /* Resume */ 964a5ff9ecSdlg #define SILI_PREG_PCS_PLEN (1<<5) /* Packet Length */ 974a5ff9ecSdlg #define SILI_PREG_PCS_LEDDISABLE (1<<4) /* LED Disable */ 984a5ff9ecSdlg #define SILI_PREG_PCS_NOINTCLR (1<<3) /* No Intr Clear on Read */ 994a5ff9ecSdlg #define SILI_PREG_PCS_PORTINIT (1<<2) /* Port Initialize */ 1004a5ff9ecSdlg #define SILI_PREG_PCS_DEVRESET (1<<1) /* Device Reset */ 1014a5ff9ecSdlg #define SILI_PREG_PCS_PORTRESET (1<<0) /* Port Reset */ 10202864c60Sdlg #define SILI_PFMT_PCS "\020" "\032OOBB" "\020LED_ON" "\017AIA" \ 10302864c60Sdlg "\016PMEN" "\015IA" "\014IR" "\013A32B" \ 10402864c60Sdlg "\012SD" "\011CD" "\010TB" "\007RESUME" \ 10502864c60Sdlg "\006PLEN" "\005LEDDISABLE" \ 10602864c60Sdlg "\004NOINTCLR" "\003PORTINIT" \ 10702864c60Sdlg "\002PORTINIT" "\001PORTRESET" 108376a756fSdlg #define SILI_PREG_PCC 0x1004 /* Port Control Clear */ 10915af013eSdlg #define SILI_PREG_PCC_OOBB (1<<25) /* OOB Bypass */ 11015af013eSdlg #define SILI_PREG_PCC_LED_ON (1<<15) /* LED On */ 11115af013eSdlg #define SILI_PREG_PCC_AIA (1<<14) /* Auto Interlock Accept */ 11215af013eSdlg #define SILI_PREG_PCC_PMEN (1<<13) /* Port Mult Enable */ 11315af013eSdlg #define SILI_PREG_PCC_IA (1<<12) /* Interlock Accept */ 11415af013eSdlg #define SILI_PREG_PCC_IR (1<<11) /* Interlock Reject */ 11515af013eSdlg #define SILI_PREG_PCC_A32B (1<<10) /* 32-bit Activation */ 11615af013eSdlg #define SILI_PREG_PCC_SD (1<<9) /* Scrambler Disable */ 11715af013eSdlg #define SILI_PREG_PCC_CD (1<<8) /* CONT Disable */ 11815af013eSdlg #define SILI_PREG_PCC_TB (1<<7) /* Transmit BIST */ 11915af013eSdlg #define SILI_PREG_PCC_RESUME (1<<6) /* Resume */ 12015af013eSdlg #define SILI_PREG_PCC_PLEN (1<<5) /* Packet Length */ 12115af013eSdlg #define SILI_PREG_PCC_LEDDISABLE (1<<4) /* LED Disable */ 12215af013eSdlg #define SILI_PREG_PCC_NOINTCLR (1<<3) /* No Intr Clear on Read */ 12315af013eSdlg #define SILI_PREG_PCC_PORTINIT (1<<2) /* Port Initialize */ 12415af013eSdlg #define SILI_PREG_PCC_DEVRESET (1<<1) /* Device Reset */ 12515af013eSdlg #define SILI_PREG_PCC_PORTRESET (1<<0) /* Port Reset */ 126376a756fSdlg #define SILI_PREG_IS 0x1008 /* Interrupt Status */ 12706bdc393Spascoe #define SILI_PREG_IS_SDB (1<<11) /* SDB Notify */ 12806bdc393Spascoe #define SILI_PREG_IS_HANDSHAKE (1<<10) /* Handshake error threshold */ 12906bdc393Spascoe #define SILI_PREG_IS_CRC (1<<9) /* CRC error threshold */ 13006bdc393Spascoe #define SILI_PREG_IS_DEC (1<<8) /* 8b/10b decode error thresh */ 13106bdc393Spascoe #define SILI_PREG_IS_DEVXCHG (1<<7) /* Device Exchanged */ 13206bdc393Spascoe #define SILI_PREG_IS_UNRECFIS (1<<6) /* Unrecognized FIS Type */ 13306bdc393Spascoe #define SILI_PREG_IS_COMWAKE (1<<5) /* ComWake */ 13406bdc393Spascoe #define SILI_PREG_IS_PHYRDYCHG (1<<4) /* Phy Ready Change */ 13506bdc393Spascoe #define SILI_PREG_IS_PMCHG (1<<3) /* Power Mmgt Change */ 13606bdc393Spascoe #define SILI_PREG_IS_PORTRDY (1<<2) /* Port Ready */ 13706bdc393Spascoe #define SILI_PREG_IS_CMDERR (1<<1) /* Command Error */ 13806bdc393Spascoe #define SILI_PREG_IS_CMDCOMP (1<<0) /* Command Completion */ 13906bdc393Spascoe #define SILI_PFMT_IS "\020" "\014SDB" "\013HANDSHAKE" \ 14006bdc393Spascoe "\012CRC" "\011DECODE" \ 14106bdc393Spascoe "\010DEVXCHG" "\007UNRECFIS" \ 14206bdc393Spascoe "\006COMWAKE" "\005PHYRDYCHG" \ 14306bdc393Spascoe "\004PMCHG" "\003PORTRDY" \ 14406bdc393Spascoe "\002CMDERR" "\001CMDCOMP" 14516d7aabcSjsg #define SILI_PREG_IES 0x1010 /* Interrupt Enable Set */ 14616d7aabcSjsg #define SILI_PREG_IEC 0x1014 /* Interrupt Enable Clear */ 14703fd4b56Sdlg #define SILI_PREG_IE_SDB (1<<11) /* SDB Notify */ 14803fd4b56Sdlg #define SILI_PREG_IE_DEVXCHG (1<<7) /* Device Exchange */ 14903fd4b56Sdlg #define SILI_PREG_IE_UNRECFIS (1<<6) /* Unrecognized FIS Type */ 15003fd4b56Sdlg #define SILI_PREG_IE_COMWAKE (1<<5) /* ComWake */ 15103fd4b56Sdlg #define SILI_PREG_IE_PHYRDYCHG (1<<4) /* Phy Ready Change */ 15203fd4b56Sdlg #define SILI_PREG_IE_PMCHG (1<<3) /* Power Mmgt Change */ 15303fd4b56Sdlg #define SILI_PREG_IE_PORTRDY (1<<2) /* Port Ready */ 15403fd4b56Sdlg #define SILI_PREG_IE_CMDERR (1<<1) /* Command Error */ 15503fd4b56Sdlg #define SILI_PREG_IE_CMDCOMP (1<<0) /* Command Completion */ 15606bdc393Spascoe #define SILI_PREG_IE_ALL 0x08ff 157376a756fSdlg #define SILI_PREG_AUA 0x101c /* Activation Upper Address */ 158376a756fSdlg #define SILI_PREG_FIFO 0x1020 /* Command Execution FIFO */ 159376a756fSdlg #define SILI_PREG_CE 0x1024 /* Command Error */ 16006bdc393Spascoe #define SILI_PREG_CE_DEVICEERROR 1 16106bdc393Spascoe #define SILI_PREG_CE_SDBERROR 2 16206bdc393Spascoe #define SILI_PREG_CE_DATAFISERROR 3 163376a756fSdlg #define SILI_PREG_FC 0x1028 /* FIS Configuration */ 164376a756fSdlg #define SILI_PREG_RFT 0x102c /* Request FIFO Threshold */ 165376a756fSdlg #define SILI_PREG_DEC 0x1040 /* 8b/10b Decode Error Counter */ 166376a756fSdlg #define SILI_PREG_CEC 0x1044 /* CRC Error Counter */ 167376a756fSdlg #define SILI_PREG_HEC 0x1048 /* Handshake Error Counter */ 168376a756fSdlg #define SILI_PREG_PHYCONF 0x1050 /* Port PHY Configuration */ 169376a756fSdlg #define SILI_PREG_PSS 0x1800 /* Port Slot Status */ 170*61e87b28Sderaadt #define SILI_PREG_PSS_ATTENTION (1U << 31) 17106bdc393Spascoe #define SILI_PREG_PSS_ALL_SLOTS 0x7fffffff 17259821bd3Sdlg #define SILI_PREG_CAR_LO(_s) (0x1c00 + ((_s) * 0x8)) /* Cmd Activate Reg */ 17359821bd3Sdlg #define SILI_PREG_CAR_HI(_s) (0x1c00 + ((_s) * 0x8) + 0x4) 1744d02f564Sdrahn #define SILI_PREG_CONTEXT 0x1e04 /* Port Context Register */ 1754d02f564Sdrahn #define SILI_PREG_CONTEXT_SLOT_MASK 0x1F 1764d02f564Sdrahn #define SILI_PREG_CONTEXT_PMPORT_MASK 0x0F 1774d02f564Sdrahn #define SILI_PREG_CONTEXT_SLOT_SHIFT 0 1784d02f564Sdrahn #define SILI_PREG_CONTEXT_PMPORT_SHIFT 5 179376a756fSdlg #define SILI_PREG_SCTL 0x1f00 /* SControl */ 1804d02f564Sdrahn #define SILI_PREG_SCTL_PMP 0x000F0000 1814d02f564Sdrahn #define SILI_PREG_SCTL_PMP_SHIFT 16 182376a756fSdlg #define SILI_PREG_SSTS 0x1f04 /* SStatus */ 183376a756fSdlg #define SILI_PREG_SERR 0x1f08 /* SError */ 184376a756fSdlg #define SILI_PREG_SACT 0x1f0c /* SActive */ 1854d02f564Sdrahn #define SILI_PREG_SNOT 0x1f10 /* SNotification */ 1864d02f564Sdrahn 1874d02f564Sdrahn 188376a756fSdlg 189d1a4de97Sdlg 190936f8bb2Sdlg struct sili_sge { 191936f8bb2Sdlg u_int32_t addr_lo; 192936f8bb2Sdlg u_int32_t addr_hi; 193936f8bb2Sdlg u_int32_t data_count; 194936f8bb2Sdlg u_int32_t flags; 195936f8bb2Sdlg #define SILI_SGE_TRM (1<<31) 196936f8bb2Sdlg #define SILI_SGE_LNK (1<<30) 197936f8bb2Sdlg #define SILI_SGE_DRD (1<<29) 198936f8bb2Sdlg #define SILI_SGE_XCF (1<<28) 199936f8bb2Sdlg } __packed; 200936f8bb2Sdlg 20159821bd3Sdlg #define SILI_SGT_SGLLEN 4 20259821bd3Sdlg 203fbe621a1Sdlg struct sili_sgt { 20459821bd3Sdlg struct sili_sge sgl[SILI_SGT_SGLLEN]; 205fbe621a1Sdlg } __packed; 206fbe621a1Sdlg 207fbe621a1Sdlg #define SILI_PRB_PROTOCOL_OVERRIDE (1<<0) 208fbe621a1Sdlg #define SILI_PRB_RETRANSMIT (1<<1) 209fbe621a1Sdlg #define SILI_PRB_EXTERNAL_COMMAND (1<<2) 210fbe621a1Sdlg #define SILI_PRB_RECEIVE (1<<3) 211fbe621a1Sdlg #define SILI_PRB_PACKET_READ (1<<4) 212fbe621a1Sdlg #define SILI_PRB_PACKET_WRITE (1<<5) 213fbe621a1Sdlg #define SILI_PRB_INTERRUPT_MASK (1<<6) 214fbe621a1Sdlg #define SILI_PRB_SOFT_RESET (1<<7) 215fbe621a1Sdlg 21659821bd3Sdlg struct sili_prb { /* this is just a useful template */ 21759821bd3Sdlg u_int16_t control; 21859821bd3Sdlg u_int16_t reserved1; 21959821bd3Sdlg u_int32_t reserved2; 22059821bd3Sdlg 22159821bd3Sdlg u_int8_t fis[ATA_FIS_LENGTH]; 22259821bd3Sdlg 22359821bd3Sdlg u_int32_t reserved3[9]; 22459821bd3Sdlg } __packed; 22559821bd3Sdlg 226936f8bb2Sdlg struct sili_prb_ata { 227936f8bb2Sdlg u_int16_t control; 228936f8bb2Sdlg u_int16_t protocol_override; 229936f8bb2Sdlg u_int32_t rx_count; 230936f8bb2Sdlg 231936f8bb2Sdlg u_int8_t fis[ATA_FIS_LENGTH]; 232936f8bb2Sdlg 233936f8bb2Sdlg u_int32_t reserved; 234936f8bb2Sdlg 235936f8bb2Sdlg struct sili_sge sgl[2]; 236936f8bb2Sdlg } __packed; 237936f8bb2Sdlg 238936f8bb2Sdlg struct sili_prb_packet { 239936f8bb2Sdlg u_int16_t control; 240936f8bb2Sdlg u_int16_t protocol_override; 241936f8bb2Sdlg u_int32_t rx_count; 242936f8bb2Sdlg 243936f8bb2Sdlg u_int8_t fis[ATA_FIS_LENGTH]; 244936f8bb2Sdlg 245936f8bb2Sdlg u_int32_t reserved; 246936f8bb2Sdlg 247936f8bb2Sdlg u_int8_t cdb[16]; 248936f8bb2Sdlg 249936f8bb2Sdlg struct sili_sge sgl[1]; 250936f8bb2Sdlg } __packed; 251936f8bb2Sdlg 252936f8bb2Sdlg struct sili_prb_softreset { 253936f8bb2Sdlg u_int16_t control; 254936f8bb2Sdlg u_int16_t reserved1; 255936f8bb2Sdlg u_int32_t reserved2; 256936f8bb2Sdlg 257936f8bb2Sdlg u_int8_t fis[ATA_FIS_LENGTH]; 258936f8bb2Sdlg 259936f8bb2Sdlg u_int32_t reserved3[9]; 260936f8bb2Sdlg } __packed; 261936f8bb2Sdlg 262fbe621a1Sdlg #define SILI_MAX_CMDS 31 263fbe621a1Sdlg #define SILI_PRB_LENGTH 64 26459821bd3Sdlg #define SILI_PRB_ALIGN 8 265fbe621a1Sdlg #define SILI_SGT_LENGTH 64 266