750-v6.5-17-net-ethernet-mtk_eth_soc-add-reset-bits-for-MT7988.patch 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. From 15a84d1c44ae8c1451c265ee60500588a24e8cd6 Mon Sep 17 00:00:00 2001
  2. From: Daniel Golle <[email protected]>
  3. Date: Tue, 22 Aug 2023 17:32:03 +0100
  4. Subject: [PATCH 111/250] net: ethernet: mtk_eth_soc: add reset bits for MT7988
  5. Add bits needed to reset the frame engine on MT7988.
  6. Fixes: 445eb6448ed3 ("net: ethernet: mtk_eth_soc: add basic support for MT7988 SoC")
  7. Signed-off-by: Daniel Golle <[email protected]>
  8. Link: https://lore.kernel.org/r/89b6c38380e7a3800c1362aa7575600717bc7543.1692721443.git.daniel@makrotopia.org
  9. Signed-off-by: Jakub Kicinski <[email protected]>
  10. ---
  11. drivers/net/ethernet/mediatek/mtk_eth_soc.c | 76 +++++++++++++++------
  12. drivers/net/ethernet/mediatek/mtk_eth_soc.h | 16 +++--
  13. 2 files changed, 68 insertions(+), 24 deletions(-)
  14. --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
  15. +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
  16. @@ -3538,19 +3538,34 @@ static void mtk_hw_reset(struct mtk_eth
  17. {
  18. u32 val;
  19. - if (mtk_is_netsys_v2_or_greater(eth)) {
  20. + if (mtk_is_netsys_v2_or_greater(eth))
  21. regmap_write(eth->ethsys, ETHSYS_FE_RST_CHK_IDLE_EN, 0);
  22. +
  23. + if (mtk_is_netsys_v3_or_greater(eth)) {
  24. + val = RSTCTRL_PPE0_V3;
  25. +
  26. + if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE1))
  27. + val |= RSTCTRL_PPE1_V3;
  28. +
  29. + if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE2))
  30. + val |= RSTCTRL_PPE2;
  31. +
  32. + val |= RSTCTRL_WDMA0 | RSTCTRL_WDMA1 | RSTCTRL_WDMA2;
  33. + } else if (mtk_is_netsys_v2_or_greater(eth)) {
  34. val = RSTCTRL_PPE0_V2;
  35. +
  36. + if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE1))
  37. + val |= RSTCTRL_PPE1;
  38. } else {
  39. val = RSTCTRL_PPE0;
  40. }
  41. - if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE1))
  42. - val |= RSTCTRL_PPE1;
  43. -
  44. ethsys_reset(eth, RSTCTRL_ETH | RSTCTRL_FE | val);
  45. - if (mtk_is_netsys_v2_or_greater(eth))
  46. + if (mtk_is_netsys_v3_or_greater(eth))
  47. + regmap_write(eth->ethsys, ETHSYS_FE_RST_CHK_IDLE_EN,
  48. + 0x6f8ff);
  49. + else if (mtk_is_netsys_v2_or_greater(eth))
  50. regmap_write(eth->ethsys, ETHSYS_FE_RST_CHK_IDLE_EN,
  51. 0x3ffffff);
  52. }
  53. @@ -3576,13 +3591,21 @@ static void mtk_hw_warm_reset(struct mtk
  54. return;
  55. }
  56. - if (mtk_is_netsys_v2_or_greater(eth))
  57. + if (mtk_is_netsys_v3_or_greater(eth)) {
  58. + rst_mask = RSTCTRL_ETH | RSTCTRL_PPE0_V3;
  59. + if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE1))
  60. + rst_mask |= RSTCTRL_PPE1_V3;
  61. + if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE2))
  62. + rst_mask |= RSTCTRL_PPE2;
  63. +
  64. + rst_mask |= RSTCTRL_WDMA0 | RSTCTRL_WDMA1 | RSTCTRL_WDMA2;
  65. + } else if (mtk_is_netsys_v2_or_greater(eth)) {
  66. rst_mask = RSTCTRL_ETH | RSTCTRL_PPE0_V2;
  67. - else
  68. + if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE1))
  69. + rst_mask |= RSTCTRL_PPE1;
  70. + } else {
  71. rst_mask = RSTCTRL_ETH | RSTCTRL_PPE0;
  72. -
  73. - if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE1))
  74. - rst_mask |= RSTCTRL_PPE1;
  75. + }
  76. regmap_update_bits(eth->ethsys, ETHSYS_RSTCTRL, rst_mask, rst_mask);
  77. @@ -3934,11 +3957,17 @@ static void mtk_prepare_for_reset(struct
  78. u32 val;
  79. int i;
  80. - /* disabe FE P3 and P4 */
  81. - val = mtk_r32(eth, MTK_FE_GLO_CFG) | MTK_FE_LINK_DOWN_P3;
  82. - if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE1))
  83. - val |= MTK_FE_LINK_DOWN_P4;
  84. - mtk_w32(eth, val, MTK_FE_GLO_CFG);
  85. + /* set FE PPE ports link down */
  86. + for (i = MTK_GMAC1_ID;
  87. + i <= (mtk_is_netsys_v3_or_greater(eth) ? MTK_GMAC3_ID : MTK_GMAC2_ID);
  88. + i += 2) {
  89. + val = mtk_r32(eth, MTK_FE_GLO_CFG(i)) | MTK_FE_LINK_DOWN_P(PSE_PPE0_PORT);
  90. + if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE1))
  91. + val |= MTK_FE_LINK_DOWN_P(PSE_PPE1_PORT);
  92. + if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE2))
  93. + val |= MTK_FE_LINK_DOWN_P(PSE_PPE2_PORT);
  94. + mtk_w32(eth, val, MTK_FE_GLO_CFG(i));
  95. + }
  96. /* adjust PPE configurations to prepare for reset */
  97. for (i = 0; i < ARRAY_SIZE(eth->ppe); i++)
  98. @@ -3999,11 +4028,18 @@ static void mtk_pending_work(struct work
  99. }
  100. }
  101. - /* enabe FE P3 and P4 */
  102. - val = mtk_r32(eth, MTK_FE_GLO_CFG) & ~MTK_FE_LINK_DOWN_P3;
  103. - if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE1))
  104. - val &= ~MTK_FE_LINK_DOWN_P4;
  105. - mtk_w32(eth, val, MTK_FE_GLO_CFG);
  106. + /* set FE PPE ports link up */
  107. + for (i = MTK_GMAC1_ID;
  108. + i <= (mtk_is_netsys_v3_or_greater(eth) ? MTK_GMAC3_ID : MTK_GMAC2_ID);
  109. + i += 2) {
  110. + val = mtk_r32(eth, MTK_FE_GLO_CFG(i)) & ~MTK_FE_LINK_DOWN_P(PSE_PPE0_PORT);
  111. + if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE1))
  112. + val &= ~MTK_FE_LINK_DOWN_P(PSE_PPE1_PORT);
  113. + if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE2))
  114. + val &= ~MTK_FE_LINK_DOWN_P(PSE_PPE2_PORT);
  115. +
  116. + mtk_w32(eth, val, MTK_FE_GLO_CFG(i));
  117. + }
  118. clear_bit(MTK_RESETTING, &eth->state);
  119. --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
  120. +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
  121. @@ -76,9 +76,8 @@
  122. #define MTK_HW_LRO_SDL_REMAIN_ROOM 1522
  123. /* Frame Engine Global Configuration */
  124. -#define MTK_FE_GLO_CFG 0x00
  125. -#define MTK_FE_LINK_DOWN_P3 BIT(11)
  126. -#define MTK_FE_LINK_DOWN_P4 BIT(12)
  127. +#define MTK_FE_GLO_CFG(x) (((x) == MTK_GMAC3_ID) ? 0x24 : 0x00)
  128. +#define MTK_FE_LINK_DOWN_P(x) BIT(((x) + 8) % 16)
  129. /* Frame Engine Global Reset Register */
  130. #define MTK_RST_GL 0x04
  131. @@ -519,9 +518,15 @@
  132. /* ethernet reset control register */
  133. #define ETHSYS_RSTCTRL 0x34
  134. #define RSTCTRL_FE BIT(6)
  135. +#define RSTCTRL_WDMA0 BIT(24)
  136. +#define RSTCTRL_WDMA1 BIT(25)
  137. +#define RSTCTRL_WDMA2 BIT(26)
  138. #define RSTCTRL_PPE0 BIT(31)
  139. #define RSTCTRL_PPE0_V2 BIT(30)
  140. #define RSTCTRL_PPE1 BIT(31)
  141. +#define RSTCTRL_PPE0_V3 BIT(29)
  142. +#define RSTCTRL_PPE1_V3 BIT(30)
  143. +#define RSTCTRL_PPE2 BIT(31)
  144. #define RSTCTRL_ETH BIT(23)
  145. /* ethernet reset check idle register */
  146. @@ -928,6 +933,7 @@ enum mkt_eth_capabilities {
  147. MTK_QDMA_BIT,
  148. MTK_SOC_MT7628_BIT,
  149. MTK_RSTCTRL_PPE1_BIT,
  150. + MTK_RSTCTRL_PPE2_BIT,
  151. MTK_U3_COPHY_V2_BIT,
  152. /* MUX BITS*/
  153. @@ -962,6 +968,7 @@ enum mkt_eth_capabilities {
  154. #define MTK_QDMA BIT_ULL(MTK_QDMA_BIT)
  155. #define MTK_SOC_MT7628 BIT_ULL(MTK_SOC_MT7628_BIT)
  156. #define MTK_RSTCTRL_PPE1 BIT_ULL(MTK_RSTCTRL_PPE1_BIT)
  157. +#define MTK_RSTCTRL_PPE2 BIT_ULL(MTK_RSTCTRL_PPE2_BIT)
  158. #define MTK_U3_COPHY_V2 BIT_ULL(MTK_U3_COPHY_V2_BIT)
  159. #define MTK_ETH_MUX_GDM1_TO_GMAC1_ESW \
  160. @@ -1044,7 +1051,8 @@ enum mkt_eth_capabilities {
  161. MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA | \
  162. MTK_RSTCTRL_PPE1)
  163. -#define MT7988_CAPS (MTK_GDM1_ESW | MTK_QDMA | MTK_RSTCTRL_PPE1)
  164. +#define MT7988_CAPS (MTK_GDM1_ESW | MTK_QDMA | MTK_RSTCTRL_PPE1 | \
  165. + MTK_RSTCTRL_PPE2)
  166. struct mtk_tx_dma_desc_info {
  167. dma_addr_t addr;