@@ -230,6 +230,8 @@ enum stm32_dma3_port_data_width {
230
230
#define STM32_DMA3_CFG_SET_BOTH (STM32_DMA3_CFG_SET_DT | STM32_DMA3_CFG_SET_DMA)
231
231
232
232
#define STM32_DMA3_MAX_BLOCK_SIZE ALIGN_DOWN(CBR1_BNDT, 64)
233
+ #define STM32_DMA3_MAX_BURST_LEN (1 + min_t(u32, FIELD_MAX(CTR1_SBL_1), \
234
+ FIELD_MAX(CTR1_DBL_1)))
233
235
#define port_is_ahb (maxdw ) ({ typeof(maxdw) (_maxdw) = (maxdw); \
234
236
((_maxdw) != DW_INVALID) && ((_maxdw) == DW_32); })
235
237
#define port_is_axi (maxdw ) ({ typeof(maxdw) (_maxdw) = (maxdw); \
@@ -295,6 +297,10 @@ struct stm32_dma3_chan {
295
297
u32 dma_status ;
296
298
};
297
299
300
+ struct stm32_dma3_pdata {
301
+ u32 axi_max_burst_len ;
302
+ };
303
+
298
304
struct stm32_dma3_ddata {
299
305
struct dma_device dma_dev ;
300
306
void __iomem * base ;
@@ -303,6 +309,7 @@ struct stm32_dma3_ddata {
303
309
u32 dma_channels ;
304
310
u32 dma_requests ;
305
311
enum stm32_dma3_port_data_width ports_max_dw [2 ];
312
+ u32 axi_max_burst_len ;
306
313
};
307
314
308
315
static inline struct stm32_dma3_ddata * to_stm32_dma3_ddata (struct stm32_dma3_chan * chan )
@@ -535,7 +542,8 @@ static enum dma_slave_buswidth stm32_dma3_get_max_dw(u32 chan_max_burst,
535
542
return 1 << __ffs (len | addr | max_dw );
536
543
}
537
544
538
- static u32 stm32_dma3_get_max_burst (u32 len , enum dma_slave_buswidth dw , u32 chan_max_burst )
545
+ static u32 stm32_dma3_get_max_burst (u32 len , enum dma_slave_buswidth dw ,
546
+ u32 chan_max_burst , u32 bus_max_burst )
539
547
{
540
548
u32 max_burst = chan_max_burst ? chan_max_burst / dw : 1 ;
541
549
@@ -546,8 +554,9 @@ static u32 stm32_dma3_get_max_burst(u32 len, enum dma_slave_buswidth dw, u32 cha
546
554
/*
547
555
* HW doesn't modify the burst if burst size <= half of the fifo size.
548
556
* If len is not a multiple of burst size, last burst is shortened by HW.
557
+ * Take care of maximum burst supported on interconnect bus.
549
558
*/
550
- return max_burst ;
559
+ return min_t ( u32 , max_burst , bus_max_burst ) ;
551
560
}
552
561
553
562
static int stm32_dma3_chan_prep_hw (struct stm32_dma3_chan * chan , enum dma_transfer_direction dir ,
@@ -556,6 +565,7 @@ static int stm32_dma3_chan_prep_hw(struct stm32_dma3_chan *chan, enum dma_transf
556
565
{
557
566
struct stm32_dma3_ddata * ddata = to_stm32_dma3_ddata (chan );
558
567
struct dma_device dma_device = ddata -> dma_dev ;
568
+ u32 src_max_burst = STM32_DMA3_MAX_BURST_LEN , dst_max_burst = STM32_DMA3_MAX_BURST_LEN ;
559
569
u32 sdw , ddw , sbl_max , dbl_max , tcem , init_dw , init_bl_max ;
560
570
u32 _ctr1 = 0 , _ctr2 = 0 ;
561
571
u32 ch_conf = chan -> dt_config .ch_conf ;
@@ -596,10 +606,14 @@ static int stm32_dma3_chan_prep_hw(struct stm32_dma3_chan *chan, enum dma_transf
596
606
_ctr1 |= CTR1_SINC ;
597
607
if (sap )
598
608
_ctr1 |= CTR1_SAP ;
609
+ if (port_is_axi (sap_max_dw )) /* AXI - apply axi maximum burst limitation */
610
+ src_max_burst = ddata -> axi_max_burst_len ;
599
611
if (FIELD_GET (STM32_DMA3_DT_DINC , tr_conf ))
600
612
_ctr1 |= CTR1_DINC ;
601
613
if (dap )
602
614
_ctr1 |= CTR1_DAP ;
615
+ if (port_is_axi (dap_max_dw )) /* AXI - apply axi maximum burst limitation */
616
+ dst_max_burst = ddata -> axi_max_burst_len ;
603
617
604
618
_ctr2 |= FIELD_PREP (CTR2_REQSEL , chan -> dt_config .req_line ) & ~CTR2_SWREQ ;
605
619
if (FIELD_GET (STM32_DMA3_DT_BREQ , tr_conf ))
@@ -619,11 +633,12 @@ static int stm32_dma3_chan_prep_hw(struct stm32_dma3_chan *chan, enum dma_transf
619
633
/* Set destination (device) data width and burst */
620
634
ddw = min_t (u32 , ddw , stm32_dma3_get_max_dw (chan -> max_burst , dap_max_dw ,
621
635
len , dst_addr ));
622
- dbl_max = min_t (u32 , dbl_max , stm32_dma3_get_max_burst (len , ddw , chan -> max_burst ));
636
+ dbl_max = min_t (u32 , dbl_max , stm32_dma3_get_max_burst (len , ddw , chan -> max_burst ,
637
+ dst_max_burst ));
623
638
624
639
/* Set source (memory) data width and burst */
625
640
sdw = stm32_dma3_get_max_dw (chan -> max_burst , sap_max_dw , len , src_addr );
626
- sbl_max = stm32_dma3_get_max_burst (len , sdw , chan -> max_burst );
641
+ sbl_max = stm32_dma3_get_max_burst (len , sdw , chan -> max_burst , src_max_burst );
627
642
if (!!FIELD_GET (STM32_DMA3_DT_NOPACK , tr_conf )) {
628
643
sdw = ddw ;
629
644
sbl_max = dbl_max ;
@@ -653,11 +668,12 @@ static int stm32_dma3_chan_prep_hw(struct stm32_dma3_chan *chan, enum dma_transf
653
668
/* Set source (device) data width and burst */
654
669
sdw = min_t (u32 , sdw , stm32_dma3_get_max_dw (chan -> max_burst , sap_max_dw ,
655
670
len , src_addr ));
656
- sbl_max = min_t (u32 , sbl_max , stm32_dma3_get_max_burst (len , sdw , chan -> max_burst ));
671
+ sbl_max = min_t (u32 , sbl_max , stm32_dma3_get_max_burst (len , sdw , chan -> max_burst ,
672
+ src_max_burst ));
657
673
658
674
/* Set destination (memory) data width and burst */
659
675
ddw = stm32_dma3_get_max_dw (chan -> max_burst , dap_max_dw , len , dst_addr );
660
- dbl_max = stm32_dma3_get_max_burst (len , ddw , chan -> max_burst );
676
+ dbl_max = stm32_dma3_get_max_burst (len , ddw , chan -> max_burst , dst_max_burst );
661
677
if (!!FIELD_GET (STM32_DMA3_DT_NOPACK , tr_conf ) ||
662
678
((_ctr2 & CTR2_PFREQ ) && ddw > sdw )) { /* Packing to wider ddw not supported */
663
679
ddw = sdw ;
@@ -689,22 +705,24 @@ static int stm32_dma3_chan_prep_hw(struct stm32_dma3_chan *chan, enum dma_transf
689
705
init_dw = sdw ;
690
706
init_bl_max = sbl_max ;
691
707
sdw = stm32_dma3_get_max_dw (chan -> max_burst , sap_max_dw , len , src_addr );
692
- sbl_max = stm32_dma3_get_max_burst (len , sdw , chan -> max_burst );
708
+ sbl_max = stm32_dma3_get_max_burst (len , sdw , chan -> max_burst , src_max_burst );
693
709
if (chan -> config_set & STM32_DMA3_CFG_SET_DMA ) {
694
710
sdw = min_t (u32 , init_dw , sdw );
695
- sbl_max = min_t (u32 , init_bl_max ,
696
- stm32_dma3_get_max_burst (len , sdw , chan -> max_burst ));
711
+ sbl_max = min_t (u32 , init_bl_max , stm32_dma3_get_max_burst (len , sdw ,
712
+ chan -> max_burst ,
713
+ src_max_burst ));
697
714
}
698
715
699
716
/* Set destination (memory) data width and burst */
700
717
init_dw = ddw ;
701
718
init_bl_max = dbl_max ;
702
719
ddw = stm32_dma3_get_max_dw (chan -> max_burst , dap_max_dw , len , dst_addr );
703
- dbl_max = stm32_dma3_get_max_burst (len , ddw , chan -> max_burst );
720
+ dbl_max = stm32_dma3_get_max_burst (len , ddw , chan -> max_burst , dst_max_burst );
704
721
if (chan -> config_set & STM32_DMA3_CFG_SET_DMA ) {
705
722
ddw = min_t (u32 , init_dw , ddw );
706
- dbl_max = min_t (u32 , init_bl_max ,
707
- stm32_dma3_get_max_burst (len , ddw , chan -> max_burst ));
723
+ dbl_max = min_t (u32 , init_bl_max , stm32_dma3_get_max_burst (len , ddw ,
724
+ chan -> max_burst ,
725
+ dst_max_burst ));
708
726
}
709
727
710
728
_ctr1 |= FIELD_PREP (CTR1_SDW_LOG2 , ilog2 (sdw ));
@@ -1647,15 +1665,20 @@ static u32 stm32_dma3_check_rif(struct stm32_dma3_ddata *ddata)
1647
1665
return chan_reserved ;
1648
1666
}
1649
1667
1668
+ static struct stm32_dma3_pdata stm32mp25_pdata = {
1669
+ .axi_max_burst_len = 16 ,
1670
+ };
1671
+
1650
1672
static const struct of_device_id stm32_dma3_of_match [] = {
1651
- { .compatible = "st,stm32mp25-dma3" , },
1673
+ { .compatible = "st,stm32mp25-dma3" , . data = & stm32mp25_pdata , },
1652
1674
{ /* sentinel */ },
1653
1675
};
1654
1676
MODULE_DEVICE_TABLE (of , stm32_dma3_of_match );
1655
1677
1656
1678
static int stm32_dma3_probe (struct platform_device * pdev )
1657
1679
{
1658
1680
struct device_node * np = pdev -> dev .of_node ;
1681
+ const struct stm32_dma3_pdata * pdata ;
1659
1682
struct stm32_dma3_ddata * ddata ;
1660
1683
struct reset_control * reset ;
1661
1684
struct stm32_dma3_chan * chan ;
@@ -1750,6 +1773,16 @@ static int stm32_dma3_probe(struct platform_device *pdev)
1750
1773
else /* Dual master ports */
1751
1774
ddata -> ports_max_dw [1 ] = FIELD_GET (G_M1_DATA_WIDTH_ENC , hwcfgr );
1752
1775
1776
+ /* axi_max_burst_len is optional, if not defined, use STM32_DMA3_MAX_BURST_LEN */
1777
+ ddata -> axi_max_burst_len = STM32_DMA3_MAX_BURST_LEN ;
1778
+ pdata = device_get_match_data (& pdev -> dev );
1779
+ if (pdata && pdata -> axi_max_burst_len ) {
1780
+ ddata -> axi_max_burst_len = min_t (u32 , pdata -> axi_max_burst_len ,
1781
+ STM32_DMA3_MAX_BURST_LEN );
1782
+ dev_dbg (& pdev -> dev , "Burst is limited to %u beats through AXI port\n" ,
1783
+ ddata -> axi_max_burst_len );
1784
+ }
1785
+
1753
1786
ddata -> chans = devm_kcalloc (& pdev -> dev , ddata -> dma_channels , sizeof (* ddata -> chans ),
1754
1787
GFP_KERNEL );
1755
1788
if (!ddata -> chans ) {
0 commit comments