79
79
#define MACB_HALT_TIMEOUT 1230
80
80
81
81
/* DMA buffer descriptor might be different size
82
- * depends on hardware configuration.
82
+ * depends on hardware configuration:
83
+ *
84
+ * 1. dma address width 32 bits:
85
+ * word 1: 32 bit address of Data Buffer
86
+ * word 2: control
87
+ *
88
+ * 2. dma address width 64 bits:
89
+ * word 1: 32 bit address of Data Buffer
90
+ * word 2: control
91
+ * word 3: upper 32 bit address of Data Buffer
92
+ * word 4: unused
93
+ *
94
+ * 3. dma address width 32 bits with hardware timestamping:
95
+ * word 1: 32 bit address of Data Buffer
96
+ * word 2: control
97
+ * word 3: timestamp word 1
98
+ * word 4: timestamp word 2
99
+ *
100
+ * 4. dma address width 64 bits with hardware timestamping:
101
+ * word 1: 32 bit address of Data Buffer
102
+ * word 2: control
103
+ * word 3: upper 32 bit address of Data Buffer
104
+ * word 4: unused
105
+ * word 5: timestamp word 1
106
+ * word 6: timestamp word 2
83
107
*/
84
108
static unsigned int macb_dma_desc_get_size (struct macb * bp )
85
109
{
86
- #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
87
- if (bp -> hw_dma_cap == HW_DMA_CAP_64B )
88
- return sizeof (struct macb_dma_desc ) + sizeof (struct macb_dma_desc_64 );
110
+ #ifdef MACB_EXT_DESC
111
+ unsigned int desc_size ;
112
+
113
+ switch (bp -> hw_dma_cap ) {
114
+ case HW_DMA_CAP_64B :
115
+ desc_size = sizeof (struct macb_dma_desc )
116
+ + sizeof (struct macb_dma_desc_64 );
117
+ break ;
118
+ case HW_DMA_CAP_PTP :
119
+ desc_size = sizeof (struct macb_dma_desc )
120
+ + sizeof (struct macb_dma_desc_ptp );
121
+ break ;
122
+ case HW_DMA_CAP_64B_PTP :
123
+ desc_size = sizeof (struct macb_dma_desc )
124
+ + sizeof (struct macb_dma_desc_64 )
125
+ + sizeof (struct macb_dma_desc_ptp );
126
+ break ;
127
+ default :
128
+ desc_size = sizeof (struct macb_dma_desc );
129
+ }
130
+ return desc_size ;
89
131
#endif
90
132
return sizeof (struct macb_dma_desc );
91
133
}
92
134
93
- static unsigned int macb_adj_dma_desc_idx (struct macb * bp , unsigned int idx )
135
+ static unsigned int macb_adj_dma_desc_idx (struct macb * bp , unsigned int desc_idx )
94
136
{
95
- #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
96
- /* Dma buffer descriptor is 4 words length (instead of 2 words)
97
- * for 64b GEM.
98
- */
99
- if (bp -> hw_dma_cap == HW_DMA_CAP_64B )
100
- idx <<= 1 ;
137
+ #ifdef MACB_EXT_DESC
138
+ switch (bp -> hw_dma_cap ) {
139
+ case HW_DMA_CAP_64B :
140
+ case HW_DMA_CAP_PTP :
141
+ desc_idx <<= 1 ;
142
+ break ;
143
+ case HW_DMA_CAP_64B_PTP :
144
+ desc_idx *= 3 ;
145
+ break ;
146
+ default :
147
+ break ;
148
+ }
149
+ return desc_idx ;
101
150
#endif
102
- return idx ;
151
+ return desc_idx ;
103
152
}
104
153
105
154
#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
106
155
static struct macb_dma_desc_64 * macb_64b_desc (struct macb * bp , struct macb_dma_desc * desc )
107
156
{
108
- return (struct macb_dma_desc_64 * )((void * )desc + sizeof (struct macb_dma_desc ));
157
+ if (bp -> hw_dma_cap & HW_DMA_CAP_64B )
158
+ return (struct macb_dma_desc_64 * )((void * )desc + sizeof (struct macb_dma_desc ));
159
+ return NULL ;
109
160
}
110
161
#endif
111
162
@@ -621,7 +672,7 @@ static void macb_set_addr(struct macb *bp, struct macb_dma_desc *desc, dma_addr_
621
672
#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
622
673
struct macb_dma_desc_64 * desc_64 ;
623
674
624
- if (bp -> hw_dma_cap == HW_DMA_CAP_64B ) {
675
+ if (bp -> hw_dma_cap & HW_DMA_CAP_64B ) {
625
676
desc_64 = macb_64b_desc (bp , desc );
626
677
desc_64 -> addrh = upper_32_bits (addr );
627
678
}
@@ -635,7 +686,7 @@ static dma_addr_t macb_get_addr(struct macb *bp, struct macb_dma_desc *desc)
635
686
#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
636
687
struct macb_dma_desc_64 * desc_64 ;
637
688
638
- if (bp -> hw_dma_cap == HW_DMA_CAP_64B ) {
689
+ if (bp -> hw_dma_cap & HW_DMA_CAP_64B ) {
639
690
desc_64 = macb_64b_desc (bp , desc );
640
691
addr = ((u64 )(desc_64 -> addrh ) << 32 );
641
692
}
@@ -734,7 +785,7 @@ static void macb_tx_error_task(struct work_struct *work)
734
785
/* Reinitialize the TX desc queue */
735
786
queue_writel (queue , TBQP , lower_32_bits (queue -> tx_ring_dma ));
736
787
#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
737
- if (bp -> hw_dma_cap == HW_DMA_CAP_64B )
788
+ if (bp -> hw_dma_cap & HW_DMA_CAP_64B )
738
789
queue_writel (queue , TBQPH , upper_32_bits (queue -> tx_ring_dma ));
739
790
#endif
740
791
/* Make TX ring reflect state of hardware */
@@ -1942,8 +1993,12 @@ static void macb_configure_dma(struct macb *bp)
1942
1993
dmacfg &= ~GEM_BIT (TXCOEN );
1943
1994
1944
1995
#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
1945
- if (bp -> hw_dma_cap == HW_DMA_CAP_64B )
1996
+ if (bp -> hw_dma_cap & HW_DMA_CAP_64B )
1946
1997
dmacfg |= GEM_BIT (ADDR64 );
1998
+ #endif
1999
+ #ifdef CONFIG_MACB_USE_HWSTAMP
2000
+ if (bp -> hw_dma_cap & HW_DMA_CAP_PTP )
2001
+ dmacfg |= GEM_BIT (RXEXT ) | GEM_BIT (TXEXT );
1947
2002
#endif
1948
2003
netdev_dbg (bp -> dev , "Cadence configure DMA with 0x%08x\n" ,
1949
2004
dmacfg );
@@ -1992,13 +2047,13 @@ static void macb_init_hw(struct macb *bp)
1992
2047
/* Initialize TX and RX buffers */
1993
2048
macb_writel (bp , RBQP , lower_32_bits (bp -> rx_ring_dma ));
1994
2049
#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
1995
- if (bp -> hw_dma_cap == HW_DMA_CAP_64B )
2050
+ if (bp -> hw_dma_cap & HW_DMA_CAP_64B )
1996
2051
macb_writel (bp , RBQPH , upper_32_bits (bp -> rx_ring_dma ));
1997
2052
#endif
1998
2053
for (q = 0 , queue = bp -> queues ; q < bp -> num_queues ; ++ q , ++ queue ) {
1999
2054
queue_writel (queue , TBQP , lower_32_bits (queue -> tx_ring_dma ));
2000
2055
#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
2001
- if (bp -> hw_dma_cap == HW_DMA_CAP_64B )
2056
+ if (bp -> hw_dma_cap & HW_DMA_CAP_64B )
2002
2057
queue_writel (queue , TBQPH , upper_32_bits (queue -> tx_ring_dma ));
2003
2058
#endif
2004
2059
@@ -2600,6 +2655,12 @@ static void macb_configure_caps(struct macb *bp,
2600
2655
dcfg = gem_readl (bp , DCFG2 );
2601
2656
if ((dcfg & (GEM_BIT (RX_PKT_BUFF ) | GEM_BIT (TX_PKT_BUFF ))) == 0 )
2602
2657
bp -> caps |= MACB_CAPS_FIFO_MODE ;
2658
+ if (IS_ENABLED (CONFIG_MACB_USE_HWSTAMP ) && gem_has_ptp (bp )) {
2659
+ if (!GEM_BFEXT (TSU , gem_readl (bp , DCFG5 )))
2660
+ pr_err ("GEM doesn't support hardware ptp.\n" );
2661
+ else
2662
+ bp -> hw_dma_cap |= HW_DMA_CAP_PTP ;
2663
+ }
2603
2664
}
2604
2665
2605
2666
dev_dbg (& bp -> pdev -> dev , "Cadence caps 0x%08x\n" , bp -> caps );
@@ -2737,7 +2798,7 @@ static int macb_init(struct platform_device *pdev)
2737
2798
queue -> IMR = GEM_IMR (hw_q - 1 );
2738
2799
queue -> TBQP = GEM_TBQP (hw_q - 1 );
2739
2800
#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
2740
- if (bp -> hw_dma_cap == HW_DMA_CAP_64B )
2801
+ if (bp -> hw_dma_cap & HW_DMA_CAP_64B )
2741
2802
queue -> TBQPH = GEM_TBQPH (hw_q - 1 );
2742
2803
#endif
2743
2804
} else {
@@ -2748,7 +2809,7 @@ static int macb_init(struct platform_device *pdev)
2748
2809
queue -> IMR = MACB_IMR ;
2749
2810
queue -> TBQP = MACB_TBQP ;
2750
2811
#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
2751
- if (bp -> hw_dma_cap == HW_DMA_CAP_64B )
2812
+ if (bp -> hw_dma_cap & HW_DMA_CAP_64B )
2752
2813
queue -> TBQPH = MACB_TBQPH ;
2753
2814
#endif
2754
2815
}
@@ -3328,19 +3389,17 @@ static int macb_probe(struct platform_device *pdev)
3328
3389
bp -> wol |= MACB_WOL_HAS_MAGIC_PACKET ;
3329
3390
device_init_wakeup (& pdev -> dev , bp -> wol & MACB_WOL_HAS_MAGIC_PACKET );
3330
3391
3331
- #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
3332
- if (GEM_BFEXT (DAW64 , gem_readl (bp , DCFG6 ))) {
3333
- dma_set_mask (& pdev -> dev , DMA_BIT_MASK (44 ));
3334
- bp -> hw_dma_cap = HW_DMA_CAP_64B ;
3335
- } else
3336
- bp -> hw_dma_cap = HW_DMA_CAP_32B ;
3337
- #endif
3338
-
3339
3392
spin_lock_init (& bp -> lock );
3340
3393
3341
3394
/* setup capabilities */
3342
3395
macb_configure_caps (bp , macb_config );
3343
3396
3397
+ #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
3398
+ if (GEM_BFEXT (DAW64 , gem_readl (bp , DCFG6 ))) {
3399
+ dma_set_mask (& pdev -> dev , DMA_BIT_MASK (44 ));
3400
+ bp -> hw_dma_cap |= HW_DMA_CAP_64B ;
3401
+ }
3402
+ #endif
3344
3403
platform_set_drvdata (pdev , dev );
3345
3404
3346
3405
dev -> irq = platform_get_irq (pdev , 0 );
0 commit comments