Home | History | Annotate | Line # | Download | only in ic
siisatareg.h revision 1.11.22.1
      1  1.11.22.1   thorpej /* $NetBSD: siisatareg.h,v 1.11.22.1 2021/08/01 22:42:23 thorpej 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.11.22.1   thorpej #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