emac_defs.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. /*
  2. * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
  3. *
  4. * Based on:
  5. *
  6. * ----------------------------------------------------------------------------
  7. *
  8. * dm644x_emac.h
  9. *
  10. * TI DaVinci (DM644X) EMAC peripheral driver header for DV-EVM
  11. *
  12. * Copyright (C) 2005 Texas Instruments.
  13. *
  14. * ----------------------------------------------------------------------------
  15. *
  16. * This program is free software; you can redistribute it and/or modify
  17. * it under the terms of the GNU General Public License as published by
  18. * the Free Software Foundation; either version 2 of the License, or
  19. * (at your option) any later version.
  20. *
  21. * This program is distributed in the hope that it will be useful,
  22. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  23. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  24. * GNU General Public License for more details.
  25. *
  26. * You should have received a copy of the GNU General Public License
  27. * along with this program; if not, write to the Free Software
  28. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  29. * ----------------------------------------------------------------------------
  30. * Modifications:
  31. * ver. 1.0: Sep 2005, TI PSP Team - Created EMAC version for uBoot.
  32. *
  33. */
  34. #ifndef _DM644X_EMAC_H_
  35. #define _DM644X_EMAC_H_
  36. #include <asm/arch/hardware.h>
  37. #ifdef CONFIG_SOC_DM365
  38. #define EMAC_BASE_ADDR (0x01d07000)
  39. #define EMAC_WRAPPER_BASE_ADDR (0x01d0a000)
  40. #define EMAC_WRAPPER_RAM_ADDR (0x01d08000)
  41. #define EMAC_MDIO_BASE_ADDR (0x01d0b000)
  42. #define DAVINCI_EMAC_VERSION2
  43. #elif defined(CONFIG_SOC_DA8XX)
  44. #define EMAC_BASE_ADDR DAVINCI_EMAC_CNTRL_REGS_BASE
  45. #define EMAC_WRAPPER_BASE_ADDR DAVINCI_EMAC_WRAPPER_CNTRL_REGS_BASE
  46. #define EMAC_WRAPPER_RAM_ADDR DAVINCI_EMAC_WRAPPER_RAM_BASE
  47. #define EMAC_MDIO_BASE_ADDR DAVINCI_MDIO_CNTRL_REGS_BASE
  48. #define DAVINCI_EMAC_VERSION2
  49. #else
  50. #define EMAC_BASE_ADDR (0x01c80000)
  51. #define EMAC_WRAPPER_BASE_ADDR (0x01c81000)
  52. #define EMAC_WRAPPER_RAM_ADDR (0x01c82000)
  53. #define EMAC_MDIO_BASE_ADDR (0x01c84000)
  54. #endif
  55. #ifdef CONFIG_SOC_DM646X
  56. #define DAVINCI_EMAC_VERSION2
  57. #define DAVINCI_EMAC_GIG_ENABLE
  58. #endif
  59. #ifdef CONFIG_SOC_DM646X
  60. /* MDIO module input frequency */
  61. #define EMAC_MDIO_BUS_FREQ 76500000
  62. /* MDIO clock output frequency */
  63. #define EMAC_MDIO_CLOCK_FREQ 2500000 /* 2.5 MHz */
  64. #elif defined(CONFIG_SOC_DM365)
  65. /* MDIO module input frequency */
  66. #define EMAC_MDIO_BUS_FREQ 121500000
  67. /* MDIO clock output frequency */
  68. #define EMAC_MDIO_CLOCK_FREQ 2200000 /* 2.2 MHz */
  69. #elif defined(CONFIG_SOC_DA8XX)
  70. /* MDIO module input frequency */
  71. #define EMAC_MDIO_BUS_FREQ clk_get(DAVINCI_MDIO_CLKID)
  72. /* MDIO clock output frequency */
  73. #define EMAC_MDIO_CLOCK_FREQ 2000000 /* 2.0 MHz */
  74. #else
  75. /* MDIO module input frequency */
  76. #define EMAC_MDIO_BUS_FREQ 99000000 /* PLL/6 - 99 MHz */
  77. /* MDIO clock output frequency */
  78. #define EMAC_MDIO_CLOCK_FREQ 2000000 /* 2.0 MHz */
  79. #endif
  80. /* PHY mask - set only those phy number bits where phy is/can be connected */
  81. #define EMAC_MDIO_PHY_NUM CONFIG_EMAC_MDIO_PHY_NUM
  82. #define EMAC_MDIO_PHY_MASK (1 << EMAC_MDIO_PHY_NUM)
  83. /* Ethernet Min/Max packet size */
  84. #define EMAC_MIN_ETHERNET_PKT_SIZE 60
  85. #define EMAC_MAX_ETHERNET_PKT_SIZE 1518
  86. #define EMAC_PKT_ALIGN 18 /* 1518 + 18 = 1536 (packet aligned on 32 byte boundry) */
  87. /* Number of RX packet buffers
  88. * NOTE: Only 1 buffer supported as of now
  89. */
  90. #define EMAC_MAX_RX_BUFFERS 10
  91. /***********************************************
  92. ******** Internally used macros ***************
  93. ***********************************************/
  94. #define EMAC_CH_TX 1
  95. #define EMAC_CH_RX 0
  96. /* Each descriptor occupies 4 words, lets start RX desc's at 0 and
  97. * reserve space for 64 descriptors max
  98. */
  99. #define EMAC_RX_DESC_BASE 0x0
  100. #define EMAC_TX_DESC_BASE 0x1000
  101. /* EMAC Teardown value */
  102. #define EMAC_TEARDOWN_VALUE 0xfffffffc
  103. /* MII Status Register */
  104. #define MII_STATUS_REG 1
  105. /* Number of statistics registers */
  106. #define EMAC_NUM_STATS 36
  107. /* EMAC Descriptor */
  108. typedef volatile struct _emac_desc
  109. {
  110. u_int32_t next; /* Pointer to next descriptor in chain */
  111. u_int8_t *buffer; /* Pointer to data buffer */
  112. u_int32_t buff_off_len; /* Buffer Offset(MSW) and Length(LSW) */
  113. u_int32_t pkt_flag_len; /* Packet Flags(MSW) and Length(LSW) */
  114. } emac_desc;
  115. /* CPPI bit positions */
  116. #define EMAC_CPPI_SOP_BIT (0x80000000)
  117. #define EMAC_CPPI_EOP_BIT (0x40000000)
  118. #define EMAC_CPPI_OWNERSHIP_BIT (0x20000000)
  119. #define EMAC_CPPI_EOQ_BIT (0x10000000)
  120. #define EMAC_CPPI_TEARDOWN_COMPLETE_BIT (0x08000000)
  121. #define EMAC_CPPI_PASS_CRC_BIT (0x04000000)
  122. #define EMAC_CPPI_RX_ERROR_FRAME (0x03fc0000)
  123. #define EMAC_MACCONTROL_MIIEN_ENABLE (0x20)
  124. #define EMAC_MACCONTROL_FULLDUPLEX_ENABLE (0x1)
  125. #define EMAC_MACCONTROL_GIGABIT_ENABLE (1 << 7)
  126. #define EMAC_MACCONTROL_GIGFORCE (1 << 17)
  127. #define EMAC_MACCONTROL_RMIISPEED_100 (1 << 15)
  128. #define EMAC_MAC_ADDR_MATCH (1 << 19)
  129. #define EMAC_MAC_ADDR_IS_VALID (1 << 20)
  130. #define EMAC_RXMBPENABLE_RXCAFEN_ENABLE (0x200000)
  131. #define EMAC_RXMBPENABLE_RXBROADEN (0x2000)
  132. #define MDIO_CONTROL_IDLE (0x80000000)
  133. #define MDIO_CONTROL_ENABLE (0x40000000)
  134. #define MDIO_CONTROL_FAULT_ENABLE (0x40000)
  135. #define MDIO_CONTROL_FAULT (0x80000)
  136. #define MDIO_USERACCESS0_GO (0x80000000)
  137. #define MDIO_USERACCESS0_WRITE_READ (0x0)
  138. #define MDIO_USERACCESS0_WRITE_WRITE (0x40000000)
  139. #define MDIO_USERACCESS0_ACK (0x20000000)
  140. /* Ethernet MAC Registers Structure */
  141. typedef struct {
  142. dv_reg TXIDVER;
  143. dv_reg TXCONTROL;
  144. dv_reg TXTEARDOWN;
  145. u_int8_t RSVD0[4];
  146. dv_reg RXIDVER;
  147. dv_reg RXCONTROL;
  148. dv_reg RXTEARDOWN;
  149. u_int8_t RSVD1[100];
  150. dv_reg TXINTSTATRAW;
  151. dv_reg TXINTSTATMASKED;
  152. dv_reg TXINTMASKSET;
  153. dv_reg TXINTMASKCLEAR;
  154. dv_reg MACINVECTOR;
  155. u_int8_t RSVD2[12];
  156. dv_reg RXINTSTATRAW;
  157. dv_reg RXINTSTATMASKED;
  158. dv_reg RXINTMASKSET;
  159. dv_reg RXINTMASKCLEAR;
  160. dv_reg MACINTSTATRAW;
  161. dv_reg MACINTSTATMASKED;
  162. dv_reg MACINTMASKSET;
  163. dv_reg MACINTMASKCLEAR;
  164. u_int8_t RSVD3[64];
  165. dv_reg RXMBPENABLE;
  166. dv_reg RXUNICASTSET;
  167. dv_reg RXUNICASTCLEAR;
  168. dv_reg RXMAXLEN;
  169. dv_reg RXBUFFEROFFSET;
  170. dv_reg RXFILTERLOWTHRESH;
  171. u_int8_t RSVD4[8];
  172. dv_reg RX0FLOWTHRESH;
  173. dv_reg RX1FLOWTHRESH;
  174. dv_reg RX2FLOWTHRESH;
  175. dv_reg RX3FLOWTHRESH;
  176. dv_reg RX4FLOWTHRESH;
  177. dv_reg RX5FLOWTHRESH;
  178. dv_reg RX6FLOWTHRESH;
  179. dv_reg RX7FLOWTHRESH;
  180. dv_reg RX0FREEBUFFER;
  181. dv_reg RX1FREEBUFFER;
  182. dv_reg RX2FREEBUFFER;
  183. dv_reg RX3FREEBUFFER;
  184. dv_reg RX4FREEBUFFER;
  185. dv_reg RX5FREEBUFFER;
  186. dv_reg RX6FREEBUFFER;
  187. dv_reg RX7FREEBUFFER;
  188. dv_reg MACCONTROL;
  189. dv_reg MACSTATUS;
  190. dv_reg EMCONTROL;
  191. dv_reg FIFOCONTROL;
  192. dv_reg MACCONFIG;
  193. dv_reg SOFTRESET;
  194. u_int8_t RSVD5[88];
  195. dv_reg MACSRCADDRLO;
  196. dv_reg MACSRCADDRHI;
  197. dv_reg MACHASH1;
  198. dv_reg MACHASH2;
  199. dv_reg BOFFTEST;
  200. dv_reg TPACETEST;
  201. dv_reg RXPAUSE;
  202. dv_reg TXPAUSE;
  203. u_int8_t RSVD6[16];
  204. dv_reg RXGOODFRAMES;
  205. dv_reg RXBCASTFRAMES;
  206. dv_reg RXMCASTFRAMES;
  207. dv_reg RXPAUSEFRAMES;
  208. dv_reg RXCRCERRORS;
  209. dv_reg RXALIGNCODEERRORS;
  210. dv_reg RXOVERSIZED;
  211. dv_reg RXJABBER;
  212. dv_reg RXUNDERSIZED;
  213. dv_reg RXFRAGMENTS;
  214. dv_reg RXFILTERED;
  215. dv_reg RXQOSFILTERED;
  216. dv_reg RXOCTETS;
  217. dv_reg TXGOODFRAMES;
  218. dv_reg TXBCASTFRAMES;
  219. dv_reg TXMCASTFRAMES;
  220. dv_reg TXPAUSEFRAMES;
  221. dv_reg TXDEFERRED;
  222. dv_reg TXCOLLISION;
  223. dv_reg TXSINGLECOLL;
  224. dv_reg TXMULTICOLL;
  225. dv_reg TXEXCESSIVECOLL;
  226. dv_reg TXLATECOLL;
  227. dv_reg TXUNDERRUN;
  228. dv_reg TXCARRIERSENSE;
  229. dv_reg TXOCTETS;
  230. dv_reg FRAME64;
  231. dv_reg FRAME65T127;
  232. dv_reg FRAME128T255;
  233. dv_reg FRAME256T511;
  234. dv_reg FRAME512T1023;
  235. dv_reg FRAME1024TUP;
  236. dv_reg NETOCTETS;
  237. dv_reg RXSOFOVERRUNS;
  238. dv_reg RXMOFOVERRUNS;
  239. dv_reg RXDMAOVERRUNS;
  240. u_int8_t RSVD7[624];
  241. dv_reg MACADDRLO;
  242. dv_reg MACADDRHI;
  243. dv_reg MACINDEX;
  244. u_int8_t RSVD8[244];
  245. dv_reg TX0HDP;
  246. dv_reg TX1HDP;
  247. dv_reg TX2HDP;
  248. dv_reg TX3HDP;
  249. dv_reg TX4HDP;
  250. dv_reg TX5HDP;
  251. dv_reg TX6HDP;
  252. dv_reg TX7HDP;
  253. dv_reg RX0HDP;
  254. dv_reg RX1HDP;
  255. dv_reg RX2HDP;
  256. dv_reg RX3HDP;
  257. dv_reg RX4HDP;
  258. dv_reg RX5HDP;
  259. dv_reg RX6HDP;
  260. dv_reg RX7HDP;
  261. dv_reg TX0CP;
  262. dv_reg TX1CP;
  263. dv_reg TX2CP;
  264. dv_reg TX3CP;
  265. dv_reg TX4CP;
  266. dv_reg TX5CP;
  267. dv_reg TX6CP;
  268. dv_reg TX7CP;
  269. dv_reg RX0CP;
  270. dv_reg RX1CP;
  271. dv_reg RX2CP;
  272. dv_reg RX3CP;
  273. dv_reg RX4CP;
  274. dv_reg RX5CP;
  275. dv_reg RX6CP;
  276. dv_reg RX7CP;
  277. } emac_regs;
  278. /* EMAC Wrapper Registers Structure */
  279. typedef struct {
  280. #ifdef DAVINCI_EMAC_VERSION2
  281. dv_reg idver;
  282. dv_reg softrst;
  283. dv_reg emctrl;
  284. dv_reg c0rxthreshen;
  285. dv_reg c0rxen;
  286. dv_reg c0txen;
  287. dv_reg c0miscen;
  288. dv_reg c1rxthreshen;
  289. dv_reg c1rxen;
  290. dv_reg c1txen;
  291. dv_reg c1miscen;
  292. dv_reg c2rxthreshen;
  293. dv_reg c2rxen;
  294. dv_reg c2txen;
  295. dv_reg c2miscen;
  296. dv_reg c0rxthreshstat;
  297. dv_reg c0rxstat;
  298. dv_reg c0txstat;
  299. dv_reg c0miscstat;
  300. dv_reg c1rxthreshstat;
  301. dv_reg c1rxstat;
  302. dv_reg c1txstat;
  303. dv_reg c1miscstat;
  304. dv_reg c2rxthreshstat;
  305. dv_reg c2rxstat;
  306. dv_reg c2txstat;
  307. dv_reg c2miscstat;
  308. dv_reg c0rximax;
  309. dv_reg c0tximax;
  310. dv_reg c1rximax;
  311. dv_reg c1tximax;
  312. dv_reg c2rximax;
  313. dv_reg c2tximax;
  314. #else
  315. u_int8_t RSVD0[4100];
  316. dv_reg EWCTL;
  317. dv_reg EWINTTCNT;
  318. #endif
  319. } ewrap_regs;
  320. /* EMAC MDIO Registers Structure */
  321. typedef struct {
  322. dv_reg VERSION;
  323. dv_reg CONTROL;
  324. dv_reg ALIVE;
  325. dv_reg LINK;
  326. dv_reg LINKINTRAW;
  327. dv_reg LINKINTMASKED;
  328. u_int8_t RSVD0[8];
  329. dv_reg USERINTRAW;
  330. dv_reg USERINTMASKED;
  331. dv_reg USERINTMASKSET;
  332. dv_reg USERINTMASKCLEAR;
  333. u_int8_t RSVD1[80];
  334. dv_reg USERACCESS0;
  335. dv_reg USERPHYSEL0;
  336. dv_reg USERACCESS1;
  337. dv_reg USERPHYSEL1;
  338. } mdio_regs;
  339. int davinci_eth_phy_read(u_int8_t phy_addr, u_int8_t reg_num, u_int16_t *data);
  340. int davinci_eth_phy_write(u_int8_t phy_addr, u_int8_t reg_num, u_int16_t data);
  341. typedef struct
  342. {
  343. char name[64];
  344. int (*init)(int phy_addr);
  345. int (*is_phy_connected)(int phy_addr);
  346. int (*get_link_speed)(int phy_addr);
  347. int (*auto_negotiate)(int phy_addr);
  348. } phy_t;
  349. #define PHY_LXT972 (0x001378e2)
  350. int lxt972_is_phy_connected(int phy_addr);
  351. int lxt972_get_link_speed(int phy_addr);
  352. int lxt972_init_phy(int phy_addr);
  353. int lxt972_auto_negotiate(int phy_addr);
  354. #define PHY_DP83848 (0x20005c90)
  355. int dp83848_is_phy_connected(int phy_addr);
  356. int dp83848_get_link_speed(int phy_addr);
  357. int dp83848_init_phy(int phy_addr);
  358. int dp83848_auto_negotiate(int phy_addr);
  359. #endif /* _DM644X_EMAC_H_ */