1 /*        $NetBSD: mvsatareg.h,v 1.5 2022/02/16 22:00:55 andvar Exp $ */
2 /*
3  * Copyright (c) 2008 KIYOHARA Takashi
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
19  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
23  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
24  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25  * POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 #ifndef _MVSATAREG_H_
29 #define _MVSATAREG_H_
30 
31 /*
32  * SATAHC Arbiter Registers
33  */
34 #define SATAHC_REGISTER_SIZE            0x10000
35 #define SATAHC(hc)                      ((hc) * SATAHC_REGISTER_SIZE)
36 
37 #define SATAHC_C              0x000     /* Configuration */
38 #define SATAHC_C_TIMEOUT_MASK           (0xff << 0)
39 #define SATAHC_C_TIMEOUTEN              (1 << 16) /* Timer Enable */
40 #define SATAHC_C_COALDIS(p)             (1 << ((p) + 24))/* Coalescing Disable*/
41 #define SATAHC_RQOP           0x004     /* Request Queue Out-Pointer */
42 #define SATAHC_RQIP           0x008     /* Response Queue In-Pointer */
43 #define SATAHC_RQP_ERPQP(p, x)          (((x) >> ((p) * 8)) & 0x7f)
44 #define SATAHC_ICT            0x00c     /* Interrupt Coalescing Threshold */
45 #define SATAHC_ICT_SAICOALT_MASK        0x000000ff
46 #define SATAHC_ITT            0x010     /* Interrupt Time Threshold */
47 #define SATAHC_ITT_SAITMTH              0x00ffffff
48 #define SATAHC_IC             0x014     /* Interrupt Cause */
49 #define SATAHC_IC_DONE(p)               (1 << (p))          /* SaCrpb/DMA Done */
50 #define SATAHC_IC_SAINTCOAL             (1 << 4)  /* Intr Coalescing */
51 #define SATAHC_IC_SADEVINTERRUPT(p)     (1 << ((p) + 8))/* Device Intr */
52 
53 /*
54  * Physical Registers for Generation I
55  */
56 #define SATAHC_I_R02(p)                 ((p) * 0x100 + 0x108)
57 #define SATAHC_I_PHYCONTROL(p)          ((p) * 0x100 + 0x10c)
58 #define SATAHC_I_LTMODE(p)    ((p) * 0x100 + 0x130)
59 #define SATAHC_I_PHYMODE(p)   ((p) * 0x100 + 0x174)
60 
61 
62 /*
63  * EDMA Registers
64  */
65 #define EDMA_REGISTERS_OFFSET           0x2000
66 #define EDMA_REGISTERS_SIZE             0x2000
67 
68 #define EDMA_CFG              0x000     /* Configuration */
69 #define EDMA_CFG_RESERVED               (0x1f << 0)         /* Queue len ? */
70 #define EDMA_CFG_ESATANATVCMDQUE        (1 << 5)
71 #define EDMA_CFG_ERDBSZ                           (1 << 8)
72 #define EDMA_CFG_EQUE                             (1 << 9)
73 #define EDMA_CFG_ERDBSZEXT              (1 << 11)
74 #define EDMA_CFG_RESERVED2              (1 << 12)
75 #define EDMA_CFG_EWRBUFFERLEN           (1 << 13)
76 #define EDMA_CFG_EDEVERR                (1 << 14)
77 #define EDMA_CFG_EEDMAFBS               (1 << 16)
78 #define EDMA_CFG_ECUTTHROUGHEN                    (1 << 17)
79 #define EDMA_CFG_EEARLYCOMPLETIONEN     (1 << 18)
80 #define EDMA_CFG_EEDMAQUELEN            (1 << 19)
81 #define EDMA_CFG_EHOSTQUEUECACHEEN      (1 << 22)
82 #define EDMA_CFG_EMASKRXPM              (1 << 23)
83 #define EDMA_CFG_RESUMEDIS              (1 << 24)
84 #define EDMA_CFG_EDMAFBS                (1 << 26)
85 #define EDMA_T                          0x004     /* Timer */
86 #define EDMA_IEC              0x008     /* Interrupt Error Cause */
87 #define EDMA_IEM              0x00c     /* Interrupt Error Mask */
88 #define EDMA_IE_EDEVERR                           (1 << 2)  /* EDMA Device Error */
89 #define EDMA_IE_EDEVDIS                           (1 << 3)  /* EDMA Dev Disconn */
90 #define EDMA_IE_EDEVCON                           (1 << 4)  /* EDMA Dev Conn */
91 #define EDMA_IE_SERRINT                           (1 << 5)
92 #define EDMA_IE_ESELFDIS                (1 << 7)  /* EDMA Self Disable */
93 #define EDMA_IE_ETRANSINT               (1 << 8)  /* Transport Layer */
94 #define EDMA_IE_EIORDYERR               (1 << 12) /* EDMA IORdy Error */
95 #   define EDMA_IE_LINKXERR_SATACRC         (1 << 0)        /* SATA CRC error */
96 #   define EDMA_IE_LINKXERR_INTERNALFIFO    (1 << 1)        /* internal FIFO err */
97 #   define EDMA_IE_LINKXERR_LINKLAYERRESET  (1 << 2)
98           /* Link Layer is reset by the reception of SYNC primitive from device */
99 #   define EDMA_IE_LINKXERR_OTHERERRORS     (1 << 3)
100           /*
101            * Link state errors, coding errors, or running disparity errors occur
102            * during FIS reception.
103            */
104 #   define EDMA_IE_LINKTXERR_FISTXABORTED   (1 << 4)        /* FIS Tx is aborted */
105 #define EDMA_IE_LINKCTLRXERR(x)                   ((x) << 13)         /* Link Ctrl Recv Err */
106 #define EDMA_IE_LINKDATARXERR(x)        ((x) << 17)         /* Link Data Recv Err */
107 #define EDMA_IE_LINKCTLTXERR(x)                   ((x) << 21)         /* Link Ctrl Tx Error */
108 #define EDMA_IE_LINKDATATXERR(x)        ((x) << 26)         /* Link Data Tx Error */
109 #define EDMA_IE_TRANSPROTERR            (1 << 31) /* Transport Proto E */
110 #define EDMA_REQQBAH                    0x010     /* Request Queue Base Address High */
111 #define EDMA_REQQIP           0x014     /* Request Queue In-Pointer */
112 #define EDMA_REQQOP           0x018     /* Request Queue Out-Pointer */
113 #define EDMA_REQQP_ERQQP_SHIFT                    5
114 #define EDMA_REQQP_ERQQP_MASK           0x000003e0
115 #define EDMA_REQQP_ERQQBAP_MASK                   0x00000c00
116 #define EDMA_REQQP_ERQQBA_MASK                    0xfffff000
117 #define EDMA_RESQBAH                    0x01c     /* Response Queue Base Address High */
118 #define EDMA_RESQIP           0x020     /* Response Queue In-Pointer */
119 #define EDMA_RESQOP           0x024     /* Response Queue Out-Pointer */
120 #define EDMA_RESQP_ERPQP_SHIFT                    3
121 #define EDMA_RESQP_ERPQP_MASK           0x000000f8
122 #define EDMA_RESQP_ERPQBAP_MASK                   0x00000300
123 #define EDMA_RESQP_ERPQBA_MASK                    0xfffffc00
124 #define EDMA_CMD              0x028     /* Command */
125 #define EDMA_CMD_EENEDMA                (1 << 0)  /* Enable EDMA */
126 #define EDMA_CMD_EDSEDMA                (1 << 1)  /* Disable EDMA */
127 #define EDMA_CMD_EATARST                (1 << 2)  /* ATA Device Reset */
128 #define EDMA_CMD_EEDMAFRZ               (1 << 4)  /* EDMA Freeze */
129 #define EDMA_TC                         0x02c     /* Test Control */
130 #define EDMA_S                          0x030     /* Status */
131 #define EDMA_S_EDEVQUETAG(s)            ((s) & 0x0000001f)
132 #define EDMA_S_EDEVDIR_WRITE            (0 << 5)
133 #define EDMA_S_EDEVDIR_READ             (1 << 5)
134 #define EDMA_S_ECACHEEMPTY              (1 << 6)
135 #define EDMA_S_EDMAIDLE                           (1 << 7)
136 #define EDMA_S_ESTATE(s)                (((s) & 0x0000ff00) >> 8)
137 #define EDMA_S_EIOID(s)                           (((s) & 0x003f0000) >> 16)
138 #define EDMA_IORT             0x034     /* IORdy Timeout */
139 #define EDMA_CDT              0x040     /* Command Delay Threshold */
140 #define EDMA_HC                         0x060     /* Halt Condition */
141 #define EDMA_CQDCQOS(x)                 (0x090 + ((x) << 2)
142                                                   /* NCQ Done/TCQ Outstanding Status */
143 
144 /*
145  * Shadow Register Block Registers
146  */
147 #define SHADOW_REG_BLOCK_OFFSET         0x100
148 #define SHADOW_REG_BLOCK_SIZE 0x100
149 
150 #define SRB_PIOD              0x000     /* PIO Data */
151 #define SRB_FE                          0x004     /* Feature/Error */
152 #define SRB_SC                          0x008     /* Sector Count */
153 #define SRB_LBAL              0x00c     /* LBA Low */
154 #define SRB_LBAM              0x010     /* LBA Mid */
155 #define SRB_LBAH              0x014     /* LBA High */
156 #define SRB_H                           0x018     /* Head */
157 #define SRB_CS                          0x01c     /* Command/Status */
158 #define SRB_CAS                         0x020     /* Control/Alternate Status */
159 
160 /*
161  * Basic DMA Registers
162  *   Does support for this registers only 88Sx6xxx?
163  */
164 #define DMA_C                           0x224     /* Basic DMA Command */
165 #define DMA_C_START                     (1 << 0)
166 #define DMA_C_READ                      (1 << 3)
167 #define DMA_C_DREGIONVALID              (1 << 8)
168 #define DMA_C_DREGIONLAST               (1 << 9)
169 #define DMA_C_CONTFROMPREV              (1 << 10)
170 #define DMA_C_DRBC(n)                             (((n) & 0xffff) << 16)
171 #define DMA_S                           0x228     /* Basic DMA Status */
172 #define DMA_DTLBA             0x22c     /* Descriptor Table Low Base Address */
173 #define DMA_DTLBA_MASK                            0xfffffff0
174 #define DMA_DTHBA             0x230     /* Descriptor Table High Base Address */
175 #define DMA_DRLA              0x234     /* Data Region Low Address */
176 #define DMA_DRHA              0x238     /* Data Region High Address */
177 
178 /*
179  * Serial-ATA Registers
180  */
181 #define SATA_SS                         0x300     /* SStatus */
182 #define SATA_SE                         0x304     /* SError */
183 #define SATA_SEIM             0x340     /* SError Interrupt Mask */
184 #define SATA_SC                         0x308     /* SControl */
185 #define SATA_LTM              0x30c     /* LTMode */
186 #define SATA_PHYM3            0x310     /* PHY Mode 3 */
187 #define SATA_PHYM4            0x314     /* PHY Mode 4 */
188 #define SATA_PHYM1            0x32c     /* PHY Mode 1 */
189 #define SATA_PHYM2            0x330     /* PHY Mode 2 */
190 #define SATA_BISTC            0x334     /* BIST Control */
191 #define SATA_BISTDW1                    0x338     /* BIST DW1 */
192 #define SATA_BISTDW2                    0x33c     /* BIST DW2 */
193 #define SATA_SATAICFG                   0x050     /* Serial-ATA Interface Configuration */
194 #define SATA_SATAICFG_REFCLKCNF_20MHZ   (0 << 0)
195 #define SATA_SATAICFG_REFCLKCNF_25MHZ   (1 << 0)
196 #define SATA_SATAICFG_REFCLKCNF_30MHZ   (2 << 0)
197 #define SATA_SATAICFG_REFCLKCNF_40MHZ   (3 << 0)
198 #define SATA_SATAICFG_REFCLKCNF_MASK    (3 << 0)
199 #define SATA_SATAICFG_REFCLKDIV_1       (0 << 2)
200 #define SATA_SATAICFG_REFCLKDIV_2       (1 << 2)  /* Used 20 or 25MHz */
201 #define SATA_SATAICFG_REFCLKDIV_4       (2 << 2)  /* Used 40MHz */
202 #define SATA_SATAICFG_REFCLKDIV_3       (3 << 2)  /* Used 30MHz */
203 #define SATA_SATAICFG_REFCLKDIV_MASK    (3 << 2)
204 #define SATA_SATAICFG_REFCLKFEEDDIV_50  (0 << 4)  /* or 100, when Gen2En is 1 */
205 #define SATA_SATAICFG_REFCLKFEEDDIV_60  (1 << 4)  /* or 120. Used 25MHz */
206 #define SATA_SATAICFG_REFCLKFEEDDIV_75  (2 << 4)  /* or 150. Used 20MHz */
207 #define SATA_SATAICFG_REFCLKFEEDDIV_90  (3 << 4)  /* or 180 */
208 #define SATA_SATAICFG_REFCLKFEEDDIV_MASK (3 << 4)
209 #define SATA_SATAICFG_PHYSSCEN                    (1 << 6)
210 #define SATA_SATAICFG_GEN2EN            (1 << 7)
211 #define SATA_SATAICFG_COMMEN            (1 << 8)
212 #define SATA_SATAICFG_PHYSHUTDOWN       (1 << 9)
213 #define SATA_SATAICFG_TARGETMODE        (1 << 10) /* 1 = Initiator */
214 #define SATA_SATAICFG_COMCHANNEL        (1 << 11)
215 #define SATA_SATAICFG_IGNOREBSY                   (1 << 24)
216 #define SATA_SATAICFG_LINKRSTEN                   (1 << 25)
217 #define SATA_SATAICFG_CMDRETXDS                   (1 << 26)
218 #define SATA_SATAICTL                   0x344     /* Serial-ATA Interface Control */
219 #define SATA_SATAITC                    0x348     /* Serial-ATA Interface Test Control */
220 #define SATA_SATAIS           0x34c     /* Serial-ATA Interface Status */
221 #define SATA_VU                         0x35c     /* Vendor Unique */
222 #define SATA_FISC             0x360     /* FIS Configuration */
223 #define SATA_FISC_FISWAIT4RDYEN_B0      (1 << 0) /* Device to Host FIS */
224 #define SATA_FISC_FISWAIT4RDYEN_B1      (1 << 1) /* SDB FIS rcv with <N>bit 0 */
225 #define SATA_FISC_FISWAIT4RDYEN_B2      (1 << 2) /* DMA Activate FIS */
226 #define SATA_FISC_FISWAIT4RDYEN_B3      (1 << 3) /* DMA Setup FIS */
227 #define SATA_FISC_FISWAIT4RDYEN_B4      (1 << 4) /* Data FIS first DW */
228 #define SATA_FISC_FISWAIT4RDYEN_B5      (1 << 5) /* Data FIS entire FIS */
229 #define SATA_FISC_FISWAIT4HOSTRDYEN_B0  (1 << 8)
230                                         /* Device to Host FIS with <ERR> or <DF> */
231 #define SATA_FISC_FISWAIT4HOSTRDYEN_B1  (1 << 9) /* SDB FIS rcv with <N>bit */
232 #define SATA_FISC_FISWAIT4HOSTRDYEN_B2  (1 << 10) /* SDB FIS rcv with <ERR> */
233 #define SATA_FISC_FISWAIT4HOSTRDYEN_B3  (1 << 11) /* BIST Acivate FIS */
234 #define SATA_FISC_FISWAIT4HOSTRDYEN_B4  (1 << 12) /* PIO Setup FIS */
235 #define SATA_FISC_FISWAIT4HOSTRDYEN_B5  (1 << 13) /* Data FIS with Link error */
236 #define SATA_FISC_FISWAIT4HOSTRDYEN_B6  (1 << 14) /* Unrecognized FIS type */
237 #define SATA_FISC_FISWAIT4HOSTRDYEN_B7  (1 << 15) /* Any FIS */
238 #define SATA_FISC_FISDMAACTIVATESYNCRESP (1 << 16)
239 #define SATA_FISC_FISUNRECTYPECONT      (1 << 17)
240 #define SATA_FISIC            0x364     /* FIS Interrupt Cause */
241 #define SATA_FISIM            0x368     /* FIS Interrupt Mask */
242 #define SATA_FISDW0           0x370     /* FIS DW0 */
243 #define SATA_FISDW1           0x374     /* FIS DW1 */
244 #define SATA_FISDW2           0x378     /* FIS DW2 */
245 #define SATA_FISDW3           0x37c     /* FIS DW3 */
246 #define SATA_FISDW4           0x380     /* FIS DW4 */
247 #define SATA_FISDW5           0x384     /* FIS DW5 */
248 #define SATA_FISDW6           0x388     /* FIS DW6 */
249 
250 
251 /* EDMA Command Request Block (CRQB) Data */
252 struct crqb {
253           uint32_t cprdbl;    /* cPRD Descriptor Table Base Low Address */
254           uint32_t cprdbh;    /* cPRD Descriptor Table Base High Address */
255           uint16_t ctrlflg;   /* Control Flags */
256           uint16_t atacommand[11];
257 } __packed __aligned(8);
258 
259 struct crqb_gen2e {
260           uint32_t cprdbl;    /* cPRD Descriptor Table Base Low Address */
261           uint32_t cprdbh;    /* cPRD Descriptor Table Base High Address */
262           uint32_t ctrlflg;   /* Control Flags */
263           uint32_t drbc;                /* Data Region Byte Count */
264           uint8_t atacommand[16];
265 } __packed __aligned(8);
266 
267 
268 #define CRQB_CRQBL_EPRD_MASK  0xfffffff0
269 #define CRQB_CRQBL_SDR_MASK   0xfffffffe          /* Single data region mask */
270 
271 /* Control Flags */
272 #define CRQB_CDIR_WRITE                 (0 << 0)
273 #define CRQB_CDIR_READ                  (1 << 0)
274 #define CRQB_CDEVICEQUETAG(x) (((x) & 0x1f) << 1) /* CRQB Dev Queue Tag */
275 #define CRQB_CHOSTQUETAG(x)   (((x) & 0x7f) << 1) /* CRQB Host Q Tag */
276 #define CRQB_CPMPORT(x)                 (((x) & 0xf) << 12) /* PM Port Transmit */
277 #define CRQB_CPRDMODE_EPRD    (0 << 16)           /* PRD table */
278 #define CRQB_CPRDMODE_SDR     (1 << 16)           /* Single data region */
279 #define CRQB_CHOSTQUETAG_GEN2(x) (((x) & 0x7f) << 17)       /* CRQB Host Q Tag G2 */
280 
281 /* Data Region Byte Count */
282 #define CRQB_CDRBC(x)                   (((x) & 0xfffe) << 0)
283 
284 #define CRQB_ATACOMMAND(reg, val) \
285                                         ((reg << 8) | (val & 0xff))
286 #define CRQB_ATACOMMAND_LAST  (1 << 15)
287 #define CRQB_ATACOMMAND_REG(reg)        (((reg) >> 2) + 0x10)
288 #define CRQB_ATACOMMAND_FEATURES        CRQB_ATACOMMAND_REG(SRB_FE)
289 #define CRQB_ATACOMMAND_SECTORCOUNT     CRQB_ATACOMMAND_REG(SRB_SC)
290 #define CRQB_ATACOMMAND_LBALOW                    CRQB_ATACOMMAND_REG(SRB_LBAL)
291 #define CRQB_ATACOMMAND_LBAMID                    CRQB_ATACOMMAND_REG(SRB_LBAM)
292 #define CRQB_ATACOMMAND_LBAHIGH                   CRQB_ATACOMMAND_REG(SRB_LBAH)
293 #define CRQB_ATACOMMAND_DEVICE                    CRQB_ATACOMMAND_REG(SRB_H)
294 #define CRQB_ATACOMMAND_COMMAND                   CRQB_ATACOMMAND_REG(SRB_CS)
295 
296 
297 /* EDMA Phisical Region Descriptors (ePRD) Table Data Structure */
298 struct eprd {
299           uint32_t prdbal;    /* address bits[31:1] */
300           uint16_t bytecount; /* Byte Count */
301           uint16_t eot;                 /* End Of Table */
302           uint32_t prdbah;    /* address bits[63:32] */
303           uint32_t resv;
304 } __packed __aligned(8);
305 
306 #define EPRD_PRDBAL_MASK      0xfffffffe          /* phy memory region mask */
307 
308 #define EPRD_BYTECOUNT(x)     (((x) & 0xffff) << 0)
309 #define EPRD_EOT              (1 << 15) /* End Of Table */
310 
311 
312 /* EDMA Command Response Block (CRPB) Data */
313 struct crpb {
314           uint16_t id;                  /* CRPB ID */
315           uint16_t rspflg;    /* CPRB Response Flags */
316           uint32_t ts;                  /* CPRB Time Stamp */
317 } __packed __aligned(8);
318 
319 /* ID */
320 #define CRPB_CHOSTQUETAG(x)   (((x) >> 0) & 0x7f) /* CRPB Host Q Tag */
321 
322 /* Response Flags */
323 #define CRPB_CEDMASTS(x)      (((x) >> 0) & 0x7f) /* CRPB EDMA Status */
324 #define CRPB_CDEVSTS(x)                 (((x) >> 8) & 0xff) /* CRPB Device Status */
325 
326 #endif    /* _MVSATAREG_H_ */
327