750-v6.5-19-net-ethernet-mtk_eth_soc-support-36-bit-DMA-addressi.patch 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. From 0b0d606eb9650fa01dd5621e072aa29a10544399 Mon Sep 17 00:00:00 2001
  2. From: Daniel Golle <[email protected]>
  3. Date: Tue, 22 Aug 2023 17:33:12 +0100
  4. Subject: [PATCH 113/250] net: ethernet: mtk_eth_soc: support 36-bit DMA
  5. addressing on MT7988
  6. Systems having 4 GiB of RAM and more require DMA addressing beyond the
  7. current 32-bit limit. Starting from MT7988 the hardware now supports
  8. 36-bit DMA addressing, let's use that new capability in the driver to
  9. avoid running into swiotlb on systems with 4 GiB of RAM or more.
  10. Signed-off-by: Daniel Golle <[email protected]>
  11. Link: https://lore.kernel.org/r/95b919c98876c9e49761e44662e7c937479eecb8.1692721443.git.daniel@makrotopia.org
  12. Signed-off-by: Jakub Kicinski <[email protected]>
  13. ---
  14. drivers/net/ethernet/mediatek/mtk_eth_soc.c | 30 +++++++++++++++++++--
  15. drivers/net/ethernet/mediatek/mtk_eth_soc.h | 22 +++++++++++++--
  16. 2 files changed, 48 insertions(+), 4 deletions(-)
  17. --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
  18. +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
  19. @@ -1266,6 +1266,10 @@ static void mtk_tx_set_dma_desc_v2(struc
  20. data = TX_DMA_PLEN0(info->size);
  21. if (info->last)
  22. data |= TX_DMA_LS0;
  23. +
  24. + if (MTK_HAS_CAPS(eth->soc->caps, MTK_36BIT_DMA))
  25. + data |= TX_DMA_PREP_ADDR64(info->addr);
  26. +
  27. WRITE_ONCE(desc->txd3, data);
  28. /* set forward port */
  29. @@ -1933,6 +1937,7 @@ static int mtk_poll_rx(struct napi_struc
  30. bool xdp_flush = false;
  31. int idx;
  32. struct sk_buff *skb;
  33. + u64 addr64 = 0;
  34. u8 *data, *new_data;
  35. struct mtk_rx_dma_v2 *rxd, trxd;
  36. int done = 0, bytes = 0;
  37. @@ -2048,7 +2053,10 @@ static int mtk_poll_rx(struct napi_struc
  38. goto release_desc;
  39. }
  40. - dma_unmap_single(eth->dma_dev, trxd.rxd1,
  41. + if (MTK_HAS_CAPS(eth->soc->caps, MTK_36BIT_DMA))
  42. + addr64 = RX_DMA_GET_ADDR64(trxd.rxd2);
  43. +
  44. + dma_unmap_single(eth->dma_dev, ((u64)trxd.rxd1 | addr64),
  45. ring->buf_size, DMA_FROM_DEVICE);
  46. skb = build_skb(data, ring->frag_size);
  47. @@ -2114,6 +2122,9 @@ release_desc:
  48. else
  49. rxd->rxd2 = RX_DMA_PREP_PLEN0(ring->buf_size);
  50. + if (MTK_HAS_CAPS(eth->soc->caps, MTK_36BIT_DMA))
  51. + rxd->rxd2 |= RX_DMA_PREP_ADDR64(dma_addr);
  52. +
  53. ring->calc_idx = idx;
  54. done++;
  55. }
  56. @@ -2598,6 +2609,9 @@ static int mtk_rx_alloc(struct mtk_eth *
  57. else
  58. rxd->rxd2 = RX_DMA_PREP_PLEN0(ring->buf_size);
  59. + if (MTK_HAS_CAPS(eth->soc->caps, MTK_36BIT_DMA))
  60. + rxd->rxd2 |= RX_DMA_PREP_ADDR64(dma_addr);
  61. +
  62. rxd->rxd3 = 0;
  63. rxd->rxd4 = 0;
  64. if (mtk_is_netsys_v2_or_greater(eth)) {
  65. @@ -2644,6 +2658,7 @@ static int mtk_rx_alloc(struct mtk_eth *
  66. static void mtk_rx_clean(struct mtk_eth *eth, struct mtk_rx_ring *ring, bool in_sram)
  67. {
  68. + u64 addr64 = 0;
  69. int i;
  70. if (ring->data && ring->dma) {
  71. @@ -2657,7 +2672,10 @@ static void mtk_rx_clean(struct mtk_eth
  72. if (!rxd->rxd1)
  73. continue;
  74. - dma_unmap_single(eth->dma_dev, rxd->rxd1,
  75. + if (MTK_HAS_CAPS(eth->soc->caps, MTK_36BIT_DMA))
  76. + addr64 = RX_DMA_GET_ADDR64(rxd->rxd2);
  77. +
  78. + dma_unmap_single(eth->dma_dev, ((u64)rxd->rxd1 | addr64),
  79. ring->buf_size, DMA_FROM_DEVICE);
  80. mtk_rx_put_buff(ring, ring->data[i], false);
  81. }
  82. @@ -4646,6 +4664,14 @@ static int mtk_probe(struct platform_dev
  83. }
  84. }
  85. + if (MTK_HAS_CAPS(eth->soc->caps, MTK_36BIT_DMA)) {
  86. + err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(36));
  87. + if (err) {
  88. + dev_err(&pdev->dev, "Wrong DMA config\n");
  89. + return -EINVAL;
  90. + }
  91. + }
  92. +
  93. spin_lock_init(&eth->page_lock);
  94. spin_lock_init(&eth->tx_irq_lock);
  95. spin_lock_init(&eth->rx_irq_lock);
  96. --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
  97. +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
  98. @@ -331,6 +331,14 @@
  99. #define TX_DMA_PLEN1(x) ((x) & eth->soc->txrx.dma_max_len)
  100. #define TX_DMA_SWC BIT(14)
  101. #define TX_DMA_PQID GENMASK(3, 0)
  102. +#define TX_DMA_ADDR64_MASK GENMASK(3, 0)
  103. +#if IS_ENABLED(CONFIG_64BIT)
  104. +# define TX_DMA_GET_ADDR64(x) (((u64)FIELD_GET(TX_DMA_ADDR64_MASK, (x))) << 32)
  105. +# define TX_DMA_PREP_ADDR64(x) FIELD_PREP(TX_DMA_ADDR64_MASK, ((x) >> 32))
  106. +#else
  107. +# define TX_DMA_GET_ADDR64(x) (0)
  108. +# define TX_DMA_PREP_ADDR64(x) (0)
  109. +#endif
  110. /* PDMA on MT7628 */
  111. #define TX_DMA_DONE BIT(31)
  112. @@ -343,6 +351,14 @@
  113. #define RX_DMA_PREP_PLEN0(x) (((x) & eth->soc->txrx.dma_max_len) << eth->soc->txrx.dma_len_offset)
  114. #define RX_DMA_GET_PLEN0(x) (((x) >> eth->soc->txrx.dma_len_offset) & eth->soc->txrx.dma_max_len)
  115. #define RX_DMA_VTAG BIT(15)
  116. +#define RX_DMA_ADDR64_MASK GENMASK(3, 0)
  117. +#if IS_ENABLED(CONFIG_64BIT)
  118. +# define RX_DMA_GET_ADDR64(x) (((u64)FIELD_GET(RX_DMA_ADDR64_MASK, (x))) << 32)
  119. +# define RX_DMA_PREP_ADDR64(x) FIELD_PREP(RX_DMA_ADDR64_MASK, ((x) >> 32))
  120. +#else
  121. +# define RX_DMA_GET_ADDR64(x) (0)
  122. +# define RX_DMA_PREP_ADDR64(x) (0)
  123. +#endif
  124. /* QDMA descriptor rxd3 */
  125. #define RX_DMA_VID(x) ((x) & VLAN_VID_MASK)
  126. @@ -939,6 +955,7 @@ enum mkt_eth_capabilities {
  127. MTK_RSTCTRL_PPE2_BIT,
  128. MTK_U3_COPHY_V2_BIT,
  129. MTK_SRAM_BIT,
  130. + MTK_36BIT_DMA_BIT,
  131. /* MUX BITS*/
  132. MTK_ETH_MUX_GDM1_TO_GMAC1_ESW_BIT,
  133. @@ -975,6 +992,7 @@ enum mkt_eth_capabilities {
  134. #define MTK_RSTCTRL_PPE2 BIT_ULL(MTK_RSTCTRL_PPE2_BIT)
  135. #define MTK_U3_COPHY_V2 BIT_ULL(MTK_U3_COPHY_V2_BIT)
  136. #define MTK_SRAM BIT_ULL(MTK_SRAM_BIT)
  137. +#define MTK_36BIT_DMA BIT_ULL(MTK_36BIT_DMA_BIT)
  138. #define MTK_ETH_MUX_GDM1_TO_GMAC1_ESW \
  139. BIT_ULL(MTK_ETH_MUX_GDM1_TO_GMAC1_ESW_BIT)
  140. @@ -1056,8 +1074,8 @@ enum mkt_eth_capabilities {
  141. MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA | \
  142. MTK_RSTCTRL_PPE1 | MTK_SRAM)
  143. -#define MT7988_CAPS (MTK_GDM1_ESW | MTK_QDMA | MTK_RSTCTRL_PPE1 | \
  144. - MTK_RSTCTRL_PPE2 | MTK_SRAM)
  145. +#define MT7988_CAPS (MTK_36BIT_DMA | MTK_GDM1_ESW | MTK_QDMA | \
  146. + MTK_RSTCTRL_PPE1 | MTK_RSTCTRL_PPE2 | MTK_SRAM)
  147. struct mtk_tx_dma_desc_info {
  148. dma_addr_t addr;