fgmac_hw.h 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554
  1. /*
  2. * Copyright : (C) 2022 Phytium Information Technology, Inc.
  3. * All Rights Reserved.
  4. *
  5. * This program is OPEN SOURCE software: you can redistribute it and/or modify it
  6. * under the terms of the Phytium Public License as published by the Phytium Technology Co.,Ltd,
  7. * either version 1.0 of the License, or (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY;
  10. * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. * See the Phytium Public License for more details.
  12. *
  13. *
  14. * FilePath: fgmac_hw.h
  15. * Date: 2022-04-06 14:46:52
  16. * LastEditTime: 2022-04-06 14:46:58
  17. * Description:  This file is for
  18. *
  19. * Modify History:
  20. * Ver   Who        Date         Changes
  21. * ----- ------     --------    --------------------------------------
  22. */
  23. #ifndef DRIVERS_ETH_FGMAC_HW_H
  24. #define DRIVERS_ETH_FGMAC_HW_H
  25. /* - 传入模块基地址,不能复杂结构体
  26. - hardware interface of device || low-level driver function prototypes
  27. - 包括驱动寄存器参数和low-level操作定义
  28. 1. 定义寄存器偏移
  29. 2. 对上提供该模块寄存器操作的接口
  30. 3. 一些简单外设提供直接操作接口
  31. 4. 可以定义一些状态的接口,用于响应驱动状态的变化
  32. note: 本文件不能引用fooxx.h
  33. */
  34. #ifdef __cplusplus
  35. extern "C"
  36. {
  37. #endif
  38. /***************************** Include Files *********************************/
  39. #include "fkernel.h"
  40. #include "fio.h"
  41. #include "ftypes.h"
  42. /************************** Constant Definitions *****************************/
  43. /** @name Register Map
  44. *
  45. * Register offsets from the base address of an SD device.
  46. * @{
  47. */
  48. /**** FGMAC CTRL ****/
  49. #define FGMAC_CONF_OFFSET 0x00U /* MAC 配置寄存器 */
  50. #define FGMAC_FRAME_FILTER_OFFSET 0x04U /* Mac 帧过滤 */
  51. #define FGMAC_HASH_HIGH_OFFSET 0x08U /* 哈希表高位寄存器 */
  52. #define FGMAC_HASH_LOW_OFFSET 0x0cU /* 哈希表低位寄存器 */
  53. #define FGMAC_GMII_ADDR_OFFSET 0x10U /* GMII 地址寄存器 */
  54. #define FGMAC_GMII_DATA_OFFSET 0x14U /* GMII 数据寄存器 */
  55. #define FGMAC_FLOW_CTRL_OFFSET 0x18U /* 流控寄存器 */
  56. #define FGMAC_VLAN_TAG_OFFSET 0x1cU /* VLAN 标记寄存器 */
  57. #define FGMAC_VERSION_OFFSET 0x20U /* 版本寄存器 */
  58. #define FGMAC_DEBUG_STATUS_OFFSET 0x24U /* 调试寄存器 */
  59. #define FGMAC_LPI_CTRL_STATUS_OFFSET 0x30U /* LPI (低功耗空闲) 控制和状态寄存器 */
  60. #define FGMAC_LPI_TIMER_CTRL_OFFSET 0x34U /* LPI 定时器控制寄存器 */
  61. #define FGMAC_INTR_STATUS_OFFSET 0x38U /* 中断状态寄存器 */
  62. #define FGMAC_INTR_MASK_OFFSET 0x3CU /* 中断屏蔽寄存器 */
  63. #define FGMAC_MAC_ADDR0_UPPER16BIT_OFFSET 0x40U /* 第一个 MAC 地址的高 16 位。 */
  64. #define FGMAC_MAC_ADDR0_LOWER32BIT_OFFSET 0x44U /* 第一个 MAC 地址的低 32 位。。 */
  65. #define FGMAC_MAC_ADDR1_UPPER16BIT_OFFSET 0x48U /* 第二个 MAC 地址的高 16 位。 */
  66. #define FGMAC_MAC_ADDR1_LOWER32BIT_OFFSET 0x4CU /* 第二个 MAC 地址的低 32 位。。 */
  67. #define FGMAC_MAC_PHY_STATUS 0xD8U /* MAC PHY 状态 */
  68. /**** FGMAC DMA CTRL ****/
  69. #define FGMAC_DMA_BUS_MODE_OFFSET 0x1000U /* 总线模式寄存器 */
  70. #define FGMAC_DMA_TX_POLL_REQ_OFFSET 0x1004U /* 发送轮询请求寄存器 */
  71. #define FGMAC_DMA_RX_POLL_REQ_OFFSET 0x1008U /* 接收轮询请求寄存器 */
  72. #define FGMAC_DMA_RX_LIST_BASE_OFFSET 0x100cU /* 接收描述符列表地址寄存器 */
  73. #define FGMAC_DMA_TX_LIST_BASE_OFFSET 0x1010U /* 发送描述符列表地址寄存器 */
  74. #define FGMAC_DMA_STATUS_OFFSET 0x1014U /* 状态寄存器 */
  75. #define FGMAC_DMA_OP_OFFSET 0x1018U /* 操作模式寄存器 */
  76. #define FGMAC_DMA_INTR_OFFSET 0x101cU /* 中断使能寄存器 */
  77. #define FGMAC_DMA_MISSED_FRAME_CNT_OFFSET 0x1020U /* 丢帧和缓冲区溢出计数器寄存器 */
  78. #define FGMAC_DMA_RX_WATCHDOG_OFFSET 0x1024U /* 接收中断看门狗定时器寄存器 */
  79. #define FGMAC_DMA_AXI_BUS_MOD_OFFSET 0x1028U /* AXI 总线模式寄存器*/
  80. #define FGMAC_DMA_AXI_BUS_STATUS_OFFSET 0x102CU /* AXI 状态寄存器 */
  81. #define FGMAC_DMA_HOST_TX_DESC_OFFSET 0x1048U /* 当前主机发送描述符寄存器 */
  82. #define FGMAC_DMA_HOST_RX_DESC_OFFSET 0x104CU /* 当前主机接收描述符寄存器 */
  83. #define FGMAC_DMA_HOST_TX_BUF_ADDR_OFFSET 0x1050U /* 当前主机发送缓冲地址寄存器 */
  84. #define FGMAC_DMA_HOST_RX_BUF_ADDR_OFFSET 0x1054U /* 当前主机接收缓冲地址寄存器 */
  85. #define FGMAC_DMA_HW_FUNC_OFFSET 0x1058U /* 硬件功能寄存器 */
  86. /** @name FGMAC_CONF_OFFSET Register
  87. */
  88. #define FGMAC_CONF_RX_EN BIT(2) /* 接收器启用 */
  89. #define FGMAC_CONF_TX_EN BIT(3) /* 发送器启用 */
  90. #define FGMAC_CONF_DC BIT(4) /* 延期检查 */
  91. #define FGMAC_CONF_BL_MASK GENMASK(6, 5) /* 后退限制 */
  92. #define FGMAC_CONF_BL(x) (FGMAC_CONF_BL_MASK & ((x) << 5))
  93. #define FGMAC_CONF_ACS BIT(7) /* 自动 PAD/ CRC 剥线 */
  94. #define FGMAC_CONF_LINK_UPDOWN BIT(8) /* 链接 up/down */
  95. #define FGMAC_CONF_DISABLE_RETRY BIT(9) /* 禁用重试 */
  96. #define FGMAC_CONF_IPC BIT(10) /* 校验和卸载 */
  97. #define FGMAC_CONF_DUPLEX_MODE BIT(11) /* 双工模式 */
  98. #define FGMAC_CONF_LOOPBACK_MODE BIT(12) /* 环回模式 */
  99. #define FGMAC_CONF_DO BIT(13) /* 不能自接收 */
  100. #define FGMAC_CONF_FES BIT(14) /* 速度选择 0: 10Mbps, 1: 100Mbps d2000 ft2004手册有误*/
  101. #define FGMAC_CONF_PORTSELECT BIT(15) /* 端口选择 0: GMII(1000Mbps)1: MII(10/100Mbps) */
  102. #define FGMAC_CONF_DCRS BIT(16) /* 传输过程中禁用载波侦听 */
  103. #define FGMAC_CONF_IFG_MASK GENMASK(19, 17) /* 帧内间隔 */
  104. #define FGMAC_CONF_IFG(x) (FGMAC_CONF_IFG_MASK & ((x) << 17))
  105. #define FGMAC_CONF_JE BIT(20) /* 使用Jumbo帧 */
  106. #define FGMAC_CONF_BE BIT(21) /* 帧突发启用 */
  107. #define FGMAC_CONF_JD BIT(22) /* Jabber 禁用 */
  108. #define FGMAC_CONF_WD BIT(23) /* 看门狗禁用 */
  109. #define FGMAC_CONF_TC BIT(24) /* 在 RGMII 中传输配置 */
  110. #define FGMAC_CONF_CST BIT(25) /* 类型帧的 CRC 剥离 */
  111. /* 使能类型帧的CRC剥离、禁用看门狗WD、禁用Jabber JD、帧突发启用BE、不能自接收DO(全双工保留)*/
  112. #define FGMAC_CONF_INIT (FGMAC_CONF_CST| FGMAC_CONF_WD| FGMAC_CONF_JD| FGMAC_CONF_BE| FGMAC_CONF_DO)
  113. /** @name FGMAC_FRAME_FILTER_OFFSET Register
  114. */
  115. #define FGMAC_FRAME_FILTER_PR BIT(0)
  116. #define FGMAC_FRAME_FILTER_HUC BIT(1) /* 哈希单播 */
  117. #define FGMAC_FRAME_FILTER_HMC BIT(2) /* 哈希多播 */
  118. #define FGMAC_FRAME_FILTER_DAIF BIT(3) /* 目的地址反向过滤 */
  119. #define FGMAC_FRAME_FILTER_PM BIT(4) /* 通过所有多播 */
  120. #define FGMAC_FRAME_FILTER_DBF BIT(5) /* 禁用广播帧 */
  121. #define FGMAC_FRAME_FILTER_PCF_MASK (GENMASK(7, 6)) /* 通过控制帧 */
  122. #define FGMAC_FRAME_FILTER_PCF(x) ((x) << 6)
  123. #define FGMAC_FRAME_FILTER_SAIF BIT(8) /* 源地址反相过滤 */
  124. #define FGMAC_FRAME_FILTER_SAF BIT(9) /* 源地址过滤使能 */
  125. #define FGMAC_FRAME_FILTER_HPF BIT(10) /* hash 或 perfect 过滤器 */
  126. #define FGMAC_FRAME_FILTER_RA BIT(31) /* 全部接收 */
  127. /** @name FGMAC_HASH_HIGH_OFFSET Register
  128. */
  129. #define FGMAC_HASH_HIGH_HTH_MASK GENMASK(31, 0) /* 该字段包含 Hash 表的高 32 位。 */
  130. /** @name FGMAC_HASH_LOW_OFFSET Register
  131. */
  132. #define FGMAC_HASH_LOW_HTH_MASK GENMASK(31, 0) /* 该字段包含 Hash 表的低 32 位。 */
  133. /** @name FGMAC_GMII_ADDR_OFFSET Register
  134. */
  135. #define FGMAC_MII_ADDR_GB BIT(0) /* GMII 忙 */
  136. #define FGMAC_MII_ADDR_GW BIT(1) /* GMII 写 */
  137. #define FGMAC_MII_ADDR_CR_MASK GENMASK(5, 2) /* CSR 时钟范围 */
  138. #define FGMAC_MII_ADDR_CR(x) (FGMAC_MII_ADDR_CR_MASK & ((x) << 2))
  139. #define FGMAC_MII_ADDR_GR_MASK GENMASK(10, 6) /* GMII 寄存器 */
  140. #define FGMAC_MII_ADDR_GR(x) (FGMAC_MII_ADDR_GR_MASK & ((x) << 6))
  141. #define FGMAC_MII_ADDR_PA_MASK GENMASK(15, 11) /* 物理层地址 */
  142. #define FGMAC_MII_ADDR_PA(x) (FGMAC_MII_ADDR_PA_MASK & ((x) << 11))
  143. /** @name FGMAC_GMII_DATA_OFFSET Register
  144. */
  145. #define FGMAC_MII_DATA_GD_MASK GENMASK(15, 0)
  146. /** @name FGMAC_FLOW_CTRL_OFFSET Register
  147. */
  148. #define FGMAC_FLOW_FCB BIT(0)
  149. #define FGMAC_FLOW_BPA BIT(0)
  150. #define FGMAC_FLOW_TFE BIT(1)
  151. #define FGMAC_FLOW_RFE BIT(2) /* 接收流控制启用 */
  152. #define FGMAC_FLOW_UP BIT(3) /* 单播暂停帧检测 */
  153. #define FGMAC_FLOW_PLT_MASK GENMASK(5, 4) /* 暂停低阈值 */
  154. #define FGMAC_FLOW_PLT(x) ((x) << 3)
  155. #define FGMAC_FLOW_DZPQ BIT(7)
  156. #define FGMAC_FLOW_PT_MASK GENMASK(31, 16) /* 暂停时间 */
  157. /** @name FGMAC_VLAN_TAG_OFFSET Register
  158. */
  159. #define FGMAC_VLAN_TAG_VL_MASK GENMASK(15, 0) /* 启用 12 位 VLAN 标记比较 */
  160. #define FGMAC_VLAN_TAG_VL(x) (FGMAC_VLAN_TAG_VL_MASK & ((x) << 15))
  161. #define FGMAC_VLAN_TAG_ETV BIT(16) /* 接收帧的 VLAN 标记标识符 */
  162. /** @name FGMAC_VERSION_OFFSET Register
  163. */
  164. #define FGMAC_VERSION_UDV_MASK GENMASK(15, 8) /* 用户定义版本号 */
  165. #define FGMAC_VERSION_SDV_MASK GENMASK(7, 0) /* 硬件定议版本号 */
  166. /** @name FGMAC_LPI_CTRL_STATUS_OFFSET Register
  167. */
  168. #define FGMAC_LPI_CTRL_STATS_TLPIEN BIT(0) /* 发送 LPI 进入 */
  169. #define FGMAC_LPI_CTRL_STATS_TLPIEX BIT(1) /* 发送 LPI 退出 */
  170. #define FGMAC_LPI_CTRL_STATS_RLPIEN BIT(2) /* 接收 LPI 进入 */
  171. #define FGMAC_LPI_CTRL_STATS_RLPIEX BIT(3) /* 接收 LPI 退出 */
  172. #define FGMAC_LPI_CTRL_STATS_TLPIST BIT(8) /* 发送 LPI 状态 */
  173. #define FGMAC_LPI_CTRL_STATS_RLPIST BIT(9) /* 接收 LPI 状态 */
  174. #define FGMAC_LPI_CTRL_STATS_LPIEN BIT(16) /* LPI 使能 */
  175. #define FGMAC_LPI_CTRL_STATS_PLS BIT(17) /* PHY 链路状态 */
  176. #define FGMAC_LPI_CTRL_STATS_PLSEN BIT(18) /* 物理链路状态使能 */
  177. #define FGMAC_LPI_CTRL_STATS_LPITXA BIT(19) /* LPI 发送自动化 */
  178. /** @name FGMAC_LPI_TIMER_CTRL_OFFSET Register
  179. */
  180. #define FGMAC_LPI_TIMER_TWT_MASK GENMASK(15, 0)
  181. #define FGMAC_LPI_TIMER_LIT_MASK GENMASK(25, 16)
  182. /** @name FGMAC_INTR_STATUS_OFFSET Register
  183. */
  184. #define FGMAC_ISR_STATUS_RSIS BIT(0) /* RGMII/SMII Interrupt Status */
  185. #define FGMAC_ISR_STATUS_PCSLSC BIT(1) /* PCS 链路状态改变 */
  186. #define FGMAC_ISR_STATUS_PCSANC BIT(2) /* PCS 自协商完成 */
  187. #define FGMAC_ISR_STATUS_PMTIS BIT(3)
  188. #define FGMAC_ISR_STATUS_MMCIS BIT(4)
  189. #define FGMAC_ISR_STATUS_MMCRIS BIT(5) /* MMC 接收中断状态 */
  190. #define FGMAC_ISR_STATUS_MMCTIS BIT(6) /* MMC 发送中断状态 */
  191. #define FGMAC_ISR_STATUS_MMCRCOIS BIT(7) /* 接收校验和卸载中断状态 */
  192. #define FGMAC_ISR_STATUS_TIS BIT(9) /* 时间戳中断状态 */
  193. #define FGMAC_ISR_STATUS_LPIIS BIT(10) /* LPI 中断状态 */
  194. #define FGMAC_ISR_STATUS_ALL_MASK GENMASK(10, 0)
  195. /** @name FGMAC_INTR_MASK_OFFSET Register
  196. */
  197. #define FGMAC_ISR_MASK_RSIM BIT(0) /* RGMII/SMII 中断屏蔽 */
  198. #define FGMAC_ISR_MASK_PCSLSIM BIT(1) /* PCS 链路状态中断屏蔽 */
  199. #define FGMAC_ISR_MASK_PCSANCIM BIT(2) /* PCS AN 完成中断屏蔽 */
  200. #define FGMAC_ISR_MASK_PMTIM BIT(3) /* PMT 中断屏蔽 */
  201. #define FGMAC_ISR_MASK_TIM BIT(9) /* 时间戳中断屏蔽 */
  202. #define FGMAC_ISR_MASK_LPIIM BIT(10) /* LPI 中断屏蔽 */
  203. #define FGMAC_ISR_MASK_ALL_BITS (GENMASK(3, 0) | GENMASK(10, 9))
  204. #define FGMAC_8BIT_ADDR GENMASK(7, 0)
  205. /** @name FGMAC_MAC_ADDR0_UPPER16BIT_OFFSET Register
  206. */
  207. #define FGMAC_MAC_ADDR0_UPPER16BIT_A GENMASK(15, 0) /* MAC 地址 0[47:32] */
  208. /** @name FGMAC_MAC_ADDR0_LOWER32BIT_OFFSET Register
  209. */
  210. #define FGMAC_MAC_ADDR0_LOWER32BIT_A GENMASK(31, 0) /* MAC 地址 0[31:0] */
  211. /** @name FGMAC_MAC_ADDR1_UPPER16BIT_OFFSET Register
  212. */
  213. #define FGMAC_MAC_ADDR1_UPPER16BIT_A GENMASK(15, 0) /* MAC 地址 1[47:32] */
  214. #define FGMAC_MAC_ADDR1_UPPER16BIT_MBC GENMASK(29, 24)
  215. #define FGMAC_MAC_ADDR1_UPPER16BIT_SA BIT(30)
  216. #define FGMAC_MAC_ADDR1_UPPER16BIT_AE BIT(31)
  217. /** @name FGMAC_MAC_ADDR1_LOWER32BIT_OFFSET Register
  218. */
  219. #define FGMAC_MAC_ADDR1_LOWER16BIT_A GENMASK(31, 0) /* MAC 地址 1[31:0] */
  220. /** @name FGMAC_MAC_PHY_STATUS Register
  221. */
  222. #define FGMAC_RGSMIIIS_LNKMODE BIT(0) /* 指示链路的当前操作模式 */
  223. #define FGMAC_RGSMIIIS_LNKMODE_HALF (0b0 << 0)
  224. #define FGMAC_RGSMIIIS_LNKMODE_FULL (0b1 << 0)
  225. #define FGMAC_RGSMIIIS_SPEED GENMASK(2, 1)
  226. #define FGMAC_RGSMIIIS_SPEED_2_5MHZ (0b00 << 1) /* 链路速度 2.5MHz */
  227. #define FGMAC_RGSMIIIS_SPEED_25MHZ (0b01 << 1) /* 25MHz */
  228. #define FGMAC_RGSMIIIS_SPEED_125MHZ (0b10 << 1) /* 125MHz */
  229. #define FGMAC_RGSMIIIS_LNKSTS BIT(3)
  230. #define FGMAC_RGSMIIIS_LNKSTS_UP (0b1 << 3)
  231. #define FGMAC_RGSMIIIS_LNKSTS_DOWN (0b0 << 3)
  232. #define FGMAC_RGSMIIIS_JAB_TIMEOUT BIT(4)
  233. #define FGMAC_RGSMIIIS_FALSECARDET BIT(5)
  234. /****************FGMAC DMA Register*******************/
  235. /* Bus mode register definitions */
  236. /** @name FGMAC_DMA_BUS_MODE_OFFSET Register
  237. */
  238. #define FGMAC_DMA_BUS_SWR BIT(0) /* 软件复位 */
  239. #define FGMAC_DMA_BUS_DA BIT(1) /* 设置 8xPBL 模式 */
  240. #define FGMAC_DMA_BUS_DSL_MASK GENMASK(6, 2) /* 描述符跳跃长度 */
  241. #define FGMAC_DMA_BUS_ATDS BIT(7)
  242. #define FGMAC_DMA_BUS_PBL_MASK GENMASK(13, 8) /* 可编程突发长度 */
  243. #define FGMAC_DMA_BUS_PBL(x) ((x) << 8)
  244. enum
  245. {
  246. FGMAC_DMA_BUS_PBL_1 = 1,
  247. FGMAC_DMA_BUS_PBL_2 = 2,
  248. FGMAC_DMA_BUS_PBL_4 = 4,
  249. FGMAC_DMA_BUS_PBL_8 = 8,
  250. FGMAC_DMA_BUS_PBL_16 = 16,
  251. FGMAC_DMA_BUS_PBL_32 = 32
  252. };
  253. #define FGMAC_DMA_BUS_PR_MASK GENMASK(15, 14) /* 加权循环仲裁中的优先级比率 */
  254. #define FGMAC_DMA_BUS_PR(x) ((x) << 14)
  255. #define FGMAC_DMA_BUS_FB BIT(16) /* 固定突发 */
  256. #define FGMAC_DMA_BUS_RPBL_MASK GENMASK(22, 17) /* RxDMA 事务中要传输的最大节拍数 */
  257. #define FGMAC_DMA_BUS_RPBL(x) ((x) << 17)
  258. enum
  259. {
  260. FGMAC_DMA_BUS_RPBL_1 = 1,
  261. FGMAC_DMA_BUS_RPBL_2 = 2,
  262. FGMAC_DMA_BUS_RPBL_4 = 4,
  263. FGMAC_DMA_BUS_RPBL_16 = 16,
  264. FGMAC_DMA_BUS_RPBL_32 = 32
  265. };
  266. #define FGMAC_DMA_BUS_USP BIT(23)
  267. #define FGMAC_DMA_BUS_8XPBL BIT(24)
  268. #define FGMAC_DMA_BUS_AAL BIT(25)
  269. #define FGMAC_DMA_BUS_MB BIT(26) /* 混合突发 */
  270. #define FGMAC_DMA_BUS_TXPR BIT(27) /* 发送优先级 */
  271. #define FGMAC_DMA_BUS_PRWG GENMASK(29, 18) /* 通道优先权重 */
  272. #define FGMAC_DMA_BUS_INIT (FGMAC_DMA_BUS_FB | FGMAC_DMA_BUS_PBL(16) | FGMAC_DMA_BUS_RPBL(16))
  273. /* 这些位控制 RxDMA 和 TxDMA 之间的加权循环仲裁中的优先级比率,
  274. FGMAC_DMA_BUS_DA=1时有效 */
  275. #define FGMAC_DMA_BUS_PRIORXTX_41 (3 << 14) /* 4:1 */
  276. #define FGMAC_DMA_BUS_PRIORXTX_31 (2 << 14) /* 3:1 */
  277. #define FGMAC_DMA_BUS_PRIORXTX_21 (1 << 14) /* 2:1 */
  278. #define FGMAC_DMA_BUS_PRIORXTX_11 (0 << 14) /* 1:1 */
  279. /** @name FGMAC_DMA_TX_POLL_REQ_OFFSET Register
  280. */
  281. #define FGMAC_DMA_XMT_POLL_DEMAND_TPD GENMASK(31, 0)
  282. /** @name FGMAC_DMA_RX_POLL_REQ_OFFSET Register
  283. */
  284. #define FGMAC_DMA_RCV_POLL_DEMAND_RPD GENMASK(31, 0)
  285. /** @name FGMAC_DMA_RX_LIST_BASE_OFFSET Register
  286. */
  287. #define FGMAC_DMA_RCV_BASE_ADDR_START_REC_LIST GENMASK(31, 4)
  288. /** @name FGMAC_DMA_TX_LIST_BASE_OFFSET Register
  289. */
  290. #define FGMAC_DMA_TX_BASE_ADDR_START_TRA_LIST GENMASK(31, 4)
  291. /** @name FGMAC_DMA_STATUS_OFFSET Register
  292. */
  293. #define FGMAC_DMA_STATUS_GLPII BIT(30) /* FGMAC LPI interrupt */
  294. #define FGMAC_DMA_STATUS_TTI BIT(29) /* 时间戳触发中断 */
  295. #define FGMAC_DMA_STATUS_GPI BIT(28) /* PMT interrupt */
  296. #define FGMAC_DMA_STATUS_GMI BIT(27) /* MMC interrupt */
  297. #define FGMAC_DMA_STATUS_GLI BIT(26) /* FGMAC Line interface int */
  298. #define FGMAC_DMA_STATUS_EB_MASK GENMASK(25, 23) /* Error Bits Mask */
  299. #define FGMAC_DMA_STATUS_TS_MASK GENMASK(22, 20) /* Transmit Process State */
  300. #define FGMAC_DMA_STATUS_TS_STOPPED (0b000 << 20)
  301. #define FGMAC_DMA_STATUS_TS_GET_DESC (0b001 << 20)
  302. #define FGMAC_DMA_STATUS_TS_WAIT (0b010 << 20)
  303. #define FGMAC_DMA_STATUS_TS_QUEUE (0b011 << 20)
  304. #define FGMAC_DMA_STATUS_TS_PAUSE (0b110 << 20)
  305. #define FGMAC_DMA_STATUS_TS_CLOSE_DESC (0b111 << 20)
  306. #define FGMAC_DMA_STATUS_RS_MASK GENMASK(19, 17) /* Receive Process State */
  307. #define FGMAC_DMA_STATUS_NIS BIT(16) /* Normal Interrupt Summary */
  308. #define FGMAC_DMA_STATUS_AIS BIT(15) /* Abnormal Interrupt Summary */
  309. #define FGMAC_DMA_STATUS_ERI BIT(14) /* Early Receive Interrupt */
  310. #define FGMAC_DMA_STATUS_FBI BIT(13) /* Fatal Bus Error Interrupt */
  311. #define FGMAC_DMA_STATUS_ETI BIT(10) /* Early Transmit Interrupt */
  312. #define FGMAC_DMA_STATUS_RWT BIT(9) /* Receive Watchdog Timeout */
  313. #define FGMAC_DMA_STATUS_RPS BIT(8) /* Receive Process Stopped */
  314. #define FGMAC_DMA_STATUS_RU BIT(7) /* Receive Buffer Unavailable */
  315. #define FGMAC_DMA_STATUS_RI BIT(6) /* Receive Interrupt */
  316. #define FGMAC_DMA_STATUS_UNF BIT(5) /* Transmit Underflow */
  317. #define FGMAC_DMA_STATUS_OVF BIT(4) /* Receive Overflow */
  318. #define FGMAC_DMA_STATUS_TJT BIT(3) /* Transmit Jabber Timeout */
  319. #define FGMAC_DMA_STATUS_TU BIT(2) /* Transmit Buffer Unavailable */
  320. #define FGMAC_DMA_STATUS_TPS BIT(1) /* Transmit Process Stopped */
  321. #define FGMAC_DMA_STATUS_TI BIT(0) /* Transmit Interrupt */
  322. #define FGMAC_DMA_STATUS_CLR_ABLE (GENMASK(5, 0) | GENMASK(10, 7)| FGMAC_DMA_STATUS_FBI | FGMAC_DMA_STATUS_AIS) /* BIT [16 : 0] write 1 to clear */
  323. /** @name FGMAC_DMA_OP_OFFSET Register
  324. */
  325. #define FGMAC_DMA_OP_DT BIT(26) /* No Dropping of TCP/IP csum Err Frame */
  326. #define FGMAC_DMA_OP_RSF BIT(25) /* Rx Store and Forward */
  327. #define FGMAC_DMA_OP_DFF BIT(24) /* */
  328. #define FGMAC_DMA_OP_RFA_2 BIT(23)
  329. #define FGMAC_DMA_OP_RFD_2 BIT(22)
  330. #define FGMAC_DMA_OP_TSF BIT(21) /* Tx Store and Forward */
  331. #define FGMAC_DMA_OP_FTF BIT(20) /* Flush Tx FIFO */
  332. #define FGMAC_DMA_OP_TTC_MASK GENMASK(16, 14)
  333. #define FGMAC_DMA_OP_TTC(x) ((x) << 14) /* Tx Threshold Control */
  334. enum
  335. {
  336. FGMAC_DMA_OP_TTC_64 = 0b000,
  337. FGMAC_DMA_OP_TTC_128 = 0b001,
  338. FGMAC_DMA_OP_TTC_192 = 0b010,
  339. FGMAC_DMA_OP_TTC_256 = 0b011,
  340. FGMAC_DMA_OP_TTC_40 = 0b100,
  341. FGMAC_DMA_OP_TTC_32 = 0b101,
  342. FGMAC_DMA_OP_TTC_24 = 0b110,
  343. FGMAC_DMA_OP_TTC_16 = 0b111
  344. };
  345. #define FGMAC_DMA_OP_ST BIT(13) /* Start/Stop Tx */
  346. #define FGMAC_DMA_OP_RFD_MASK GENMASK(12, 11)
  347. #define FGMAC_DMA_OP_RFD(x) ((x) << 11) /* Threshold for DeActive Flow Control */
  348. #define FGMAC_DMA_OP_RFA_MASK GENMASK(10, 9) /* Threshold for Active Flow Control */
  349. #define FGMAC_DMA_OP_EFC BIT(8) /* Enable HW Flow control */
  350. #define FGMAC_DMA_OP_FEF BIT(7) /* Forward Error Frame */
  351. #define FGMAC_DMA_OP_FUF BIT(6) /* Forward Undersize Good Frame */
  352. #define FGMAC_DMA_OP_RTC_MASK GENMASK(4, 3) /* Rx Threshold Control */
  353. #define FGMAC_DMA_OP_OSF BIT(2) /* Operate On Second Mode */
  354. #define FGMAC_DMA_OP_SR BIT(1) /* Start/Stop Rx */
  355. #define FGMAC_DMA_OP_CLEAR_MASK GENMASK(31, 0)
  356. #define FGMAC_DMA_OP_INIT (FGMAC_DMA_OP_SR | FGMAC_DMA_OP_RSF)
  357. /** @name FGMAC_DMA_INTR_OFFSET Register
  358. */
  359. #define FGMAC_DMA_INTR_ENA_TIE BIT(0) /* Transmit Interrupt */
  360. #define FGMAC_DMA_INTR_ENA_TSE BIT(1) /* 传输停止启用 */
  361. #define FGMAC_DMA_INTR_ENA_TUE BIT(2) /* Transmit Buffer Unavailable */
  362. #define FGMAC_DMA_INTR_ENA_THE BIT(3) /* 发送 Jabber 超时启用 */
  363. #define FGMAC_DMA_INTR_ENA_OVE BIT(4) /* 溢出中断使能 */
  364. #define FGMAC_DMA_INTR_ENA_UNE BIT(5) /* 下溢中断使能 */
  365. #define FGMAC_DMA_INTR_ENA_RIE BIT(6) /* Receive Interrupt */
  366. #define FGMAC_DMA_INTR_ENA_RUE BIT(7) /* 接收缓冲区不可用启用 */
  367. #define FGMAC_DMA_INTR_ENA_RSE BIT(8) /* 接收已停止启用 */
  368. #define FGMAC_DMA_INTR_ENA_RWE BIT(9) /* 接收看门狗超时使能 */
  369. #define FGMAC_DMA_INTR_ENA_ETE BIT(10) /* 早期发送中断使能 */
  370. #define FGMAC_DMA_INTR_ENA_FBE BIT(13) /* Fatal Bus Error */
  371. #define FGMAC_DMA_INTR_ENA_ERE BIT(14) /* Early Receive */
  372. #define FGMAC_DMA_INTR_ENA_AIE BIT(15) /* Abnormal Summary */
  373. #define FGMAC_DMA_INTR_ENA_NIE BIT(16) /* Normal Summary */
  374. #define FGMAC_DMA_INTR_ENA_ALL_MASK (GENMASK(10, 0) | GENMASK(16, 13))
  375. /** @name FGMAC_DMA_MISSED_FRAME_CNT_OFFSET Register
  376. */
  377. #define FGMAC_DMA_MISSED_FRAME_CTR_CMIS GENMASK(15, 0) /* 由于主机接收缓冲区不可用而导致控制器丢失的帧数 */
  378. #define FGMAC_DMA_MISSED_FRAME_CTR_OVMIS BIT(16)
  379. #define FGMAC_DMA_MISSED_FRAME_CTR_CFIFO GENMASK(27, 17)
  380. #define FGMAC_DMA_MISSED_FRAME_CTR_OVFIFO BIT(28)
  381. /** @name FGMAC_DMA_RX_WATCHDOG_OFFSET Register
  382. */
  383. #define FGMAC_DMA_RX_WATCHDOG_RIWT GENMASK(7, 0)
  384. /** @name FGMAC_DMA_AXI_BUS_MOD_OFFSET Register
  385. */
  386. #define FGMAC_DMA_AXI_BUS_MOD_UNDEF BIT(0) /* AXI 未定义的突发长度 */
  387. #define FGMAC_DMA_AXI_BUS_MOD_BLEN4 BIT(1) /* AXI 突发长度 4 */
  388. #define FGMAC_DMA_AXI_BUS_MOD_BLEN8 BIT(2) /* AXI 突发长度 8 */
  389. #define FGMAC_DMA_AXI_BUS_MOD_BLEN16 BIT(3) /* AXI 突发长度 16 */
  390. #define FGMAC_DMA_AXI_BUS_MOD_BLEN32 BIT(4) /* AXI 突发长度 32 */
  391. #define FGMAC_DMA_AXI_BUS_MOD_BLEN64 BIT(5) /* AXI 突发长度 64 */
  392. #define FGMAC_DMA_AXI_BUS_MOD_BLEN128 BIT(6) /* AXI 突发长度 128 */
  393. #define FGMAC_DMA_AXI_BUS_MOD_BLEN256 BIT(7) /* AXI 突发长度 256 */
  394. #define FGMAC_DMA_AXI_BUS_MOD_AXI_AAL BIT(12) /* 地址对齐的节拍 */
  395. #define FGMAC_DMA_AXI_BUS_MOD_RD_OSR_LMT_MASK GENMASK(19, 16)
  396. #define FGMAC_DMA_AXI_BUS_MOD_RD_OSR_LMT(x) ((x) << 16) /* XI 最大读取未决请求限制此值限 制 AXI 读取接口上的最大未完成请求。 */
  397. #define FGMAC_DMA_AXI_BUS_MOD_WR_OSR_LMT_MASK GENMASK(23, 20)
  398. #define FGMAC_DMA_AXI_BUS_MOD_WR_OSR_LMT(x) ((x) << 20) /* AXI 最大写入未决请求限制此值 限制 AXI 写入接口上的最大未完成请求。 */
  399. #define FGMAC_DMA_AXI_BUS_MOD_UNLCK_ON_MGK_RWK BIT(30)
  400. #define FGMAC_DMA_AXI_BUS_MOD_EN_LPI BIT(31)
  401. #define FGMAC_DMA_DESC_ADDR_MASK GENMASK(31, 4)
  402. #define FGMAC_MAC_ADDR_LEN 6
  403. #define FGMAC_RETRY_TIMES 500
  404. #define FGMAC_DELAY_US 100
  405. /**************************** Type Definitions *******************************/
  406. typedef u8 FGmacMacAddr[FGMAC_MAC_ADDR_LEN];
  407. enum
  408. {
  409. FGMAC_CTRL_INTR = 0,
  410. FGMAC_DMA_INTR,
  411. FGMAC_MAX_INTR_TYPE
  412. };
  413. /************************** Variable Definitions *****************************/
  414. /***************** Macros (Inline Functions) Definitions *********************/
  415. /* 读FGMAC控制器寄存器,以u32返回整个寄存器值 */
  416. #define FGMAC_READ_REG32(addr, reg_offset) FtIn32((addr) + (u32)(reg_offset))
  417. /* 写FGMAC控制器寄存器,以u32覆盖写入整个寄存器值 */
  418. #define FGMAC_WRITE_REG32(addr, reg_offset, reg_value) FtOut32((addr) + (u32)(reg_offset), (u32)(reg_value))
  419. /* 将FGMAC控制器寄存器的特定位置为1, 不改变其它位 */
  420. #define FGMAC_SET_REG32(addr, reg_offset, set_bits) FtSetBit32((addr) + (u32)(reg_offset), (u32)(set_bits))
  421. /* 将FGMAC控制器寄存器的特定位置为0, 不改变其它位 */
  422. #define FGMAC_CLR_REG32(addr, reg_offset, clr_bits) FtClearBit32((addr) + (u32)(reg_offset), (u32)(clr_bits))
  423. /* 在一个总长度为num的环内将索引idx增加1 */
  424. #define FGMAC_DMA_INC_DESC(idx, num) (idx) = (((idx) + 1) % (num))
  425. static inline void FGmacResumeDmaSend(uintptr base_addr)
  426. {
  427. if (FGMAC_READ_REG32(base_addr, FGMAC_DMA_STATUS_OFFSET) & FGMAC_DMA_STATUS_TU)
  428. {
  429. FGMAC_SET_REG32(base_addr, FGMAC_DMA_STATUS_OFFSET, FGMAC_DMA_STATUS_TU); /* clear TBUS GMAC DMA flag */
  430. FGMAC_WRITE_REG32(base_addr, FGMAC_DMA_TX_POLL_REQ_OFFSET, 0xff); /* resume DMA transmission */
  431. }
  432. else
  433. {
  434. FGMAC_WRITE_REG32(base_addr, FGMAC_DMA_TX_POLL_REQ_OFFSET, 0xff); /* resume DMA transmission */
  435. }
  436. }
  437. static inline void FGmacResumeDmaRecv(uintptr base_addr)
  438. {
  439. if (FGMAC_READ_REG32(base_addr, FGMAC_DMA_STATUS_OFFSET) & FGMAC_DMA_STATUS_RU)
  440. {
  441. FGMAC_SET_REG32(base_addr, FGMAC_DMA_STATUS_OFFSET, FGMAC_DMA_STATUS_RU); /* Clear RBUS GMAC DMA flag */
  442. FGMAC_WRITE_REG32(base_addr, FGMAC_DMA_RX_POLL_REQ_OFFSET, 0xff); /* Resume DMA transmission*/
  443. }
  444. else
  445. {
  446. FGMAC_WRITE_REG32(base_addr, FGMAC_DMA_RX_POLL_REQ_OFFSET, 0xff);
  447. }
  448. }
  449. static inline void FGmacStartDmaTrans(uintptr base_addr)
  450. {
  451. FGMAC_SET_REG32(base_addr, FGMAC_DMA_OP_OFFSET, (FGMAC_DMA_OP_SR | FGMAC_DMA_OP_ST)); /* enable dma tx and rx */
  452. FGMAC_SET_REG32(base_addr, FGMAC_CONF_OFFSET, (FGMAC_CONF_RX_EN | FGMAC_CONF_TX_EN)); /* enable gmac tx and rx */
  453. /* clear Tx and Rx process stopped flags */
  454. FGMAC_WRITE_REG32(base_addr, FGMAC_DMA_INTR_OFFSET,
  455. (FGMAC_DMA_INTR_ENA_RIE | FGMAC_DMA_INTR_ENA_AIE | FGMAC_DMA_INTR_ENA_NIE));
  456. }
  457. static inline void FGmacStopDmaTrans(uintptr base_addr)
  458. {
  459. FGMAC_CLR_REG32(base_addr, FGMAC_DMA_OP_OFFSET, (FGMAC_DMA_OP_SR | FGMAC_DMA_OP_ST)); /* disable dma tx and rx */
  460. FGMAC_CLR_REG32(base_addr, FGMAC_CONF_OFFSET, (FGMAC_CONF_RX_EN | FGMAC_CONF_TX_EN)); /* disable gmac tx and rx */
  461. }
  462. static inline void FGmacResmuDmaUnderflow(uintptr base_addr)
  463. {
  464. if (FGMAC_DMA_STATUS_UNF & FGMAC_READ_REG32(base_addr, FGMAC_DMA_STATUS_OFFSET))
  465. {
  466. FGMAC_SET_REG32(base_addr, FGMAC_DMA_STATUS_OFFSET, FGMAC_DMA_STATUS_UNF); /* clear TBUS GMAC DMA flag */
  467. FGMAC_WRITE_REG32(base_addr, FGMAC_DMA_TX_POLL_REQ_OFFSET, 0xff); /* resume DMA transmission*/
  468. }
  469. }
  470. /************************** Function Prototypes ******************************/
  471. /* 获取FGMAC控制器配置的MAC地址 */
  472. void FGmacGetMacAddr(uintptr base_addr, FGmacMacAddr mac_addr);
  473. /* 设置FGMAC控制器的MAC地址 */
  474. void FGmacSetMacAddr(uintptr base_addr, const FGmacMacAddr mac_addr);
  475. /* 触发FGMAC控制器软件复位 */
  476. FError FGmacSoftwareReset(uintptr base_addr, int timeout);
  477. FError FGmacFlushTxFifo(uintptr base_addr, int timeout);
  478. void FGmacStopDmaTrans(uintptr base_addr);
  479. /* wait fgmac mii not busy */
  480. FError FGmacPhyWaitBusBusy(uintptr base_addr, int timeout);
  481. #ifdef __cplusplus
  482. }
  483. #endif
  484. #endif