zynq_gem.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * (C) Copyright 2011 Michal Simek
  4. *
  5. * Michal SIMEK <monstr@monstr.eu>
  6. *
  7. * Based on Xilinx gmac driver:
  8. * (C) Copyright 2011 Xilinx
  9. */
  10. #include <clk.h>
  11. #include <common.h>
  12. #include <cpu_func.h>
  13. #include <dm.h>
  14. #include <generic-phy.h>
  15. #include <log.h>
  16. #include <net.h>
  17. #include <netdev.h>
  18. #include <config.h>
  19. #include <console.h>
  20. #include <malloc.h>
  21. #include <asm/cache.h>
  22. #include <asm/io.h>
  23. #include <phy.h>
  24. #include <reset.h>
  25. #include <miiphy.h>
  26. #include <wait_bit.h>
  27. #include <watchdog.h>
  28. #include <asm/system.h>
  29. #include <asm/arch/hardware.h>
  30. #include <asm/arch/sys_proto.h>
  31. #include <dm/device_compat.h>
  32. #include <linux/bitfield.h>
  33. #include <linux/bitops.h>
  34. #include <linux/err.h>
  35. #include <linux/errno.h>
  36. #include <eth_phy.h>
  37. #include <zynqmp_firmware.h>
  38. /* Bit/mask specification */
  39. #define ZYNQ_GEM_PHYMNTNC_OP_MASK 0x40020000 /* operation mask bits */
  40. #define ZYNQ_GEM_PHYMNTNC_OP_R_MASK 0x20000000 /* read operation */
  41. #define ZYNQ_GEM_PHYMNTNC_OP_W_MASK 0x10000000 /* write operation */
  42. #define ZYNQ_GEM_PHYMNTNC_PHYAD_SHIFT_MASK 23 /* Shift bits for PHYAD */
  43. #define ZYNQ_GEM_PHYMNTNC_PHREG_SHIFT_MASK 18 /* Shift bits for PHREG */
  44. #define ZYNQ_GEM_RXBUF_EOF_MASK 0x00008000 /* End of frame. */
  45. #define ZYNQ_GEM_RXBUF_SOF_MASK 0x00004000 /* Start of frame. */
  46. #define ZYNQ_GEM_RXBUF_LEN_MASK 0x00003FFF /* Mask for length field */
  47. #define ZYNQ_GEM_RXBUF_WRAP_MASK 0x00000002 /* Wrap bit, last BD */
  48. #define ZYNQ_GEM_RXBUF_NEW_MASK 0x00000001 /* Used bit.. */
  49. #define ZYNQ_GEM_RXBUF_ADD_MASK 0xFFFFFFFC /* Mask for address */
  50. /* Wrap bit, last descriptor */
  51. #define ZYNQ_GEM_TXBUF_WRAP_MASK 0x40000000
  52. #define ZYNQ_GEM_TXBUF_LAST_MASK 0x00008000 /* Last buffer */
  53. #define ZYNQ_GEM_TXBUF_USED_MASK 0x80000000 /* Used by Hw */
  54. #define ZYNQ_GEM_NWCTRL_TXEN_MASK 0x00000008 /* Enable transmit */
  55. #define ZYNQ_GEM_NWCTRL_RXEN_MASK 0x00000004 /* Enable receive */
  56. #define ZYNQ_GEM_NWCTRL_MDEN_MASK 0x00000010 /* Enable MDIO port */
  57. #define ZYNQ_GEM_NWCTRL_STARTTX_MASK 0x00000200 /* Start tx (tx_go) */
  58. #define ZYNQ_GEM_NWCFG_SPEED100 0x00000001 /* 100 Mbps operation */
  59. #define ZYNQ_GEM_NWCFG_SPEED1000 0x00000400 /* 1Gbps operation */
  60. #define ZYNQ_GEM_NWCFG_FDEN 0x00000002 /* Full Duplex mode */
  61. #define ZYNQ_GEM_NWCFG_FSREM 0x00020000 /* FCS removal */
  62. #define ZYNQ_GEM_NWCFG_SGMII_ENBL 0x08000000 /* SGMII Enable */
  63. #define ZYNQ_GEM_NWCFG_PCS_SEL 0x00000800 /* PCS select */
  64. #ifdef CONFIG_ARM64
  65. # define ZYNQ_GEM_DBUS_WIDTH (1 << 21) /* 64 bit bus */
  66. #else
  67. # define ZYNQ_GEM_DBUS_WIDTH (0 << 21) /* 32 bit bus */
  68. #endif
  69. #define ZYNQ_GEM_NWCFG_INIT (ZYNQ_GEM_DBUS_WIDTH | \
  70. ZYNQ_GEM_NWCFG_FDEN | \
  71. ZYNQ_GEM_NWCFG_FSREM)
  72. #define ZYNQ_GEM_NWSR_MDIOIDLE_MASK 0x00000004 /* PHY management idle */
  73. #define ZYNQ_GEM_DMACR_BLENGTH 0x00000004 /* INCR4 AHB bursts */
  74. /* Use full configured addressable space (8 Kb) */
  75. #define ZYNQ_GEM_DMACR_RXSIZE 0x00000300
  76. /* Use full configured addressable space (4 Kb) */
  77. #define ZYNQ_GEM_DMACR_TXSIZE 0x00000400
  78. /* Set with binary 00011000 to use 1536 byte(1*max length frame/buffer) */
  79. #define ZYNQ_GEM_DMACR_RXBUF 0x00180000
  80. #if defined(CONFIG_PHYS_64BIT)
  81. # define ZYNQ_GEM_DMA_BUS_WIDTH BIT(30) /* 64 bit bus */
  82. #else
  83. # define ZYNQ_GEM_DMA_BUS_WIDTH (0 << 30) /* 32 bit bus */
  84. #endif
  85. #define ZYNQ_GEM_DMACR_INIT (ZYNQ_GEM_DMACR_BLENGTH | \
  86. ZYNQ_GEM_DMACR_RXSIZE | \
  87. ZYNQ_GEM_DMACR_TXSIZE | \
  88. ZYNQ_GEM_DMACR_RXBUF | \
  89. ZYNQ_GEM_DMA_BUS_WIDTH)
  90. #define ZYNQ_GEM_TSR_DONE 0x00000020 /* Tx done mask */
  91. #define ZYNQ_GEM_PCS_CTL_ANEG_ENBL 0x1000
  92. #define ZYNQ_GEM_DCFG_DBG6_DMA_64B BIT(23)
  93. #define MDIO_IDLE_TIMEOUT_MS 100
  94. /* Use MII register 1 (MII status register) to detect PHY */
  95. #define PHY_DETECT_REG 1
  96. /* Mask used to verify certain PHY features (or register contents)
  97. * in the register above:
  98. * 0x1000: 10Mbps full duplex support
  99. * 0x0800: 10Mbps half duplex support
  100. * 0x0008: Auto-negotiation support
  101. */
  102. #define PHY_DETECT_MASK 0x1808
  103. /* PCS (SGMII) Link Status */
  104. #define ZYNQ_GEM_PCSSTATUS_LINK BIT(2)
  105. #define ZYNQ_GEM_PCSSTATUS_ANEG_COMPL BIT(5)
  106. /* TX BD status masks */
  107. #define ZYNQ_GEM_TXBUF_FRMLEN_MASK 0x000007ff
  108. #define ZYNQ_GEM_TXBUF_EXHAUSTED 0x08000000
  109. #define ZYNQ_GEM_TXBUF_UNDERRUN 0x10000000
  110. /* Clock frequencies for different speeds */
  111. #define ZYNQ_GEM_FREQUENCY_10 2500000UL
  112. #define ZYNQ_GEM_FREQUENCY_100 25000000UL
  113. #define ZYNQ_GEM_FREQUENCY_1000 125000000UL
  114. #define RXCLK_EN BIT(0)
  115. /* GEM specific constants for CLK. */
  116. #define GEM_CLK_DIV8 0
  117. #define GEM_CLK_DIV16 1
  118. #define GEM_CLK_DIV32 2
  119. #define GEM_CLK_DIV48 3
  120. #define GEM_CLK_DIV64 4
  121. #define GEM_CLK_DIV96 5
  122. #define GEM_CLK_DIV128 6
  123. #define GEM_CLK_DIV224 7
  124. #define GEM_MDC_SET(val) FIELD_PREP(GENMASK(20, 18), val)
  125. /* Device registers */
  126. struct zynq_gem_regs {
  127. u32 nwctrl; /* 0x0 - Network Control reg */
  128. u32 nwcfg; /* 0x4 - Network Config reg */
  129. u32 nwsr; /* 0x8 - Network Status reg */
  130. u32 reserved1;
  131. u32 dmacr; /* 0x10 - DMA Control reg */
  132. u32 txsr; /* 0x14 - TX Status reg */
  133. u32 rxqbase; /* 0x18 - RX Q Base address reg */
  134. u32 txqbase; /* 0x1c - TX Q Base address reg */
  135. u32 rxsr; /* 0x20 - RX Status reg */
  136. u32 reserved2[2];
  137. u32 idr; /* 0x2c - Interrupt Disable reg */
  138. u32 reserved3;
  139. u32 phymntnc; /* 0x34 - Phy Maintaince reg */
  140. u32 reserved4[18];
  141. u32 hashl; /* 0x80 - Hash Low address reg */
  142. u32 hashh; /* 0x84 - Hash High address reg */
  143. #define LADDR_LOW 0
  144. #define LADDR_HIGH 1
  145. u32 laddr[4][LADDR_HIGH + 1]; /* 0x8c - Specific1 addr low/high reg */
  146. u32 match[4]; /* 0xa8 - Type ID1 Match reg */
  147. u32 reserved6[18];
  148. #define STAT_SIZE 44
  149. u32 stat[STAT_SIZE]; /* 0x100 - Octects transmitted Low reg */
  150. u32 reserved9[20];
  151. u32 pcscntrl;
  152. u32 pcsstatus;
  153. u32 rserved12[35];
  154. u32 dcfg6; /* 0x294 Design config reg6 */
  155. u32 reserved7[106];
  156. u32 transmit_q1_ptr; /* 0x440 - Transmit priority queue 1 */
  157. u32 reserved8[15];
  158. u32 receive_q1_ptr; /* 0x480 - Receive priority queue 1 */
  159. u32 reserved10[17];
  160. u32 upper_txqbase; /* 0x4C8 - Upper tx_q base addr */
  161. u32 reserved11[2];
  162. u32 upper_rxqbase; /* 0x4D4 - Upper rx_q base addr */
  163. };
  164. /* BD descriptors */
  165. struct emac_bd {
  166. u32 addr; /* Next descriptor pointer */
  167. u32 status;
  168. #if defined(CONFIG_PHYS_64BIT)
  169. u32 addr_hi;
  170. u32 reserved;
  171. #endif
  172. };
  173. /* Reduce amount of BUFs if you have limited amount of memory */
  174. #define RX_BUF 32
  175. /* Page table entries are set to 1MB, or multiples of 1MB
  176. * (not < 1MB). driver uses less bd's so use 1MB bdspace.
  177. */
  178. #define BD_SPACE 0x100000
  179. /* BD separation space */
  180. #define BD_SEPRN_SPACE (RX_BUF * sizeof(struct emac_bd))
  181. /* Setup the first free TX descriptor */
  182. #define TX_FREE_DESC 2
  183. /* Initialized, rxbd_current, rx_first_buf must be 0 after init */
  184. struct zynq_gem_priv {
  185. struct emac_bd *tx_bd;
  186. struct emac_bd *rx_bd;
  187. char *rxbuffers;
  188. u32 rxbd_current;
  189. u32 rx_first_buf;
  190. int phyaddr;
  191. int init;
  192. struct zynq_gem_regs *iobase;
  193. struct zynq_gem_regs *mdiobase;
  194. phy_interface_t interface;
  195. struct phy_device *phydev;
  196. ofnode phy_of_node;
  197. struct mii_dev *bus;
  198. struct clk rx_clk;
  199. struct clk tx_clk;
  200. struct clk pclk;
  201. u32 max_speed;
  202. bool int_pcs;
  203. bool dma_64bit;
  204. u32 clk_en_info;
  205. struct reset_ctl_bulk resets;
  206. };
  207. static int phy_setup_op(struct zynq_gem_priv *priv, u32 phy_addr, u32 regnum,
  208. u32 op, u16 *data)
  209. {
  210. u32 mgtcr;
  211. struct zynq_gem_regs *regs = priv->mdiobase;
  212. int err;
  213. err = wait_for_bit_le32(&regs->nwsr, ZYNQ_GEM_NWSR_MDIOIDLE_MASK,
  214. true, MDIO_IDLE_TIMEOUT_MS, false);
  215. if (err)
  216. return err;
  217. /* Construct mgtcr mask for the operation */
  218. mgtcr = ZYNQ_GEM_PHYMNTNC_OP_MASK | op |
  219. (phy_addr << ZYNQ_GEM_PHYMNTNC_PHYAD_SHIFT_MASK) |
  220. (regnum << ZYNQ_GEM_PHYMNTNC_PHREG_SHIFT_MASK) | *data;
  221. /* Write mgtcr and wait for completion */
  222. writel(mgtcr, &regs->phymntnc);
  223. err = wait_for_bit_le32(&regs->nwsr, ZYNQ_GEM_NWSR_MDIOIDLE_MASK,
  224. true, MDIO_IDLE_TIMEOUT_MS, false);
  225. if (err)
  226. return err;
  227. if (op == ZYNQ_GEM_PHYMNTNC_OP_R_MASK)
  228. *data = readl(&regs->phymntnc);
  229. return 0;
  230. }
  231. static int phyread(struct zynq_gem_priv *priv, u32 phy_addr,
  232. u32 regnum, u16 *val)
  233. {
  234. int ret;
  235. ret = phy_setup_op(priv, phy_addr, regnum,
  236. ZYNQ_GEM_PHYMNTNC_OP_R_MASK, val);
  237. if (!ret)
  238. debug("%s: phy_addr %d, regnum 0x%x, val 0x%x\n", __func__,
  239. phy_addr, regnum, *val);
  240. return ret;
  241. }
  242. static int phywrite(struct zynq_gem_priv *priv, u32 phy_addr,
  243. u32 regnum, u16 data)
  244. {
  245. debug("%s: phy_addr %d, regnum 0x%x, data 0x%x\n", __func__, phy_addr,
  246. regnum, data);
  247. return phy_setup_op(priv, phy_addr, regnum,
  248. ZYNQ_GEM_PHYMNTNC_OP_W_MASK, &data);
  249. }
  250. static int zynq_gem_setup_mac(struct udevice *dev)
  251. {
  252. u32 i, macaddrlow, macaddrhigh;
  253. struct eth_pdata *pdata = dev_get_plat(dev);
  254. struct zynq_gem_priv *priv = dev_get_priv(dev);
  255. struct zynq_gem_regs *regs = priv->iobase;
  256. /* Set the MAC bits [31:0] in BOT */
  257. macaddrlow = pdata->enetaddr[0];
  258. macaddrlow |= pdata->enetaddr[1] << 8;
  259. macaddrlow |= pdata->enetaddr[2] << 16;
  260. macaddrlow |= pdata->enetaddr[3] << 24;
  261. /* Set MAC bits [47:32] in TOP */
  262. macaddrhigh = pdata->enetaddr[4];
  263. macaddrhigh |= pdata->enetaddr[5] << 8;
  264. for (i = 0; i < 4; i++) {
  265. writel(0, &regs->laddr[i][LADDR_LOW]);
  266. writel(0, &regs->laddr[i][LADDR_HIGH]);
  267. /* Do not use MATCHx register */
  268. writel(0, &regs->match[i]);
  269. }
  270. writel(macaddrlow, &regs->laddr[0][LADDR_LOW]);
  271. writel(macaddrhigh, &regs->laddr[0][LADDR_HIGH]);
  272. return 0;
  273. }
  274. static int zynq_phy_init(struct udevice *dev)
  275. {
  276. int ret;
  277. struct zynq_gem_priv *priv = dev_get_priv(dev);
  278. struct zynq_gem_regs *regs_mdio = priv->mdiobase;
  279. const u32 supported = SUPPORTED_10baseT_Half |
  280. SUPPORTED_10baseT_Full |
  281. SUPPORTED_100baseT_Half |
  282. SUPPORTED_100baseT_Full |
  283. SUPPORTED_1000baseT_Half |
  284. SUPPORTED_1000baseT_Full;
  285. /* Enable only MDIO bus */
  286. writel(ZYNQ_GEM_NWCTRL_MDEN_MASK, &regs_mdio->nwctrl);
  287. if (IS_ENABLED(CONFIG_DM_ETH_PHY))
  288. priv->phyaddr = eth_phy_get_addr(dev);
  289. priv->phydev = phy_connect(priv->bus, priv->phyaddr, dev,
  290. priv->interface);
  291. if (IS_ERR_OR_NULL(priv->phydev))
  292. return -ENODEV;
  293. if (priv->max_speed) {
  294. ret = phy_set_supported(priv->phydev, priv->max_speed);
  295. if (ret)
  296. return ret;
  297. }
  298. priv->phydev->supported &= supported | ADVERTISED_Pause |
  299. ADVERTISED_Asym_Pause;
  300. priv->phydev->advertising = priv->phydev->supported;
  301. if (!ofnode_valid(priv->phydev->node))
  302. priv->phydev->node = priv->phy_of_node;
  303. return phy_config(priv->phydev);
  304. }
  305. static u32 gem_mdc_clk_div(struct zynq_gem_priv *priv)
  306. {
  307. u32 config;
  308. unsigned long pclk_hz;
  309. pclk_hz = clk_get_rate(&priv->pclk);
  310. if (pclk_hz <= 20000000)
  311. config = GEM_MDC_SET(GEM_CLK_DIV8);
  312. else if (pclk_hz <= 40000000)
  313. config = GEM_MDC_SET(GEM_CLK_DIV16);
  314. else if (pclk_hz <= 80000000)
  315. config = GEM_MDC_SET(GEM_CLK_DIV32);
  316. else if (pclk_hz <= 120000000)
  317. config = GEM_MDC_SET(GEM_CLK_DIV48);
  318. else if (pclk_hz <= 160000000)
  319. config = GEM_MDC_SET(GEM_CLK_DIV64);
  320. else if (pclk_hz <= 240000000)
  321. config = GEM_MDC_SET(GEM_CLK_DIV96);
  322. else if (pclk_hz <= 320000000)
  323. config = GEM_MDC_SET(GEM_CLK_DIV128);
  324. else
  325. config = GEM_MDC_SET(GEM_CLK_DIV224);
  326. return config;
  327. }
  328. static int zynq_gem_init(struct udevice *dev)
  329. {
  330. u32 i, nwconfig;
  331. int ret;
  332. unsigned long clk_rate = 0;
  333. struct zynq_gem_priv *priv = dev_get_priv(dev);
  334. struct zynq_gem_regs *regs = priv->iobase;
  335. struct zynq_gem_regs *regs_mdio = priv->mdiobase;
  336. struct emac_bd *dummy_tx_bd = &priv->tx_bd[TX_FREE_DESC];
  337. struct emac_bd *dummy_rx_bd = &priv->tx_bd[TX_FREE_DESC + 2];
  338. if (readl(&regs->dcfg6) & ZYNQ_GEM_DCFG_DBG6_DMA_64B)
  339. priv->dma_64bit = true;
  340. else
  341. priv->dma_64bit = false;
  342. #if defined(CONFIG_PHYS_64BIT)
  343. if (!priv->dma_64bit) {
  344. printf("ERR: %s: Using 64-bit DMA but HW doesn't support it\n",
  345. __func__);
  346. return -EINVAL;
  347. }
  348. #else
  349. if (priv->dma_64bit)
  350. debug("WARN: %s: Not using 64-bit dma even HW supports it\n",
  351. __func__);
  352. #endif
  353. if (!priv->init) {
  354. /* Disable all interrupts */
  355. writel(0xFFFFFFFF, &regs->idr);
  356. /* Disable the receiver & transmitter */
  357. writel(0, &regs->nwctrl);
  358. writel(0, &regs->txsr);
  359. writel(0, &regs->rxsr);
  360. writel(0, &regs->phymntnc);
  361. /* Clear the Hash registers for the mac address
  362. * pointed by AddressPtr
  363. */
  364. writel(0x0, &regs->hashl);
  365. /* Write bits [63:32] in TOP */
  366. writel(0x0, &regs->hashh);
  367. /* Clear all counters */
  368. for (i = 0; i < STAT_SIZE; i++)
  369. readl(&regs->stat[i]);
  370. /* Setup RxBD space */
  371. memset(priv->rx_bd, 0, RX_BUF * sizeof(struct emac_bd));
  372. for (i = 0; i < RX_BUF; i++) {
  373. priv->rx_bd[i].status = 0xF0000000;
  374. priv->rx_bd[i].addr =
  375. (lower_32_bits((ulong)(priv->rxbuffers)
  376. + (i * PKTSIZE_ALIGN)));
  377. #if defined(CONFIG_PHYS_64BIT)
  378. priv->rx_bd[i].addr_hi =
  379. (upper_32_bits((ulong)(priv->rxbuffers)
  380. + (i * PKTSIZE_ALIGN)));
  381. #endif
  382. }
  383. /* WRAP bit to last BD */
  384. priv->rx_bd[--i].addr |= ZYNQ_GEM_RXBUF_WRAP_MASK;
  385. /* Write RxBDs to IP */
  386. writel(lower_32_bits((ulong)priv->rx_bd), &regs->rxqbase);
  387. #if defined(CONFIG_PHYS_64BIT)
  388. writel(upper_32_bits((ulong)priv->rx_bd), &regs->upper_rxqbase);
  389. #endif
  390. /* Setup for DMA Configuration register */
  391. writel(ZYNQ_GEM_DMACR_INIT, &regs->dmacr);
  392. /* Setup for Network Control register, MDIO, Rx and Tx enable */
  393. setbits_le32(&regs_mdio->nwctrl, ZYNQ_GEM_NWCTRL_MDEN_MASK);
  394. /* Disable the second priority queue */
  395. dummy_tx_bd->addr = 0;
  396. #if defined(CONFIG_PHYS_64BIT)
  397. dummy_tx_bd->addr_hi = 0;
  398. #endif
  399. dummy_tx_bd->status = ZYNQ_GEM_TXBUF_WRAP_MASK |
  400. ZYNQ_GEM_TXBUF_LAST_MASK|
  401. ZYNQ_GEM_TXBUF_USED_MASK;
  402. dummy_rx_bd->addr = ZYNQ_GEM_RXBUF_WRAP_MASK |
  403. ZYNQ_GEM_RXBUF_NEW_MASK;
  404. #if defined(CONFIG_PHYS_64BIT)
  405. dummy_rx_bd->addr_hi = 0;
  406. #endif
  407. dummy_rx_bd->status = 0;
  408. writel((ulong)dummy_tx_bd, &regs->transmit_q1_ptr);
  409. writel((ulong)dummy_rx_bd, &regs->receive_q1_ptr);
  410. priv->init++;
  411. }
  412. ret = phy_startup(priv->phydev);
  413. if (ret)
  414. return ret;
  415. if (!priv->phydev->link) {
  416. printf("%s: No link.\n", priv->phydev->dev->name);
  417. return -1;
  418. }
  419. nwconfig = gem_mdc_clk_div(priv);
  420. nwconfig |= ZYNQ_GEM_NWCFG_INIT;
  421. /*
  422. * Set SGMII enable PCS selection only if internal PCS/PMA
  423. * core is used and interface is SGMII.
  424. */
  425. if (priv->interface == PHY_INTERFACE_MODE_SGMII &&
  426. priv->int_pcs) {
  427. nwconfig |= ZYNQ_GEM_NWCFG_SGMII_ENBL |
  428. ZYNQ_GEM_NWCFG_PCS_SEL;
  429. }
  430. switch (priv->phydev->speed) {
  431. case SPEED_1000:
  432. writel(nwconfig | ZYNQ_GEM_NWCFG_SPEED1000,
  433. &regs->nwcfg);
  434. clk_rate = ZYNQ_GEM_FREQUENCY_1000;
  435. break;
  436. case SPEED_100:
  437. writel(nwconfig | ZYNQ_GEM_NWCFG_SPEED100,
  438. &regs->nwcfg);
  439. clk_rate = ZYNQ_GEM_FREQUENCY_100;
  440. break;
  441. case SPEED_10:
  442. clk_rate = ZYNQ_GEM_FREQUENCY_10;
  443. break;
  444. }
  445. #ifdef CONFIG_ARM64
  446. if (priv->interface == PHY_INTERFACE_MODE_SGMII &&
  447. priv->int_pcs) {
  448. /*
  449. * Disable AN for fixed link configuration, enable otherwise.
  450. * Must be written after PCS_SEL is set in nwconfig,
  451. * otherwise writes will not take effect.
  452. */
  453. if (priv->phydev->phy_id != PHY_FIXED_ID) {
  454. writel(readl(&regs->pcscntrl) | ZYNQ_GEM_PCS_CTL_ANEG_ENBL,
  455. &regs->pcscntrl);
  456. /*
  457. * When the PHY link is already up, the PCS link needs
  458. * to get re-checked
  459. */
  460. if (priv->phydev->link) {
  461. u32 pcsstatus;
  462. pcsstatus = ZYNQ_GEM_PCSSTATUS_LINK |
  463. ZYNQ_GEM_PCSSTATUS_ANEG_COMPL;
  464. ret = wait_for_bit_le32(&regs->pcsstatus,
  465. pcsstatus,
  466. true, 5000, true);
  467. if (ret) {
  468. dev_warn(dev,
  469. "no PCS (SGMII) link\n");
  470. } else {
  471. /*
  472. * Some additional minimal delay seems
  473. * to be needed so that the first
  474. * packet will be sent correctly
  475. */
  476. mdelay(1);
  477. }
  478. }
  479. } else {
  480. writel(readl(&regs->pcscntrl) & ~ZYNQ_GEM_PCS_CTL_ANEG_ENBL,
  481. &regs->pcscntrl);
  482. }
  483. }
  484. #endif
  485. ret = clk_get_rate(&priv->tx_clk);
  486. if (ret != clk_rate) {
  487. ret = clk_set_rate(&priv->tx_clk, clk_rate);
  488. if (IS_ERR_VALUE(ret)) {
  489. dev_err(dev, "failed to set tx clock rate %ld\n", clk_rate);
  490. return ret;
  491. }
  492. }
  493. ret = clk_enable(&priv->tx_clk);
  494. if (ret) {
  495. dev_err(dev, "failed to enable tx clock\n");
  496. return ret;
  497. }
  498. if (priv->clk_en_info & RXCLK_EN) {
  499. ret = clk_enable(&priv->rx_clk);
  500. if (ret) {
  501. dev_err(dev, "failed to enable rx clock\n");
  502. return ret;
  503. }
  504. }
  505. setbits_le32(&regs->nwctrl, ZYNQ_GEM_NWCTRL_RXEN_MASK |
  506. ZYNQ_GEM_NWCTRL_TXEN_MASK);
  507. return 0;
  508. }
  509. static int zynq_gem_send(struct udevice *dev, void *ptr, int len)
  510. {
  511. dma_addr_t addr;
  512. u32 size;
  513. struct zynq_gem_priv *priv = dev_get_priv(dev);
  514. struct zynq_gem_regs *regs = priv->iobase;
  515. struct emac_bd *current_bd = &priv->tx_bd[1];
  516. /* Setup Tx BD */
  517. memset(priv->tx_bd, 0, sizeof(struct emac_bd));
  518. priv->tx_bd->addr = lower_32_bits((ulong)ptr);
  519. #if defined(CONFIG_PHYS_64BIT)
  520. priv->tx_bd->addr_hi = upper_32_bits((ulong)ptr);
  521. #endif
  522. priv->tx_bd->status = (len & ZYNQ_GEM_TXBUF_FRMLEN_MASK) |
  523. ZYNQ_GEM_TXBUF_LAST_MASK;
  524. /* Dummy descriptor to mark it as the last in descriptor chain */
  525. current_bd->addr = 0x0;
  526. #if defined(CONFIG_PHYS_64BIT)
  527. current_bd->addr_hi = 0x0;
  528. #endif
  529. current_bd->status = ZYNQ_GEM_TXBUF_WRAP_MASK |
  530. ZYNQ_GEM_TXBUF_LAST_MASK|
  531. ZYNQ_GEM_TXBUF_USED_MASK;
  532. /* setup BD */
  533. writel(lower_32_bits((ulong)priv->tx_bd), &regs->txqbase);
  534. #if defined(CONFIG_PHYS_64BIT)
  535. writel(upper_32_bits((ulong)priv->tx_bd), &regs->upper_txqbase);
  536. #endif
  537. addr = (ulong) ptr;
  538. addr &= ~(ARCH_DMA_MINALIGN - 1);
  539. size = roundup(len, ARCH_DMA_MINALIGN);
  540. flush_dcache_range(addr, addr + size);
  541. barrier();
  542. /* Start transmit */
  543. setbits_le32(&regs->nwctrl, ZYNQ_GEM_NWCTRL_STARTTX_MASK);
  544. /* Read TX BD status */
  545. if (priv->tx_bd->status & ZYNQ_GEM_TXBUF_EXHAUSTED)
  546. printf("TX buffers exhausted in mid frame\n");
  547. return wait_for_bit_le32(&regs->txsr, ZYNQ_GEM_TSR_DONE,
  548. true, 20000, true);
  549. }
  550. /* Do not check frame_recd flag in rx_status register 0x20 - just poll BD */
  551. static int zynq_gem_recv(struct udevice *dev, int flags, uchar **packetp)
  552. {
  553. int frame_len;
  554. dma_addr_t addr;
  555. struct zynq_gem_priv *priv = dev_get_priv(dev);
  556. struct emac_bd *current_bd = &priv->rx_bd[priv->rxbd_current];
  557. if (!(current_bd->addr & ZYNQ_GEM_RXBUF_NEW_MASK))
  558. return -1;
  559. if (!(current_bd->status &
  560. (ZYNQ_GEM_RXBUF_SOF_MASK | ZYNQ_GEM_RXBUF_EOF_MASK))) {
  561. printf("GEM: SOF or EOF not set for last buffer received!\n");
  562. return -1;
  563. }
  564. frame_len = current_bd->status & ZYNQ_GEM_RXBUF_LEN_MASK;
  565. if (!frame_len) {
  566. printf("%s: Zero size packet?\n", __func__);
  567. return -1;
  568. }
  569. #if defined(CONFIG_PHYS_64BIT)
  570. addr = (dma_addr_t)((current_bd->addr & ZYNQ_GEM_RXBUF_ADD_MASK)
  571. | ((dma_addr_t)current_bd->addr_hi << 32));
  572. #else
  573. addr = current_bd->addr & ZYNQ_GEM_RXBUF_ADD_MASK;
  574. #endif
  575. addr &= ~(ARCH_DMA_MINALIGN - 1);
  576. *packetp = (uchar *)(uintptr_t)addr;
  577. invalidate_dcache_range(addr, addr + roundup(PKTSIZE_ALIGN, ARCH_DMA_MINALIGN));
  578. barrier();
  579. return frame_len;
  580. }
  581. static int zynq_gem_free_pkt(struct udevice *dev, uchar *packet, int length)
  582. {
  583. struct zynq_gem_priv *priv = dev_get_priv(dev);
  584. struct emac_bd *current_bd = &priv->rx_bd[priv->rxbd_current];
  585. struct emac_bd *first_bd;
  586. dma_addr_t addr;
  587. if (current_bd->status & ZYNQ_GEM_RXBUF_SOF_MASK) {
  588. priv->rx_first_buf = priv->rxbd_current;
  589. } else {
  590. current_bd->addr &= ~ZYNQ_GEM_RXBUF_NEW_MASK;
  591. current_bd->status = 0xF0000000; /* FIXME */
  592. }
  593. if (current_bd->status & ZYNQ_GEM_RXBUF_EOF_MASK) {
  594. first_bd = &priv->rx_bd[priv->rx_first_buf];
  595. first_bd->addr &= ~ZYNQ_GEM_RXBUF_NEW_MASK;
  596. first_bd->status = 0xF0000000;
  597. }
  598. /* Flush the cache for the packet as well */
  599. #if defined(CONFIG_PHYS_64BIT)
  600. addr = (dma_addr_t)((current_bd->addr & ZYNQ_GEM_RXBUF_ADD_MASK)
  601. | ((dma_addr_t)current_bd->addr_hi << 32));
  602. #else
  603. addr = current_bd->addr & ZYNQ_GEM_RXBUF_ADD_MASK;
  604. #endif
  605. flush_dcache_range(addr, addr + roundup(PKTSIZE_ALIGN,
  606. ARCH_DMA_MINALIGN));
  607. barrier();
  608. if ((++priv->rxbd_current) >= RX_BUF)
  609. priv->rxbd_current = 0;
  610. return 0;
  611. }
  612. static void zynq_gem_halt(struct udevice *dev)
  613. {
  614. struct zynq_gem_priv *priv = dev_get_priv(dev);
  615. struct zynq_gem_regs *regs = priv->iobase;
  616. clrsetbits_le32(&regs->nwctrl, ZYNQ_GEM_NWCTRL_RXEN_MASK |
  617. ZYNQ_GEM_NWCTRL_TXEN_MASK, 0);
  618. }
  619. static int zynq_gem_miiphy_read(struct mii_dev *bus, int addr,
  620. int devad, int reg)
  621. {
  622. struct zynq_gem_priv *priv = bus->priv;
  623. int ret;
  624. u16 val = 0;
  625. ret = phyread(priv, addr, reg, &val);
  626. debug("%s 0x%x, 0x%x, 0x%x, 0x%x\n", __func__, addr, reg, val, ret);
  627. return val;
  628. }
  629. static int zynq_gem_miiphy_write(struct mii_dev *bus, int addr, int devad,
  630. int reg, u16 value)
  631. {
  632. struct zynq_gem_priv *priv = bus->priv;
  633. debug("%s 0x%x, 0x%x, 0x%x\n", __func__, addr, reg, value);
  634. return phywrite(priv, addr, reg, value);
  635. }
  636. static int zynq_gem_reset_init(struct udevice *dev)
  637. {
  638. struct zynq_gem_priv *priv = dev_get_priv(dev);
  639. int ret;
  640. ret = reset_get_bulk(dev, &priv->resets);
  641. if (ret == -ENOTSUPP || ret == -ENOENT)
  642. return 0;
  643. else if (ret)
  644. return ret;
  645. ret = reset_deassert_bulk(&priv->resets);
  646. if (ret) {
  647. reset_release_bulk(&priv->resets);
  648. return ret;
  649. }
  650. return 0;
  651. }
  652. static int gem_zynqmp_set_dynamic_config(struct udevice *dev)
  653. {
  654. u32 pm_info[2];
  655. int ret;
  656. if (IS_ENABLED(CONFIG_ARCH_ZYNQMP) && IS_ENABLED(CONFIG_ZYNQMP_FIRMWARE)) {
  657. if (!zynqmp_pm_is_function_supported(PM_IOCTL,
  658. IOCTL_SET_GEM_CONFIG)) {
  659. ret = ofnode_read_u32_array(dev_ofnode(dev),
  660. "power-domains",
  661. pm_info,
  662. ARRAY_SIZE(pm_info));
  663. if (ret) {
  664. dev_err(dev,
  665. "Failed to read power-domains info\n");
  666. return ret;
  667. }
  668. ret = zynqmp_pm_set_gem_config(pm_info[1],
  669. GEM_CONFIG_FIXED, 0);
  670. if (ret)
  671. return ret;
  672. ret = zynqmp_pm_set_gem_config(pm_info[1],
  673. GEM_CONFIG_SGMII_MODE,
  674. 1);
  675. if (ret)
  676. return ret;
  677. }
  678. }
  679. return 0;
  680. }
  681. static int zynq_gem_probe(struct udevice *dev)
  682. {
  683. void *bd_space;
  684. struct zynq_gem_priv *priv = dev_get_priv(dev);
  685. int ret;
  686. struct phy phy;
  687. if (priv->interface == PHY_INTERFACE_MODE_SGMII) {
  688. ret = generic_phy_get_by_index(dev, 0, &phy);
  689. if (!ret) {
  690. ret = generic_phy_init(&phy);
  691. if (ret)
  692. return ret;
  693. } else if (ret != -ENOENT) {
  694. debug("could not get phy (err %d)\n", ret);
  695. return ret;
  696. }
  697. }
  698. ret = zynq_gem_reset_init(dev);
  699. if (ret)
  700. return ret;
  701. /* Align rxbuffers to ARCH_DMA_MINALIGN */
  702. priv->rxbuffers = memalign(ARCH_DMA_MINALIGN, RX_BUF * PKTSIZE_ALIGN);
  703. if (!priv->rxbuffers)
  704. return -ENOMEM;
  705. memset(priv->rxbuffers, 0, RX_BUF * PKTSIZE_ALIGN);
  706. ulong addr = (ulong)priv->rxbuffers;
  707. flush_dcache_range(addr, addr + roundup(RX_BUF * PKTSIZE_ALIGN, ARCH_DMA_MINALIGN));
  708. barrier();
  709. /* Align bd_space to MMU_SECTION_SHIFT */
  710. bd_space = memalign(1 << MMU_SECTION_SHIFT, BD_SPACE);
  711. if (!bd_space) {
  712. ret = -ENOMEM;
  713. goto err1;
  714. }
  715. mmu_set_region_dcache_behaviour((phys_addr_t)bd_space,
  716. BD_SPACE, DCACHE_OFF);
  717. /* Initialize the bd spaces for tx and rx bd's */
  718. priv->tx_bd = (struct emac_bd *)bd_space;
  719. priv->rx_bd = (struct emac_bd *)((ulong)bd_space + BD_SEPRN_SPACE);
  720. ret = clk_get_by_name(dev, "tx_clk", &priv->tx_clk);
  721. if (ret < 0) {
  722. dev_err(dev, "failed to get tx_clock\n");
  723. goto err2;
  724. }
  725. if (priv->clk_en_info & RXCLK_EN) {
  726. ret = clk_get_by_name(dev, "rx_clk", &priv->rx_clk);
  727. if (ret < 0) {
  728. dev_err(dev, "failed to get rx_clock\n");
  729. goto err2;
  730. }
  731. }
  732. ret = clk_get_by_name(dev, "pclk", &priv->pclk);
  733. if (ret < 0) {
  734. dev_err(dev, "failed to get pclk clock\n");
  735. goto err2;
  736. }
  737. if (IS_ENABLED(CONFIG_DM_ETH_PHY))
  738. priv->bus = eth_phy_get_mdio_bus(dev);
  739. if (!priv->bus) {
  740. priv->bus = mdio_alloc();
  741. priv->bus->read = zynq_gem_miiphy_read;
  742. priv->bus->write = zynq_gem_miiphy_write;
  743. priv->bus->priv = priv;
  744. ret = mdio_register_seq(priv->bus, dev_seq(dev));
  745. if (ret)
  746. goto err2;
  747. }
  748. if (IS_ENABLED(CONFIG_DM_ETH_PHY))
  749. eth_phy_set_mdio_bus(dev, priv->bus);
  750. ret = zynq_phy_init(dev);
  751. if (ret)
  752. goto err3;
  753. if (priv->interface == PHY_INTERFACE_MODE_SGMII && phy.dev) {
  754. if (IS_ENABLED(CONFIG_DM_ETH_PHY)) {
  755. if (device_is_compatible(dev, "cdns,zynqmp-gem") ||
  756. device_is_compatible(dev, "xlnx,zynqmp-gem")) {
  757. ret = gem_zynqmp_set_dynamic_config(dev);
  758. if (ret) {
  759. dev_err
  760. (dev,
  761. "Failed to set gem dynamic config\n");
  762. return ret;
  763. }
  764. }
  765. }
  766. ret = generic_phy_power_on(&phy);
  767. if (ret)
  768. return ret;
  769. }
  770. printf("\nZYNQ GEM: %lx, mdio bus %lx, phyaddr %d, interface %s\n",
  771. (ulong)priv->iobase, (ulong)priv->mdiobase, priv->phydev->addr,
  772. phy_string_for_interface(priv->interface));
  773. return ret;
  774. err3:
  775. mdio_unregister(priv->bus);
  776. err2:
  777. free(priv->tx_bd);
  778. err1:
  779. free(priv->rxbuffers);
  780. return ret;
  781. }
  782. static int zynq_gem_remove(struct udevice *dev)
  783. {
  784. struct zynq_gem_priv *priv = dev_get_priv(dev);
  785. free(priv->phydev);
  786. mdio_unregister(priv->bus);
  787. mdio_free(priv->bus);
  788. return 0;
  789. }
  790. static const struct eth_ops zynq_gem_ops = {
  791. .start = zynq_gem_init,
  792. .send = zynq_gem_send,
  793. .recv = zynq_gem_recv,
  794. .free_pkt = zynq_gem_free_pkt,
  795. .stop = zynq_gem_halt,
  796. .write_hwaddr = zynq_gem_setup_mac,
  797. };
  798. static int zynq_gem_of_to_plat(struct udevice *dev)
  799. {
  800. struct eth_pdata *pdata = dev_get_plat(dev);
  801. struct zynq_gem_priv *priv = dev_get_priv(dev);
  802. struct ofnode_phandle_args phandle_args;
  803. pdata->iobase = (phys_addr_t)dev_read_addr(dev);
  804. priv->iobase = (struct zynq_gem_regs *)pdata->iobase;
  805. priv->mdiobase = priv->iobase;
  806. /* Hardcode for now */
  807. priv->phyaddr = -1;
  808. if (!dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0,
  809. &phandle_args)) {
  810. fdt_addr_t addr;
  811. ofnode parent;
  812. debug("phy-handle does exist %s\n", dev->name);
  813. if (!(IS_ENABLED(CONFIG_DM_ETH_PHY)))
  814. priv->phyaddr = ofnode_read_u32_default
  815. (phandle_args.node, "reg", -1);
  816. priv->phy_of_node = phandle_args.node;
  817. priv->max_speed = ofnode_read_u32_default(phandle_args.node,
  818. "max-speed",
  819. SPEED_1000);
  820. parent = ofnode_get_parent(phandle_args.node);
  821. if (ofnode_name_eq(parent, "mdio"))
  822. parent = ofnode_get_parent(parent);
  823. addr = ofnode_get_addr(parent);
  824. if (addr != FDT_ADDR_T_NONE) {
  825. debug("MDIO bus not found %s\n", dev->name);
  826. priv->mdiobase = (struct zynq_gem_regs *)addr;
  827. }
  828. }
  829. pdata->phy_interface = dev_read_phy_mode(dev);
  830. if (pdata->phy_interface == PHY_INTERFACE_MODE_NA)
  831. return -EINVAL;
  832. priv->interface = pdata->phy_interface;
  833. priv->int_pcs = dev_read_bool(dev, "is-internal-pcspma");
  834. priv->clk_en_info = dev_get_driver_data(dev);
  835. return 0;
  836. }
  837. static const struct udevice_id zynq_gem_ids[] = {
  838. { .compatible = "xlnx,versal-gem", .data = RXCLK_EN },
  839. { .compatible = "cdns,versal-gem", .data = RXCLK_EN },
  840. { .compatible = "xlnx,zynqmp-gem" },
  841. { .compatible = "cdns,zynqmp-gem" },
  842. { .compatible = "xlnx,zynq-gem" },
  843. { .compatible = "cdns,zynq-gem" },
  844. { .compatible = "cdns,gem" },
  845. { }
  846. };
  847. U_BOOT_DRIVER(zynq_gem) = {
  848. .name = "zynq_gem",
  849. .id = UCLASS_ETH,
  850. .of_match = zynq_gem_ids,
  851. .of_to_plat = zynq_gem_of_to_plat,
  852. .probe = zynq_gem_probe,
  853. .remove = zynq_gem_remove,
  854. .ops = &zynq_gem_ops,
  855. .priv_auto = sizeof(struct zynq_gem_priv),
  856. .plat_auto = sizeof(struct eth_pdata),
  857. };