dwmac4_dma.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * This is the driver for the GMAC on-chip Ethernet controller for ST SoCs.
  4. * DWC Ether MAC version 4.xx has been used for developing this code.
  5. *
  6. * This contains the functions to handle the dma.
  7. *
  8. * Copyright (C) 2015 STMicroelectronics Ltd
  9. *
  10. * Author: Alexandre Torgue <alexandre.torgue@st.com>
  11. */
  12. #include <linux/io.h>
  13. #include "dwmac4.h"
  14. #include "dwmac4_dma.h"
  15. #include "stmmac.h"
  16. static void dwmac4_dma_axi(void __iomem *ioaddr, struct stmmac_axi *axi)
  17. {
  18. u32 value = readl(ioaddr + DMA_SYS_BUS_MODE);
  19. pr_info("dwmac4: Master AXI performs %s burst length\n",
  20. (value & DMA_SYS_BUS_FB) ? "fixed" : "any");
  21. if (axi->axi_lpi_en)
  22. value |= DMA_AXI_EN_LPI;
  23. if (axi->axi_xit_frm)
  24. value |= DMA_AXI_LPI_XIT_FRM;
  25. value = u32_replace_bits(value, axi->axi_wr_osr_lmt,
  26. DMA_AXI_WR_OSR_LMT);
  27. value = u32_replace_bits(value, axi->axi_rd_osr_lmt,
  28. DMA_AXI_RD_OSR_LMT);
  29. /* Depending on the UNDEF bit the Master AXI will perform any burst
  30. * length according to the BLEN programmed (by default all BLEN are
  31. * set). Note that the UNDEF bit is readonly, and is the inverse of
  32. * Bus Mode bit 16.
  33. */
  34. value = (value & ~DMA_AXI_BLEN_MASK) | axi->axi_blen_regval;
  35. writel(value, ioaddr + DMA_SYS_BUS_MODE);
  36. }
  37. static void dwmac4_dma_init_rx_chan(struct stmmac_priv *priv,
  38. void __iomem *ioaddr,
  39. struct stmmac_dma_cfg *dma_cfg,
  40. dma_addr_t dma_rx_phy, u32 chan)
  41. {
  42. const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
  43. u32 value;
  44. u32 rxpbl = dma_cfg->rxpbl ?: dma_cfg->pbl;
  45. value = readl(ioaddr + DMA_CHAN_RX_CONTROL(dwmac4_addrs, chan));
  46. value = value | FIELD_PREP(DMA_CHAN_RX_CTRL_RXPBL_MASK, rxpbl);
  47. writel(value, ioaddr + DMA_CHAN_RX_CONTROL(dwmac4_addrs, chan));
  48. if (IS_ENABLED(CONFIG_ARCH_DMA_ADDR_T_64BIT) && likely(dma_cfg->eame))
  49. writel(upper_32_bits(dma_rx_phy),
  50. ioaddr + DMA_CHAN_RX_BASE_ADDR_HI(dwmac4_addrs, chan));
  51. writel(lower_32_bits(dma_rx_phy),
  52. ioaddr + DMA_CHAN_RX_BASE_ADDR(dwmac4_addrs, chan));
  53. }
  54. static void dwmac4_dma_init_tx_chan(struct stmmac_priv *priv,
  55. void __iomem *ioaddr,
  56. struct stmmac_dma_cfg *dma_cfg,
  57. dma_addr_t dma_tx_phy, u32 chan)
  58. {
  59. const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
  60. u32 value;
  61. u32 txpbl = dma_cfg->txpbl ?: dma_cfg->pbl;
  62. value = readl(ioaddr + DMA_CHAN_TX_CONTROL(dwmac4_addrs, chan));
  63. value = value | FIELD_PREP(DMA_CHAN_TX_CTRL_TXPBL_MASK, txpbl);
  64. /* Enable OSP to get best performance */
  65. value |= DMA_CONTROL_OSP;
  66. writel(value, ioaddr + DMA_CHAN_TX_CONTROL(dwmac4_addrs, chan));
  67. if (IS_ENABLED(CONFIG_ARCH_DMA_ADDR_T_64BIT) && likely(dma_cfg->eame))
  68. writel(upper_32_bits(dma_tx_phy),
  69. ioaddr + DMA_CHAN_TX_BASE_ADDR_HI(dwmac4_addrs, chan));
  70. writel(lower_32_bits(dma_tx_phy),
  71. ioaddr + DMA_CHAN_TX_BASE_ADDR(dwmac4_addrs, chan));
  72. }
  73. static void dwmac4_dma_init_channel(struct stmmac_priv *priv,
  74. void __iomem *ioaddr,
  75. struct stmmac_dma_cfg *dma_cfg, u32 chan)
  76. {
  77. const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
  78. u32 value;
  79. /* common channel control register config */
  80. value = readl(ioaddr + DMA_CHAN_CONTROL(dwmac4_addrs, chan));
  81. if (dma_cfg->pblx8)
  82. value = value | DMA_CHAN_CTRL_PBLX8;
  83. writel(value, ioaddr + DMA_CHAN_CONTROL(dwmac4_addrs, chan));
  84. /* Mask interrupts by writing to CSR7 */
  85. writel(DMA_CHAN_INTR_DEFAULT_MASK,
  86. ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));
  87. }
  88. static void dwmac410_dma_init_channel(struct stmmac_priv *priv,
  89. void __iomem *ioaddr,
  90. struct stmmac_dma_cfg *dma_cfg, u32 chan)
  91. {
  92. const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
  93. u32 value;
  94. /* common channel control register config */
  95. value = readl(ioaddr + DMA_CHAN_CONTROL(dwmac4_addrs, chan));
  96. if (dma_cfg->pblx8)
  97. value = value | DMA_CHAN_CTRL_PBLX8;
  98. writel(value, ioaddr + DMA_CHAN_CONTROL(dwmac4_addrs, chan));
  99. /* Mask interrupts by writing to CSR7 */
  100. writel(DMA_CHAN_INTR_DEFAULT_MASK_4_10,
  101. ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));
  102. }
  103. static void dwmac4_dma_init(void __iomem *ioaddr,
  104. struct stmmac_dma_cfg *dma_cfg)
  105. {
  106. u32 value = readl(ioaddr + DMA_SYS_BUS_MODE);
  107. /* Set the Fixed burst mode */
  108. if (dma_cfg->fixed_burst)
  109. value |= DMA_SYS_BUS_FB;
  110. /* Mixed Burst has no effect when fb is set */
  111. if (dma_cfg->mixed_burst)
  112. value |= DMA_SYS_BUS_MB;
  113. if (dma_cfg->aal)
  114. value |= DMA_SYS_BUS_AAL;
  115. if (dma_cfg->eame)
  116. value |= DMA_SYS_BUS_EAME;
  117. writel(value, ioaddr + DMA_SYS_BUS_MODE);
  118. value = readl(ioaddr + DMA_BUS_MODE);
  119. if (dma_cfg->multi_msi_en)
  120. value = u32_replace_bits(value, DMA_BUS_MODE_INTM_MODE1,
  121. DMA_BUS_MODE_INTM_MASK);
  122. if (dma_cfg->dche)
  123. value |= DMA_BUS_MODE_DCHE;
  124. writel(value, ioaddr + DMA_BUS_MODE);
  125. }
  126. static void _dwmac4_dump_dma_regs(struct stmmac_priv *priv,
  127. void __iomem *ioaddr, u32 channel,
  128. u32 *reg_space)
  129. {
  130. const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
  131. const struct dwmac4_addrs *default_addrs = NULL;
  132. /* Purposely save the registers in the "normal" layout, regardless of
  133. * platform modifications, to keep reg_space size constant
  134. */
  135. reg_space[DMA_CHAN_CONTROL(default_addrs, channel) / 4] =
  136. readl(ioaddr + DMA_CHAN_CONTROL(dwmac4_addrs, channel));
  137. reg_space[DMA_CHAN_TX_CONTROL(default_addrs, channel) / 4] =
  138. readl(ioaddr + DMA_CHAN_TX_CONTROL(dwmac4_addrs, channel));
  139. reg_space[DMA_CHAN_RX_CONTROL(default_addrs, channel) / 4] =
  140. readl(ioaddr + DMA_CHAN_RX_CONTROL(dwmac4_addrs, channel));
  141. reg_space[DMA_CHAN_TX_BASE_ADDR_HI(default_addrs, channel) / 4] =
  142. readl(ioaddr + DMA_CHAN_TX_BASE_ADDR_HI(dwmac4_addrs, channel));
  143. reg_space[DMA_CHAN_TX_BASE_ADDR(default_addrs, channel) / 4] =
  144. readl(ioaddr + DMA_CHAN_TX_BASE_ADDR(dwmac4_addrs, channel));
  145. reg_space[DMA_CHAN_RX_BASE_ADDR_HI(default_addrs, channel) / 4] =
  146. readl(ioaddr + DMA_CHAN_RX_BASE_ADDR_HI(dwmac4_addrs, channel));
  147. reg_space[DMA_CHAN_RX_BASE_ADDR(default_addrs, channel) / 4] =
  148. readl(ioaddr + DMA_CHAN_RX_BASE_ADDR(dwmac4_addrs, channel));
  149. reg_space[DMA_CHAN_TX_END_ADDR(default_addrs, channel) / 4] =
  150. readl(ioaddr + DMA_CHAN_TX_END_ADDR(dwmac4_addrs, channel));
  151. reg_space[DMA_CHAN_RX_END_ADDR(default_addrs, channel) / 4] =
  152. readl(ioaddr + DMA_CHAN_RX_END_ADDR(dwmac4_addrs, channel));
  153. reg_space[DMA_CHAN_TX_RING_LEN(default_addrs, channel) / 4] =
  154. readl(ioaddr + DMA_CHAN_TX_RING_LEN(dwmac4_addrs, channel));
  155. reg_space[DMA_CHAN_RX_RING_LEN(default_addrs, channel) / 4] =
  156. readl(ioaddr + DMA_CHAN_RX_RING_LEN(dwmac4_addrs, channel));
  157. reg_space[DMA_CHAN_INTR_ENA(default_addrs, channel) / 4] =
  158. readl(ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, channel));
  159. reg_space[DMA_CHAN_RX_WATCHDOG(default_addrs, channel) / 4] =
  160. readl(ioaddr + DMA_CHAN_RX_WATCHDOG(dwmac4_addrs, channel));
  161. reg_space[DMA_CHAN_SLOT_CTRL_STATUS(default_addrs, channel) / 4] =
  162. readl(ioaddr + DMA_CHAN_SLOT_CTRL_STATUS(dwmac4_addrs, channel));
  163. reg_space[DMA_CHAN_CUR_TX_DESC(default_addrs, channel) / 4] =
  164. readl(ioaddr + DMA_CHAN_CUR_TX_DESC(dwmac4_addrs, channel));
  165. reg_space[DMA_CHAN_CUR_RX_DESC(default_addrs, channel) / 4] =
  166. readl(ioaddr + DMA_CHAN_CUR_RX_DESC(dwmac4_addrs, channel));
  167. reg_space[DMA_CHAN_CUR_TX_BUF_ADDR_HI(default_addrs, channel) / 4] =
  168. readl(ioaddr + DMA_CHAN_CUR_TX_BUF_ADDR_HI(dwmac4_addrs, channel));
  169. reg_space[DMA_CHAN_CUR_TX_BUF_ADDR(default_addrs, channel) / 4] =
  170. readl(ioaddr + DMA_CHAN_CUR_TX_BUF_ADDR(dwmac4_addrs, channel));
  171. reg_space[DMA_CHAN_CUR_RX_BUF_ADDR_HI(default_addrs, channel) / 4] =
  172. readl(ioaddr + DMA_CHAN_CUR_RX_BUF_ADDR_HI(dwmac4_addrs, channel));
  173. reg_space[DMA_CHAN_CUR_RX_BUF_ADDR(default_addrs, channel) / 4] =
  174. readl(ioaddr + DMA_CHAN_CUR_RX_BUF_ADDR(dwmac4_addrs, channel));
  175. reg_space[DMA_CHAN_STATUS(default_addrs, channel) / 4] =
  176. readl(ioaddr + DMA_CHAN_STATUS(dwmac4_addrs, channel));
  177. }
  178. static void dwmac4_dump_dma_regs(struct stmmac_priv *priv, void __iomem *ioaddr,
  179. u32 *reg_space)
  180. {
  181. int i;
  182. for (i = 0; i < DMA_CHANNEL_NB_MAX; i++)
  183. _dwmac4_dump_dma_regs(priv, ioaddr, i, reg_space);
  184. }
  185. static void dwmac4_rx_watchdog(struct stmmac_priv *priv, void __iomem *ioaddr,
  186. u32 riwt, u32 queue)
  187. {
  188. const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
  189. writel(riwt, ioaddr + DMA_CHAN_RX_WATCHDOG(dwmac4_addrs, queue));
  190. }
  191. static void dwmac4_dma_rx_chan_op_mode(struct stmmac_priv *priv,
  192. void __iomem *ioaddr, int mode,
  193. u32 channel, int fifosz, u8 qmode)
  194. {
  195. const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
  196. unsigned int rqs = fifosz / 256 - 1;
  197. u32 mtl_rx_op;
  198. mtl_rx_op = readl(ioaddr + MTL_CHAN_RX_OP_MODE(dwmac4_addrs, channel));
  199. mtl_rx_op |= MTL_OP_MODE_DIS_TCP_EF;
  200. if (mode == SF_DMA_MODE) {
  201. pr_debug("GMAC: enable RX store and forward mode\n");
  202. mtl_rx_op |= MTL_OP_MODE_RSF;
  203. } else {
  204. pr_debug("GMAC: disable RX SF mode (threshold %d)\n", mode);
  205. mtl_rx_op &= ~MTL_OP_MODE_RSF;
  206. mtl_rx_op &= ~MTL_OP_MODE_RTC_MASK;
  207. if (mode <= 32)
  208. mtl_rx_op |= MTL_OP_MODE_RTC_32;
  209. else if (mode <= 64)
  210. mtl_rx_op |= MTL_OP_MODE_RTC_64;
  211. else if (mode <= 96)
  212. mtl_rx_op |= MTL_OP_MODE_RTC_96;
  213. else
  214. mtl_rx_op |= MTL_OP_MODE_RTC_128;
  215. }
  216. mtl_rx_op &= ~MTL_OP_MODE_RQS_MASK;
  217. mtl_rx_op |= FIELD_PREP(MTL_OP_MODE_RQS_MASK, rqs);
  218. /* Enable flow control only if each channel gets 4 KiB or more FIFO and
  219. * only if channel is not an AVB channel.
  220. */
  221. if ((fifosz >= 4096) && (qmode != MTL_QUEUE_AVB)) {
  222. unsigned int rfd, rfa;
  223. mtl_rx_op |= MTL_OP_MODE_EHFC;
  224. /* Set Threshold for Activating Flow Control to min 2 frames,
  225. * i.e. 1500 * 2 = 3000 bytes.
  226. *
  227. * Set Threshold for Deactivating Flow Control to min 1 frame,
  228. * i.e. 1500 bytes.
  229. */
  230. switch (fifosz) {
  231. case 4096:
  232. /* This violates the above formula because of FIFO size
  233. * limit therefore overflow may occur in spite of this.
  234. */
  235. rfd = 0x03; /* Full-2.5K */
  236. rfa = 0x01; /* Full-1.5K */
  237. break;
  238. default:
  239. rfd = 0x07; /* Full-4.5K */
  240. rfa = 0x04; /* Full-3K */
  241. break;
  242. }
  243. mtl_rx_op = u32_replace_bits(mtl_rx_op, rfd,
  244. MTL_OP_MODE_RFD_MASK);
  245. mtl_rx_op = u32_replace_bits(mtl_rx_op, rfa,
  246. MTL_OP_MODE_RFA_MASK);
  247. }
  248. writel(mtl_rx_op, ioaddr + MTL_CHAN_RX_OP_MODE(dwmac4_addrs, channel));
  249. }
  250. static void dwmac4_dma_tx_chan_op_mode(struct stmmac_priv *priv,
  251. void __iomem *ioaddr, int mode,
  252. u32 channel, int fifosz, u8 qmode)
  253. {
  254. const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
  255. u32 mtl_tx_op = readl(ioaddr + MTL_CHAN_TX_OP_MODE(dwmac4_addrs,
  256. channel));
  257. unsigned int tqs = fifosz / 256 - 1;
  258. if (mode == SF_DMA_MODE) {
  259. pr_debug("GMAC: enable TX store and forward mode\n");
  260. /* Transmit COE type 2 cannot be done in cut-through mode. */
  261. mtl_tx_op |= MTL_OP_MODE_TSF;
  262. } else {
  263. pr_debug("GMAC: disabling TX SF (threshold %d)\n", mode);
  264. mtl_tx_op &= ~MTL_OP_MODE_TSF;
  265. mtl_tx_op &= ~MTL_OP_MODE_TTC_MASK;
  266. /* Set the transmit threshold */
  267. if (mode <= 32)
  268. mtl_tx_op |= MTL_OP_MODE_TTC_32;
  269. else if (mode <= 64)
  270. mtl_tx_op |= MTL_OP_MODE_TTC_64;
  271. else if (mode <= 96)
  272. mtl_tx_op |= MTL_OP_MODE_TTC_96;
  273. else if (mode <= 128)
  274. mtl_tx_op |= MTL_OP_MODE_TTC_128;
  275. else if (mode <= 192)
  276. mtl_tx_op |= MTL_OP_MODE_TTC_192;
  277. else if (mode <= 256)
  278. mtl_tx_op |= MTL_OP_MODE_TTC_256;
  279. else if (mode <= 384)
  280. mtl_tx_op |= MTL_OP_MODE_TTC_384;
  281. else
  282. mtl_tx_op |= MTL_OP_MODE_TTC_512;
  283. }
  284. /* For an IP with DWC_EQOS_NUM_TXQ == 1, the fields TXQEN and TQS are RO
  285. * with reset values: TXQEN on, TQS == DWC_EQOS_TXFIFO_SIZE.
  286. * For an IP with DWC_EQOS_NUM_TXQ > 1, the fields TXQEN and TQS are R/W
  287. * with reset values: TXQEN off, TQS 256 bytes.
  288. *
  289. * TXQEN must be written for multi-channel operation and TQS must
  290. * reflect the available fifo size per queue (total fifo size / number
  291. * of enabled queues).
  292. */
  293. mtl_tx_op &= ~MTL_OP_MODE_TXQEN_MASK;
  294. if (qmode != MTL_QUEUE_AVB)
  295. mtl_tx_op |= MTL_OP_MODE_TXQEN;
  296. else
  297. mtl_tx_op |= MTL_OP_MODE_TXQEN_AV;
  298. mtl_tx_op = u32_replace_bits(mtl_tx_op, tqs, MTL_OP_MODE_TQS_MASK);
  299. writel(mtl_tx_op, ioaddr + MTL_CHAN_TX_OP_MODE(dwmac4_addrs, channel));
  300. }
  301. static int dwmac4_get_hw_feature(void __iomem *ioaddr,
  302. struct dma_features *dma_cap)
  303. {
  304. u32 hw_cap = readl(ioaddr + GMAC_HW_FEATURE0);
  305. /* MAC HW feature0 */
  306. dma_cap->mbps_10_100 = (hw_cap & GMAC_HW_FEAT_MIISEL);
  307. dma_cap->mbps_1000 = (hw_cap & GMAC_HW_FEAT_GMIISEL) >> 1;
  308. dma_cap->half_duplex = (hw_cap & GMAC_HW_FEAT_HDSEL) >> 2;
  309. dma_cap->vlhash = (hw_cap & GMAC_HW_FEAT_VLHASH) >> 4;
  310. dma_cap->multi_addr = (hw_cap & GMAC_HW_FEAT_ADDMAC) >> 18;
  311. dma_cap->pcs = (hw_cap & GMAC_HW_FEAT_PCSSEL) >> 3;
  312. dma_cap->sma_mdio = (hw_cap & GMAC_HW_FEAT_SMASEL) >> 5;
  313. dma_cap->pmt_remote_wake_up = (hw_cap & GMAC_HW_FEAT_RWKSEL) >> 6;
  314. dma_cap->pmt_magic_frame = (hw_cap & GMAC_HW_FEAT_MGKSEL) >> 7;
  315. /* MMC */
  316. dma_cap->rmon = (hw_cap & GMAC_HW_FEAT_MMCSEL) >> 8;
  317. /* IEEE 1588-2008 */
  318. dma_cap->atime_stamp = (hw_cap & GMAC_HW_FEAT_TSSEL) >> 12;
  319. /* 802.3az - Energy-Efficient Ethernet (EEE) */
  320. dma_cap->eee = (hw_cap & GMAC_HW_FEAT_EEESEL) >> 13;
  321. /* TX and RX csum */
  322. dma_cap->tx_coe = (hw_cap & GMAC_HW_FEAT_TXCOSEL) >> 14;
  323. dma_cap->rx_coe = (hw_cap & GMAC_HW_FEAT_RXCOESEL) >> 16;
  324. dma_cap->vlins = (hw_cap & GMAC_HW_FEAT_SAVLANINS) >> 27;
  325. dma_cap->arpoffsel = (hw_cap & GMAC_HW_FEAT_ARPOFFSEL) >> 9;
  326. dma_cap->actphyif = FIELD_GET(DMA_HW_FEAT_ACTPHYIF, hw_cap);
  327. /* MAC HW feature1 */
  328. hw_cap = readl(ioaddr + GMAC_HW_FEATURE1);
  329. dma_cap->l3l4fnum = (hw_cap & GMAC_HW_FEAT_L3L4FNUM) >> 27;
  330. dma_cap->hash_tb_sz = (hw_cap & GMAC_HW_HASH_TB_SZ) >> 24;
  331. dma_cap->av = (hw_cap & GMAC_HW_FEAT_AVSEL) >> 20;
  332. dma_cap->tsoen = (hw_cap & GMAC_HW_TSOEN) >> 18;
  333. dma_cap->sphen = (hw_cap & GMAC_HW_FEAT_SPHEN) >> 17;
  334. dma_cap->addr64 = (hw_cap & GMAC_HW_ADDR64) >> 14;
  335. switch (dma_cap->addr64) {
  336. case 0:
  337. dma_cap->addr64 = 32;
  338. break;
  339. case 1:
  340. dma_cap->addr64 = 40;
  341. break;
  342. case 2:
  343. dma_cap->addr64 = 48;
  344. break;
  345. default:
  346. dma_cap->addr64 = 32;
  347. break;
  348. }
  349. /* RX and TX FIFO sizes are encoded as log2(n / 128). Undo that by
  350. * shifting and store the sizes in bytes.
  351. */
  352. dma_cap->tx_fifo_size = 128 << ((hw_cap & GMAC_HW_TXFIFOSIZE) >> 6);
  353. dma_cap->rx_fifo_size = 128 << ((hw_cap & GMAC_HW_RXFIFOSIZE) >> 0);
  354. /* MAC HW feature2 */
  355. hw_cap = readl(ioaddr + GMAC_HW_FEATURE2);
  356. /* TX and RX number of channels */
  357. dma_cap->number_rx_channel =
  358. ((hw_cap & GMAC_HW_FEAT_RXCHCNT) >> 12) + 1;
  359. dma_cap->number_tx_channel =
  360. ((hw_cap & GMAC_HW_FEAT_TXCHCNT) >> 18) + 1;
  361. /* TX and RX number of queues */
  362. dma_cap->number_rx_queues =
  363. ((hw_cap & GMAC_HW_FEAT_RXQCNT) >> 0) + 1;
  364. dma_cap->number_tx_queues =
  365. ((hw_cap & GMAC_HW_FEAT_TXQCNT) >> 6) + 1;
  366. /* PPS output */
  367. dma_cap->pps_out_num = (hw_cap & GMAC_HW_FEAT_PPSOUTNUM) >> 24;
  368. /* IEEE 1588-2002 */
  369. dma_cap->time_stamp = 0;
  370. /* Number of Auxiliary Snapshot Inputs */
  371. dma_cap->aux_snapshot_n = (hw_cap & GMAC_HW_FEAT_AUXSNAPNUM) >> 28;
  372. /* MAC HW feature3 */
  373. hw_cap = readl(ioaddr + GMAC_HW_FEATURE3);
  374. /* 5.10 Features */
  375. dma_cap->asp = (hw_cap & GMAC_HW_FEAT_ASP) >> 28;
  376. dma_cap->tbssel = (hw_cap & GMAC_HW_FEAT_TBSSEL) >> 27;
  377. dma_cap->fpesel = (hw_cap & GMAC_HW_FEAT_FPESEL) >> 26;
  378. dma_cap->estwid = (hw_cap & GMAC_HW_FEAT_ESTWID) >> 20;
  379. dma_cap->estdep = (hw_cap & GMAC_HW_FEAT_ESTDEP) >> 17;
  380. dma_cap->estsel = (hw_cap & GMAC_HW_FEAT_ESTSEL) >> 16;
  381. dma_cap->frpes = (hw_cap & GMAC_HW_FEAT_FRPES) >> 13;
  382. dma_cap->frpbs = (hw_cap & GMAC_HW_FEAT_FRPBS) >> 11;
  383. dma_cap->frpsel = (hw_cap & GMAC_HW_FEAT_FRPSEL) >> 10;
  384. dma_cap->dvlan = (hw_cap & GMAC_HW_FEAT_DVLAN) >> 5;
  385. return 0;
  386. }
  387. /* Enable/disable TSO feature and set MSS */
  388. static void dwmac4_enable_tso(struct stmmac_priv *priv, void __iomem *ioaddr,
  389. bool en, u32 chan)
  390. {
  391. const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
  392. u32 value;
  393. if (en) {
  394. /* enable TSO */
  395. value = readl(ioaddr + DMA_CHAN_TX_CONTROL(dwmac4_addrs, chan));
  396. writel(value | DMA_CONTROL_TSE,
  397. ioaddr + DMA_CHAN_TX_CONTROL(dwmac4_addrs, chan));
  398. } else {
  399. /* enable TSO */
  400. value = readl(ioaddr + DMA_CHAN_TX_CONTROL(dwmac4_addrs, chan));
  401. writel(value & ~DMA_CONTROL_TSE,
  402. ioaddr + DMA_CHAN_TX_CONTROL(dwmac4_addrs, chan));
  403. }
  404. }
  405. static void dwmac4_qmode(struct stmmac_priv *priv, void __iomem *ioaddr,
  406. u32 channel, u8 qmode)
  407. {
  408. const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
  409. u32 mtl_tx_op = readl(ioaddr + MTL_CHAN_TX_OP_MODE(dwmac4_addrs,
  410. channel));
  411. mtl_tx_op &= ~MTL_OP_MODE_TXQEN_MASK;
  412. if (qmode != MTL_QUEUE_AVB)
  413. mtl_tx_op |= MTL_OP_MODE_TXQEN;
  414. else
  415. mtl_tx_op |= MTL_OP_MODE_TXQEN_AV;
  416. writel(mtl_tx_op, ioaddr + MTL_CHAN_TX_OP_MODE(dwmac4_addrs, channel));
  417. }
  418. static void dwmac4_set_bfsize(struct stmmac_priv *priv, void __iomem *ioaddr,
  419. int bfsize, u32 chan)
  420. {
  421. const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
  422. u32 value = readl(ioaddr + DMA_CHAN_RX_CONTROL(dwmac4_addrs, chan));
  423. value = u32_replace_bits(value, bfsize, DMA_RBSZ_MASK);
  424. writel(value, ioaddr + DMA_CHAN_RX_CONTROL(dwmac4_addrs, chan));
  425. }
  426. static void dwmac4_enable_sph(struct stmmac_priv *priv, void __iomem *ioaddr,
  427. bool en, u32 chan)
  428. {
  429. const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
  430. u32 value = readl(ioaddr + GMAC_EXT_CONFIG);
  431. value &= ~GMAC_CONFIG_HDSMS;
  432. value |= GMAC_CONFIG_HDSMS_256; /* Segment max 256 bytes */
  433. writel(value, ioaddr + GMAC_EXT_CONFIG);
  434. value = readl(ioaddr + GMAC_EXT_CFG1);
  435. value |= GMAC_CONFIG1_SPLM(1); /* Split mode set to L2OFST */
  436. value |= GMAC_CONFIG1_SAVE_EN; /* Enable Split AV mode */
  437. writel(value, ioaddr + GMAC_EXT_CFG1);
  438. value = readl(ioaddr + DMA_CHAN_CONTROL(dwmac4_addrs, chan));
  439. if (en)
  440. value |= DMA_CONTROL_SPH;
  441. else
  442. value &= ~DMA_CONTROL_SPH;
  443. writel(value, ioaddr + DMA_CHAN_CONTROL(dwmac4_addrs, chan));
  444. }
  445. static int dwmac4_enable_tbs(struct stmmac_priv *priv, void __iomem *ioaddr,
  446. bool en, u32 chan)
  447. {
  448. const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
  449. u32 value = readl(ioaddr + DMA_CHAN_TX_CONTROL(dwmac4_addrs, chan));
  450. if (en)
  451. value |= DMA_CONTROL_EDSE;
  452. else
  453. value &= ~DMA_CONTROL_EDSE;
  454. writel(value, ioaddr + DMA_CHAN_TX_CONTROL(dwmac4_addrs, chan));
  455. value = readl(ioaddr + DMA_CHAN_TX_CONTROL(dwmac4_addrs,
  456. chan)) & DMA_CONTROL_EDSE;
  457. if (en && !value)
  458. return -EIO;
  459. writel(DMA_TBS_DEF_FTOS, ioaddr + DMA_TBS_CTRL);
  460. return 0;
  461. }
  462. const struct stmmac_dma_ops dwmac4_dma_ops = {
  463. .reset = dwmac4_dma_reset,
  464. .init = dwmac4_dma_init,
  465. .init_chan = dwmac4_dma_init_channel,
  466. .init_rx_chan = dwmac4_dma_init_rx_chan,
  467. .init_tx_chan = dwmac4_dma_init_tx_chan,
  468. .axi = dwmac4_dma_axi,
  469. .dump_regs = dwmac4_dump_dma_regs,
  470. .dma_rx_mode = dwmac4_dma_rx_chan_op_mode,
  471. .dma_tx_mode = dwmac4_dma_tx_chan_op_mode,
  472. .enable_dma_irq = dwmac4_enable_dma_irq,
  473. .disable_dma_irq = dwmac4_disable_dma_irq,
  474. .start_tx = dwmac4_dma_start_tx,
  475. .stop_tx = dwmac4_dma_stop_tx,
  476. .start_rx = dwmac4_dma_start_rx,
  477. .stop_rx = dwmac4_dma_stop_rx,
  478. .dma_interrupt = dwmac4_dma_interrupt,
  479. .get_hw_feature = dwmac4_get_hw_feature,
  480. .rx_watchdog = dwmac4_rx_watchdog,
  481. .set_rx_ring_len = dwmac4_set_rx_ring_len,
  482. .set_tx_ring_len = dwmac4_set_tx_ring_len,
  483. .set_rx_tail_ptr = dwmac4_set_rx_tail_ptr,
  484. .set_tx_tail_ptr = dwmac4_set_tx_tail_ptr,
  485. .enable_tso = dwmac4_enable_tso,
  486. .qmode = dwmac4_qmode,
  487. .set_bfsize = dwmac4_set_bfsize,
  488. .enable_sph = dwmac4_enable_sph,
  489. };
  490. const struct stmmac_dma_ops dwmac410_dma_ops = {
  491. .reset = dwmac4_dma_reset,
  492. .init = dwmac4_dma_init,
  493. .init_chan = dwmac410_dma_init_channel,
  494. .init_rx_chan = dwmac4_dma_init_rx_chan,
  495. .init_tx_chan = dwmac4_dma_init_tx_chan,
  496. .axi = dwmac4_dma_axi,
  497. .dump_regs = dwmac4_dump_dma_regs,
  498. .dma_rx_mode = dwmac4_dma_rx_chan_op_mode,
  499. .dma_tx_mode = dwmac4_dma_tx_chan_op_mode,
  500. .enable_dma_irq = dwmac410_enable_dma_irq,
  501. .disable_dma_irq = dwmac4_disable_dma_irq,
  502. .start_tx = dwmac4_dma_start_tx,
  503. .stop_tx = dwmac4_dma_stop_tx,
  504. .start_rx = dwmac4_dma_start_rx,
  505. .stop_rx = dwmac4_dma_stop_rx,
  506. .dma_interrupt = dwmac4_dma_interrupt,
  507. .get_hw_feature = dwmac4_get_hw_feature,
  508. .rx_watchdog = dwmac4_rx_watchdog,
  509. .set_rx_ring_len = dwmac4_set_rx_ring_len,
  510. .set_tx_ring_len = dwmac4_set_tx_ring_len,
  511. .set_rx_tail_ptr = dwmac4_set_rx_tail_ptr,
  512. .set_tx_tail_ptr = dwmac4_set_tx_tail_ptr,
  513. .enable_tso = dwmac4_enable_tso,
  514. .qmode = dwmac4_qmode,
  515. .set_bfsize = dwmac4_set_bfsize,
  516. .enable_sph = dwmac4_enable_sph,
  517. .enable_tbs = dwmac4_enable_tbs,
  518. };