xref: /openbsd-src/sys/dev/ic/silireg.h (revision 61e87b287a539c46ee129ad6d615d9c8e7dcd1ae)
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