2 * Marvell 88SE94xx hardware specific
4 * Copyright 2007 Red Hat, Inc.
5 * Copyright 2008 Marvell. <kewei@marvell.com>
7 * This file is licensed under GPLv2.
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License as
11 * published by the Free Software Foundation; version 2 of the
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
29 static void mvs_94xx_detect_porttype(struct mvs_info
*mvi
, int i
)
32 struct mvs_phy
*phy
= &mvi
->phy
[i
];
35 mvs_write_port_vsr_addr(mvi
, i
, VSR_PHY_MODE3
);
36 reg
= mvs_read_port_vsr_data(mvi
, i
);
37 phy_status
= ((reg
& 0x3f0000) >> 16) & 0xff;
38 phy
->phy_type
&= ~(PORT_TYPE_SAS
| PORT_TYPE_SATA
);
41 phy
->phy_type
|= PORT_TYPE_SAS
;
45 phy
->phy_type
|= PORT_TYPE_SATA
;
50 static void __devinit
mvs_94xx_enable_xmt(struct mvs_info
*mvi
, int phy_id
)
52 void __iomem
*regs
= mvi
->regs
;
56 tmp
|= 1 << (phy_id
+ PCS_EN_PORT_XMT_SHIFT2
);
60 static void mvs_94xx_phy_reset(struct mvs_info
*mvi
, u32 phy_id
, int hard
)
64 tmp
= mvs_read_port_irq_stat(mvi
, phy_id
);
66 mvs_write_port_irq_stat(mvi
, phy_id
, tmp
);
68 tmp
= mvs_read_phy_ctl(mvi
, phy_id
);
70 mvs_write_phy_ctl(mvi
, phy_id
, tmp
);
72 tmp
= mvs_read_phy_ctl(mvi
, phy_id
);
73 } while (tmp
& PHY_RST_HARD
);
75 mvs_write_port_vsr_addr(mvi
, phy_id
, VSR_PHY_STAT
);
76 tmp
= mvs_read_port_vsr_data(mvi
, phy_id
);
78 mvs_write_port_vsr_data(mvi
, phy_id
, tmp
);
82 static void mvs_94xx_phy_disable(struct mvs_info
*mvi
, u32 phy_id
)
85 mvs_write_port_vsr_addr(mvi
, phy_id
, VSR_PHY_MODE2
);
86 tmp
= mvs_read_port_vsr_data(mvi
, phy_id
);
87 mvs_write_port_vsr_data(mvi
, phy_id
, tmp
| 0x00800000);
90 static void mvs_94xx_phy_enable(struct mvs_info
*mvi
, u32 phy_id
)
92 mvs_write_port_vsr_addr(mvi
, phy_id
, 0x1B4);
93 mvs_write_port_vsr_data(mvi
, phy_id
, 0x8300ffc1);
94 mvs_write_port_vsr_addr(mvi
, phy_id
, 0x104);
95 mvs_write_port_vsr_data(mvi
, phy_id
, 0x00018080);
96 mvs_write_port_vsr_addr(mvi
, phy_id
, VSR_PHY_MODE2
);
97 mvs_write_port_vsr_data(mvi
, phy_id
, 0x00207fff);
100 static int __devinit
mvs_94xx_init(struct mvs_info
*mvi
)
102 void __iomem
*regs
= mvi
->regs
;
106 mvs_show_pcie_usage(mvi
);
107 if (mvi
->flags
& MVF_FLAG_SOC
) {
108 tmp
= mr32(MVS_PHY_CTL
);
109 tmp
&= ~PCTL_PWR_OFF
;
110 tmp
|= PCTL_PHY_DSBL
;
111 mw32(MVS_PHY_CTL
, tmp
);
115 /* make sure RST is set; HBA_RST /should/ have done that for us */
116 cctl
= mr32(MVS_CTL
) & 0xFFFF;
120 mw32_f(MVS_CTL
, cctl
| CCTL_RST
);
122 if (mvi
->flags
& MVF_FLAG_SOC
) {
123 tmp
= mr32(MVS_PHY_CTL
);
124 tmp
&= ~PCTL_PWR_OFF
;
126 tmp
&= ~PCTL_PHY_DSBL
;
127 tmp
|= PCTL_LINK_RST
;
128 mw32(MVS_PHY_CTL
, tmp
);
130 tmp
&= ~PCTL_LINK_RST
;
131 mw32(MVS_PHY_CTL
, tmp
);
136 mw32(MVS_PCS
, 0); /* MVS_PCS */
137 mw32(MVS_STP_REG_SET_0
, 0);
138 mw32(MVS_STP_REG_SET_1
, 0);
143 /* disable Multiplexing, enable phy implemented */
144 mw32(MVS_PORTS_IMP
, 0xFF);
147 mw32(MVS_PA_VSR_ADDR
, 0x00000104);
148 mw32(MVS_PA_VSR_PORT
, 0x00018080);
149 mw32(MVS_PA_VSR_ADDR
, VSR_PHY_MODE8
);
150 mw32(MVS_PA_VSR_PORT
, 0x0084ffff);
152 /* set LED blink when IO*/
153 mw32(MVS_PA_VSR_ADDR
, 0x00000030);
154 tmp
= mr32(MVS_PA_VSR_PORT
);
157 mw32(MVS_PA_VSR_PORT
, tmp
);
159 mw32(MVS_CMD_LIST_LO
, mvi
->slot_dma
);
160 mw32(MVS_CMD_LIST_HI
, (mvi
->slot_dma
>> 16) >> 16);
162 mw32(MVS_RX_FIS_LO
, mvi
->rx_fis_dma
);
163 mw32(MVS_RX_FIS_HI
, (mvi
->rx_fis_dma
>> 16) >> 16);
165 mw32(MVS_TX_CFG
, MVS_CHIP_SLOT_SZ
);
166 mw32(MVS_TX_LO
, mvi
->tx_dma
);
167 mw32(MVS_TX_HI
, (mvi
->tx_dma
>> 16) >> 16);
169 mw32(MVS_RX_CFG
, MVS_RX_RING_SZ
);
170 mw32(MVS_RX_LO
, mvi
->rx_dma
);
171 mw32(MVS_RX_HI
, (mvi
->rx_dma
>> 16) >> 16);
173 for (i
= 0; i
< mvi
->chip
->n_phy
; i
++) {
174 mvs_94xx_phy_disable(mvi
, i
);
175 /* set phy local SAS address */
176 mvs_set_sas_addr(mvi
, i
, CONFIG_ID_FRAME3
, CONFIG_ID_FRAME4
,
177 (mvi
->phy
[i
].dev_sas_addr
));
179 mvs_94xx_enable_xmt(mvi
, i
);
180 mvs_94xx_phy_enable(mvi
, i
);
182 mvs_94xx_phy_reset(mvi
, i
, 1);
184 mvs_94xx_detect_porttype(mvi
, i
);
187 if (mvi
->flags
& MVF_FLAG_SOC
) {
188 /* set select registers */
189 writel(0x0E008000, regs
+ 0x000);
190 writel(0x59000008, regs
+ 0x004);
191 writel(0x20, regs
+ 0x008);
192 writel(0x20, regs
+ 0x00c);
193 writel(0x20, regs
+ 0x010);
194 writel(0x20, regs
+ 0x014);
195 writel(0x20, regs
+ 0x018);
196 writel(0x20, regs
+ 0x01c);
198 for (i
= 0; i
< mvi
->chip
->n_phy
; i
++) {
199 /* clear phy int status */
200 tmp
= mvs_read_port_irq_stat(mvi
, i
);
201 tmp
&= ~PHYEV_SIG_FIS
;
202 mvs_write_port_irq_stat(mvi
, i
, tmp
);
204 /* set phy int mask */
205 tmp
= PHYEV_RDY_CH
| PHYEV_BROAD_CH
|
206 PHYEV_ID_DONE
| PHYEV_DCDR_ERR
| PHYEV_CRC_ERR
;
207 mvs_write_port_irq_mask(mvi
, i
, tmp
);
210 mvs_update_phyinfo(mvi
, i
, 1);
213 /* FIXME: update wide port bitmaps */
215 /* little endian for open address and command table, etc. */
217 * it seems that ( from the spec ) turning on big-endian won't
218 * do us any good on big-endian machines, need further confirmation
220 cctl
= mr32(MVS_CTL
);
221 cctl
|= CCTL_ENDIAN_CMD
;
222 cctl
|= CCTL_ENDIAN_DATA
;
223 cctl
&= ~CCTL_ENDIAN_OPEN
;
224 cctl
|= CCTL_ENDIAN_RSP
;
225 mw32_f(MVS_CTL
, cctl
);
227 /* reset CMD queue */
231 /* interrupt coalescing may cause missing HW interrput in some case,
232 * and the max count is 0x1ff, while our max slot is 0x200,
233 * it will make count 0.
236 mw32(MVS_INT_COAL
, tmp
);
239 mw32(MVS_INT_COAL_TMOUT
, tmp
);
241 /* ladies and gentlemen, start your engines */
243 mw32(MVS_TX_CFG
, MVS_CHIP_SLOT_SZ
| TX_EN
);
244 mw32(MVS_RX_CFG
, MVS_RX_RING_SZ
| RX_EN
);
245 /* enable CMD/CMPL_Q/RESP mode */
246 mw32(MVS_PCS
, PCS_SATA_RETRY_2
| PCS_FIS_RX_EN
|
247 PCS_CMD_EN
| PCS_CMD_STOP_ERR
);
249 /* enable completion queue interrupt */
250 tmp
= (CINT_PORT_MASK
| CINT_DONE
| CINT_MEM
| CINT_SRS
| CINT_CI_STOP
|
252 tmp
|= CINT_PHY_MASK
;
253 mw32(MVS_INT_MASK
, tmp
);
255 /* Enable SRS interrupt */
256 mw32(MVS_INT_MASK_SRS_0
, 0xFFFF);
261 static int mvs_94xx_ioremap(struct mvs_info
*mvi
)
263 if (!mvs_ioremap(mvi
, 2, -1)) {
264 mvi
->regs_ex
= mvi
->regs
+ 0x10200;
265 mvi
->regs
+= 0x20000;
273 static void mvs_94xx_iounmap(struct mvs_info
*mvi
)
276 mvi
->regs
-= 0x20000;
279 mvs_iounmap(mvi
->regs
);
283 static void mvs_94xx_interrupt_enable(struct mvs_info
*mvi
)
285 void __iomem
*regs
= mvi
->regs_ex
;
288 tmp
= mr32(MVS_GBL_CTL
);
289 tmp
|= (IRQ_SAS_A
| IRQ_SAS_B
);
290 mw32(MVS_GBL_INT_STAT
, tmp
);
291 writel(tmp
, regs
+ 0x0C);
292 writel(tmp
, regs
+ 0x10);
293 writel(tmp
, regs
+ 0x14);
294 writel(tmp
, regs
+ 0x18);
295 mw32(MVS_GBL_CTL
, tmp
);
298 static void mvs_94xx_interrupt_disable(struct mvs_info
*mvi
)
300 void __iomem
*regs
= mvi
->regs_ex
;
303 tmp
= mr32(MVS_GBL_CTL
);
305 tmp
&= ~(IRQ_SAS_A
| IRQ_SAS_B
);
306 mw32(MVS_GBL_INT_STAT
, tmp
);
307 writel(tmp
, regs
+ 0x0C);
308 writel(tmp
, regs
+ 0x10);
309 writel(tmp
, regs
+ 0x14);
310 writel(tmp
, regs
+ 0x18);
311 mw32(MVS_GBL_CTL
, tmp
);
314 static u32
mvs_94xx_isr_status(struct mvs_info
*mvi
, int irq
)
316 void __iomem
*regs
= mvi
->regs_ex
;
318 if (!(mvi
->flags
& MVF_FLAG_SOC
)) {
319 stat
= mr32(MVS_GBL_INT_STAT
);
321 if (!(stat
& (IRQ_SAS_A
| IRQ_SAS_B
)))
327 static irqreturn_t
mvs_94xx_isr(struct mvs_info
*mvi
, int irq
, u32 stat
)
329 void __iomem
*regs
= mvi
->regs
;
331 if (((stat
& IRQ_SAS_A
) && mvi
->id
== 0) ||
332 ((stat
& IRQ_SAS_B
) && mvi
->id
== 1)) {
333 mw32_f(MVS_INT_STAT
, CINT_DONE
);
334 #ifndef MVS_USE_TASKLET
335 spin_lock(&mvi
->lock
);
338 #ifndef MVS_USE_TASKLET
339 spin_unlock(&mvi
->lock
);
345 static void mvs_94xx_command_active(struct mvs_info
*mvi
, u32 slot_idx
)
348 mvs_cw32(mvi
, 0x300 + (slot_idx
>> 3), 1 << (slot_idx
% 32));
350 tmp
= mvs_cr32(mvi
, 0x300 + (slot_idx
>> 3));
351 } while (tmp
& 1 << (slot_idx
% 32));
354 static void mvs_94xx_issue_stop(struct mvs_info
*mvi
, enum mvs_port_type type
,
357 void __iomem
*regs
= mvi
->regs
;
360 if (type
== PORT_TYPE_SATA
) {
361 tmp
= mr32(MVS_INT_STAT_SRS_0
) | (1U << tfs
);
362 mw32(MVS_INT_STAT_SRS_0
, tmp
);
364 mw32(MVS_INT_STAT
, CINT_CI_STOP
);
365 tmp
= mr32(MVS_PCS
) | 0xFF00;
369 static void mvs_94xx_free_reg_set(struct mvs_info
*mvi
, u8
*tfs
)
371 void __iomem
*regs
= mvi
->regs
;
375 if (*tfs
== MVS_ID_NOT_MAPPED
)
378 mvi
->sata_reg_set
&= ~bit(reg_set
);
380 w_reg_set_enable(reg_set
, (u32
)mvi
->sata_reg_set
);
381 tmp
= mr32(MVS_INT_STAT_SRS_0
) & (u32
)mvi
->sata_reg_set
;
383 mw32(MVS_INT_STAT_SRS_0
, tmp
);
385 w_reg_set_enable(reg_set
, mvi
->sata_reg_set
);
386 tmp
= mr32(MVS_INT_STAT_SRS_1
) & mvi
->sata_reg_set
;
388 mw32(MVS_INT_STAT_SRS_1
, tmp
);
391 *tfs
= MVS_ID_NOT_MAPPED
;
396 static u8
mvs_94xx_assign_reg_set(struct mvs_info
*mvi
, u8
*tfs
)
399 void __iomem
*regs
= mvi
->regs
;
401 if (*tfs
!= MVS_ID_NOT_MAPPED
)
404 i
= mv_ffc64(mvi
->sata_reg_set
);
406 mvi
->sata_reg_set
|= bit(i
);
407 w_reg_set_enable(i
, (u32
)(mvi
->sata_reg_set
>> 32));
411 mvi
->sata_reg_set
|= bit(i
);
412 w_reg_set_enable(i
, (u32
)mvi
->sata_reg_set
);
416 return MVS_ID_NOT_MAPPED
;
419 static void mvs_94xx_make_prd(struct scatterlist
*scatter
, int nr
, void *prd
)
422 struct scatterlist
*sg
;
423 struct mvs_prd
*buf_prd
= prd
;
424 for_each_sg(scatter
, sg
, nr
, i
) {
425 buf_prd
->addr
= cpu_to_le64(sg_dma_address(sg
));
426 buf_prd
->im_len
.len
= cpu_to_le32(sg_dma_len(sg
));
431 static int mvs_94xx_oob_done(struct mvs_info
*mvi
, int i
)
434 phy_st
= mvs_read_phy_ctl(mvi
, i
);
435 if (phy_st
& PHY_READY_MASK
) /* phy ready */
440 static void mvs_94xx_get_dev_identify_frame(struct mvs_info
*mvi
, int port_id
,
441 struct sas_identify_frame
*id
)
446 for (i
= 0; i
< 7; i
++) {
447 mvs_write_port_cfg_addr(mvi
, port_id
,
448 CONFIG_ID_FRAME0
+ i
* 4);
449 id_frame
[i
] = mvs_read_port_cfg_data(mvi
, port_id
);
451 memcpy(id
, id_frame
, 28);
454 static void mvs_94xx_get_att_identify_frame(struct mvs_info
*mvi
, int port_id
,
455 struct sas_identify_frame
*id
)
460 /* mvs_hexdump(28, (u8 *)id_frame, 0); */
461 for (i
= 0; i
< 7; i
++) {
462 mvs_write_port_cfg_addr(mvi
, port_id
,
463 CONFIG_ATT_ID_FRAME0
+ i
* 4);
464 id_frame
[i
] = mvs_read_port_cfg_data(mvi
, port_id
);
465 mv_dprintk("94xx phy %d atta frame %d %x.\n",
466 port_id
+ mvi
->id
* mvi
->chip
->n_phy
, i
, id_frame
[i
]);
468 /* mvs_hexdump(28, (u8 *)id_frame, 0); */
469 memcpy(id
, id_frame
, 28);
472 static u32
mvs_94xx_make_dev_info(struct sas_identify_frame
*id
)
474 u32 att_dev_info
= 0;
476 att_dev_info
|= id
->dev_type
;
478 att_dev_info
|= PORT_DEV_STP_INIT
;
480 att_dev_info
|= PORT_DEV_SMP_INIT
;
482 att_dev_info
|= PORT_DEV_SSP_INIT
;
484 att_dev_info
|= PORT_DEV_STP_TRGT
;
486 att_dev_info
|= PORT_DEV_SMP_TRGT
;
488 att_dev_info
|= PORT_DEV_SSP_TRGT
;
490 att_dev_info
|= (u32
)id
->phy_id
<<24;
494 static u32
mvs_94xx_make_att_info(struct sas_identify_frame
*id
)
496 return mvs_94xx_make_dev_info(id
);
499 static void mvs_94xx_fix_phy_info(struct mvs_info
*mvi
, int i
,
500 struct sas_identify_frame
*id
)
502 struct mvs_phy
*phy
= &mvi
->phy
[i
];
503 struct asd_sas_phy
*sas_phy
= &phy
->sas_phy
;
504 mv_dprintk("get all reg link rate is 0x%x\n", phy
->phy_status
);
506 (phy
->phy_status
& PHY_NEG_SPP_PHYS_LINK_RATE_MASK
) >>
507 PHY_NEG_SPP_PHYS_LINK_RATE_MASK_OFFSET
;
508 sas_phy
->linkrate
+= 0x8;
509 mv_dprintk("get link rate is %d\n", sas_phy
->linkrate
);
510 phy
->minimum_linkrate
= SAS_LINK_RATE_1_5_GBPS
;
511 phy
->maximum_linkrate
= SAS_LINK_RATE_6_0_GBPS
;
512 mvs_94xx_get_dev_identify_frame(mvi
, i
, id
);
513 phy
->dev_info
= mvs_94xx_make_dev_info(id
);
515 if (phy
->phy_type
& PORT_TYPE_SAS
) {
516 mvs_94xx_get_att_identify_frame(mvi
, i
, id
);
517 phy
->att_dev_info
= mvs_94xx_make_att_info(id
);
518 phy
->att_dev_sas_addr
= *(u64
*)id
->sas_addr
;
520 phy
->att_dev_info
= PORT_DEV_STP_TRGT
| 1;
525 void mvs_94xx_phy_set_link_rate(struct mvs_info
*mvi
, u32 phy_id
,
526 struct sas_phy_linkrates
*rates
)
531 static void mvs_94xx_clear_active_cmds(struct mvs_info
*mvi
)
534 void __iomem
*regs
= mvi
->regs
;
535 tmp
= mr32(MVS_STP_REG_SET_0
);
536 mw32(MVS_STP_REG_SET_0
, 0);
537 mw32(MVS_STP_REG_SET_0
, tmp
);
538 tmp
= mr32(MVS_STP_REG_SET_1
);
539 mw32(MVS_STP_REG_SET_1
, 0);
540 mw32(MVS_STP_REG_SET_1
, tmp
);
544 u32
mvs_94xx_spi_read_data(struct mvs_info
*mvi
)
546 void __iomem
*regs
= mvi
->regs_ex
- 0x10200;
547 return mr32(SPI_RD_DATA_REG_94XX
);
550 void mvs_94xx_spi_write_data(struct mvs_info
*mvi
, u32 data
)
552 void __iomem
*regs
= mvi
->regs_ex
- 0x10200;
553 mw32(SPI_RD_DATA_REG_94XX
, data
);
557 int mvs_94xx_spi_buildcmd(struct mvs_info
*mvi
,
565 void __iomem
*regs
= mvi
->regs_ex
- 0x10200;
568 dwTmp
= ((u32
)cmd
<< 8) | ((u32
)length
<< 4);
570 dwTmp
|= SPI_CTRL_READ_94XX
;
572 if (addr
!= MV_MAX_U32
) {
573 mw32(SPI_ADDR_REG_94XX
, (addr
& 0x0003FFFFL
));
574 dwTmp
|= SPI_ADDR_VLD_94XX
;
582 int mvs_94xx_spi_issuecmd(struct mvs_info
*mvi
, u32 cmd
)
584 void __iomem
*regs
= mvi
->regs_ex
- 0x10200;
585 mw32(SPI_CTRL_REG_94XX
, cmd
| SPI_CTRL_SpiStart_94XX
);
590 int mvs_94xx_spi_waitdataready(struct mvs_info
*mvi
, u32 timeout
)
592 void __iomem
*regs
= mvi
->regs_ex
- 0x10200;
595 for (i
= 0; i
< timeout
; i
++) {
596 dwTmp
= mr32(SPI_CTRL_REG_94XX
);
597 if (!(dwTmp
& SPI_CTRL_SpiStart_94XX
))
605 #ifndef DISABLE_HOTPLUG_DMA_FIX
606 void mvs_94xx_fix_dma(dma_addr_t buf_dma
, int buf_len
, int from
, void *prd
)
609 struct mvs_prd
*buf_prd
= prd
;
611 for (i
= 0; i
< MAX_SG_ENTRY
- from
; i
++) {
612 buf_prd
->addr
= cpu_to_le64(buf_dma
);
613 buf_prd
->im_len
.len
= cpu_to_le32(buf_len
);
619 const struct mvs_dispatch mvs_94xx_dispatch
= {
627 mvs_94xx_interrupt_enable
,
628 mvs_94xx_interrupt_disable
,
631 mvs_read_port_cfg_data
,
632 mvs_write_port_cfg_data
,
633 mvs_write_port_cfg_addr
,
634 mvs_read_port_vsr_data
,
635 mvs_write_port_vsr_data
,
636 mvs_write_port_vsr_addr
,
637 mvs_read_port_irq_stat
,
638 mvs_write_port_irq_stat
,
639 mvs_read_port_irq_mask
,
640 mvs_write_port_irq_mask
,
642 mvs_94xx_command_active
,
647 mvs_94xx_assign_reg_set
,
648 mvs_94xx_free_reg_set
,
652 mvs_94xx_detect_porttype
,
654 mvs_94xx_fix_phy_info
,
656 mvs_94xx_phy_set_link_rate
,
657 mvs_hw_max_link_rate
,
658 mvs_94xx_phy_disable
,
662 mvs_94xx_clear_active_cmds
,
663 mvs_94xx_spi_read_data
,
664 mvs_94xx_spi_write_data
,
665 mvs_94xx_spi_buildcmd
,
666 mvs_94xx_spi_issuecmd
,
667 mvs_94xx_spi_waitdataready
,
668 #ifndef DISABLE_HOTPLUG_DMA_FIX