rswitch.h 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /* Renesas Ethernet Switch device driver
  3. *
  4. * Copyright (C) 2022-2025 Renesas Electronics Corporation
  5. */
  6. #ifndef __RSWITCH_H__
  7. #define __RSWITCH_H__
  8. #include <linux/platform_device.h>
  9. #include <linux/phy.h>
  10. #include "rcar_gen4_ptp.h"
  11. #define RSWITCH_MAX_NUM_QUEUES 128
  12. #define RSWITCH_NUM_AGENTS 5
  13. #define RSWITCH_NUM_PORTS 3
  14. #define rswitch_for_all_ports(_priv, _rdev) \
  15. list_for_each_entry(_rdev, &_priv->port_list, list)
  16. #define rswitch_for_each_enabled_port(priv, i) \
  17. for (i = 0; i < RSWITCH_NUM_PORTS; i++) \
  18. if (priv->rdev[i]->disabled) \
  19. continue; \
  20. else
  21. #define rswitch_for_each_enabled_port_continue_reverse(priv, i) \
  22. for (; i-- > 0; ) \
  23. if (priv->rdev[i]->disabled) \
  24. continue; \
  25. else
  26. #define TX_RING_SIZE 1024
  27. #define RX_RING_SIZE 4096
  28. #define TS_RING_SIZE (TX_RING_SIZE * RSWITCH_NUM_PORTS)
  29. #define RSWITCH_MAX_MTU 9600
  30. #define RSWITCH_HEADROOM (NET_SKB_PAD + NET_IP_ALIGN)
  31. #define RSWITCH_DESC_BUF_SIZE 2048
  32. #define RSWITCH_TAILROOM SKB_DATA_ALIGN(sizeof(struct skb_shared_info))
  33. #define RSWITCH_ALIGN 128
  34. #define RSWITCH_BUF_SIZE (RSWITCH_HEADROOM + RSWITCH_DESC_BUF_SIZE + \
  35. RSWITCH_TAILROOM + RSWITCH_ALIGN)
  36. #define RSWITCH_MAP_BUF_SIZE (RSWITCH_BUF_SIZE - RSWITCH_HEADROOM)
  37. #define RSWITCH_MAX_CTAG_PCP 7
  38. #define RSWITCH_TIMEOUT_US 100000
  39. #define RSWITCH_TOP_OFFSET 0x00008000
  40. #define RSWITCH_COMA_OFFSET 0x00009000
  41. #define RSWITCH_ETHA_OFFSET 0x0000a000 /* with RMAC */
  42. #define RSWITCH_ETHA_SIZE 0x00002000 /* with RMAC */
  43. #define RSWITCH_GWCA0_OFFSET 0x00010000
  44. #define RSWITCH_GWCA1_OFFSET 0x00012000
  45. /* TODO: hardcoded ETHA/GWCA settings for now */
  46. #define GWCA_IRQ_RESOURCE_NAME "gwca0_rxtx%d"
  47. #define GWCA_IRQ_NAME "rswitch: gwca0_rxtx%d"
  48. #define GWCA_NUM_IRQS 8
  49. #define GWCA_INDEX 0
  50. #define AGENT_INDEX_GWCA 3
  51. #define GWCA_IPV_NUM 0
  52. #define GWRO RSWITCH_GWCA0_OFFSET
  53. #define GWCA_TS_IRQ_RESOURCE_NAME "gwca0_rxts0"
  54. #define GWCA_TS_IRQ_NAME "rswitch: gwca0_rxts0"
  55. #define GWCA_TS_IRQ_BIT BIT(0)
  56. #define FWRO 0
  57. #define TPRO RSWITCH_TOP_OFFSET
  58. #define CARO RSWITCH_COMA_OFFSET
  59. #define TARO 0
  60. #define RMRO 0x1000
  61. enum rswitch_reg {
  62. FWGC = FWRO + 0x0000,
  63. FWTTC0 = FWRO + 0x0010,
  64. FWTTC1 = FWRO + 0x0014,
  65. FWLBMC = FWRO + 0x0018,
  66. FWCEPTC = FWRO + 0x0020,
  67. FWCEPRC0 = FWRO + 0x0024,
  68. FWCEPRC1 = FWRO + 0x0028,
  69. FWCEPRC2 = FWRO + 0x002c,
  70. FWCLPTC = FWRO + 0x0030,
  71. FWCLPRC = FWRO + 0x0034,
  72. FWCMPTC = FWRO + 0x0040,
  73. FWEMPTC = FWRO + 0x0044,
  74. FWSDMPTC = FWRO + 0x0050,
  75. FWSDMPVC = FWRO + 0x0054,
  76. FWLBWMC0 = FWRO + 0x0080,
  77. FWPC00 = FWRO + 0x0100,
  78. FWPC10 = FWRO + 0x0104,
  79. FWPC20 = FWRO + 0x0108,
  80. FWCTGC00 = FWRO + 0x0400,
  81. FWCTGC10 = FWRO + 0x0404,
  82. FWCTTC00 = FWRO + 0x0408,
  83. FWCTTC10 = FWRO + 0x040c,
  84. FWCTTC200 = FWRO + 0x0410,
  85. FWCTSC00 = FWRO + 0x0420,
  86. FWCTSC10 = FWRO + 0x0424,
  87. FWCTSC20 = FWRO + 0x0428,
  88. FWCTSC30 = FWRO + 0x042c,
  89. FWCTSC40 = FWRO + 0x0430,
  90. FWTWBFC0 = FWRO + 0x1000,
  91. FWTWBFVC0 = FWRO + 0x1004,
  92. FWTHBFC0 = FWRO + 0x1400,
  93. FWTHBFV0C0 = FWRO + 0x1404,
  94. FWTHBFV1C0 = FWRO + 0x1408,
  95. FWFOBFC0 = FWRO + 0x1800,
  96. FWFOBFV0C0 = FWRO + 0x1804,
  97. FWFOBFV1C0 = FWRO + 0x1808,
  98. FWRFC0 = FWRO + 0x1c00,
  99. FWRFVC0 = FWRO + 0x1c04,
  100. FWCFC0 = FWRO + 0x2000,
  101. FWCFMC00 = FWRO + 0x2004,
  102. FWIP4SC = FWRO + 0x4008,
  103. FWIP6SC = FWRO + 0x4018,
  104. FWIP6OC = FWRO + 0x401c,
  105. FWL2SC = FWRO + 0x4020,
  106. FWSFHEC = FWRO + 0x4030,
  107. FWSHCR0 = FWRO + 0x4040,
  108. FWSHCR1 = FWRO + 0x4044,
  109. FWSHCR2 = FWRO + 0x4048,
  110. FWSHCR3 = FWRO + 0x404c,
  111. FWSHCR4 = FWRO + 0x4050,
  112. FWSHCR5 = FWRO + 0x4054,
  113. FWSHCR6 = FWRO + 0x4058,
  114. FWSHCR7 = FWRO + 0x405c,
  115. FWSHCR8 = FWRO + 0x4060,
  116. FWSHCR9 = FWRO + 0x4064,
  117. FWSHCR10 = FWRO + 0x4068,
  118. FWSHCR11 = FWRO + 0x406c,
  119. FWSHCR12 = FWRO + 0x4070,
  120. FWSHCR13 = FWRO + 0x4074,
  121. FWSHCRR = FWRO + 0x4078,
  122. FWLTHHEC = FWRO + 0x4090,
  123. FWLTHHC = FWRO + 0x4094,
  124. FWLTHTL0 = FWRO + 0x40a0,
  125. FWLTHTL1 = FWRO + 0x40a4,
  126. FWLTHTL2 = FWRO + 0x40a8,
  127. FWLTHTL3 = FWRO + 0x40ac,
  128. FWLTHTL4 = FWRO + 0x40b0,
  129. FWLTHTL5 = FWRO + 0x40b4,
  130. FWLTHTL6 = FWRO + 0x40b8,
  131. FWLTHTL7 = FWRO + 0x40bc,
  132. FWLTHTL80 = FWRO + 0x40c0,
  133. FWLTHTL9 = FWRO + 0x40d0,
  134. FWLTHTLR = FWRO + 0x40d4,
  135. FWLTHTIM = FWRO + 0x40e0,
  136. FWLTHTEM = FWRO + 0x40e4,
  137. FWLTHTS0 = FWRO + 0x4100,
  138. FWLTHTS1 = FWRO + 0x4104,
  139. FWLTHTS2 = FWRO + 0x4108,
  140. FWLTHTS3 = FWRO + 0x410c,
  141. FWLTHTS4 = FWRO + 0x4110,
  142. FWLTHTSR0 = FWRO + 0x4120,
  143. FWLTHTSR1 = FWRO + 0x4124,
  144. FWLTHTSR2 = FWRO + 0x4128,
  145. FWLTHTSR3 = FWRO + 0x412c,
  146. FWLTHTSR40 = FWRO + 0x4130,
  147. FWLTHTSR5 = FWRO + 0x4140,
  148. FWLTHTR = FWRO + 0x4150,
  149. FWLTHTRR0 = FWRO + 0x4154,
  150. FWLTHTRR1 = FWRO + 0x4158,
  151. FWLTHTRR2 = FWRO + 0x415c,
  152. FWLTHTRR3 = FWRO + 0x4160,
  153. FWLTHTRR4 = FWRO + 0x4164,
  154. FWLTHTRR5 = FWRO + 0x4168,
  155. FWLTHTRR6 = FWRO + 0x416c,
  156. FWLTHTRR7 = FWRO + 0x4170,
  157. FWLTHTRR8 = FWRO + 0x4174,
  158. FWLTHTRR9 = FWRO + 0x4180,
  159. FWLTHTRR10 = FWRO + 0x4190,
  160. FWIPHEC = FWRO + 0x4214,
  161. FWIPHC = FWRO + 0x4218,
  162. FWIPTL0 = FWRO + 0x4220,
  163. FWIPTL1 = FWRO + 0x4224,
  164. FWIPTL2 = FWRO + 0x4228,
  165. FWIPTL3 = FWRO + 0x422c,
  166. FWIPTL4 = FWRO + 0x4230,
  167. FWIPTL5 = FWRO + 0x4234,
  168. FWIPTL6 = FWRO + 0x4238,
  169. FWIPTL7 = FWRO + 0x4240,
  170. FWIPTL8 = FWRO + 0x4250,
  171. FWIPTLR = FWRO + 0x4254,
  172. FWIPTIM = FWRO + 0x4260,
  173. FWIPTEM = FWRO + 0x4264,
  174. FWIPTS0 = FWRO + 0x4270,
  175. FWIPTS1 = FWRO + 0x4274,
  176. FWIPTS2 = FWRO + 0x4278,
  177. FWIPTS3 = FWRO + 0x427c,
  178. FWIPTS4 = FWRO + 0x4280,
  179. FWIPTSR0 = FWRO + 0x4284,
  180. FWIPTSR1 = FWRO + 0x4288,
  181. FWIPTSR2 = FWRO + 0x428c,
  182. FWIPTSR3 = FWRO + 0x4290,
  183. FWIPTSR4 = FWRO + 0x42a0,
  184. FWIPTR = FWRO + 0x42b0,
  185. FWIPTRR0 = FWRO + 0x42b4,
  186. FWIPTRR1 = FWRO + 0x42b8,
  187. FWIPTRR2 = FWRO + 0x42bc,
  188. FWIPTRR3 = FWRO + 0x42c0,
  189. FWIPTRR4 = FWRO + 0x42c4,
  190. FWIPTRR5 = FWRO + 0x42c8,
  191. FWIPTRR6 = FWRO + 0x42cc,
  192. FWIPTRR7 = FWRO + 0x42d0,
  193. FWIPTRR8 = FWRO + 0x42e0,
  194. FWIPTRR9 = FWRO + 0x42f0,
  195. FWIPHLEC = FWRO + 0x4300,
  196. FWIPAGUSPC = FWRO + 0x4500,
  197. FWIPAGC = FWRO + 0x4504,
  198. FWIPAGM0 = FWRO + 0x4510,
  199. FWIPAGM1 = FWRO + 0x4514,
  200. FWIPAGM2 = FWRO + 0x4518,
  201. FWIPAGM3 = FWRO + 0x451c,
  202. FWIPAGM4 = FWRO + 0x4520,
  203. FWMACHEC = FWRO + 0x4620,
  204. FWMACHC = FWRO + 0x4624,
  205. FWMACTL0 = FWRO + 0x4630,
  206. FWMACTL1 = FWRO + 0x4634,
  207. FWMACTL2 = FWRO + 0x4638,
  208. FWMACTL3 = FWRO + 0x463c,
  209. FWMACTL4 = FWRO + 0x4640,
  210. FWMACTL5 = FWRO + 0x4650,
  211. FWMACTLR = FWRO + 0x4654,
  212. FWMACTIM = FWRO + 0x4660,
  213. FWMACTEM = FWRO + 0x4664,
  214. FWMACTS0 = FWRO + 0x4670,
  215. FWMACTS1 = FWRO + 0x4674,
  216. FWMACTSR0 = FWRO + 0x4678,
  217. FWMACTSR1 = FWRO + 0x467c,
  218. FWMACTSR2 = FWRO + 0x4680,
  219. FWMACTSR3 = FWRO + 0x4690,
  220. FWMACTR = FWRO + 0x46a0,
  221. FWMACTRR0 = FWRO + 0x46a4,
  222. FWMACTRR1 = FWRO + 0x46a8,
  223. FWMACTRR2 = FWRO + 0x46ac,
  224. FWMACTRR3 = FWRO + 0x46b0,
  225. FWMACTRR4 = FWRO + 0x46b4,
  226. FWMACTRR5 = FWRO + 0x46c0,
  227. FWMACTRR6 = FWRO + 0x46d0,
  228. FWMACHLEC = FWRO + 0x4700,
  229. FWMACAGUSPC = FWRO + 0x4880,
  230. FWMACAGC = FWRO + 0x4884,
  231. FWMACAGM0 = FWRO + 0x4888,
  232. FWMACAGM1 = FWRO + 0x488c,
  233. FWVLANTEC = FWRO + 0x4900,
  234. FWVLANTL0 = FWRO + 0x4910,
  235. FWVLANTL1 = FWRO + 0x4914,
  236. FWVLANTL2 = FWRO + 0x4918,
  237. FWVLANTL3 = FWRO + 0x4920,
  238. FWVLANTL4 = FWRO + 0x4930,
  239. FWVLANTLR = FWRO + 0x4934,
  240. FWVLANTIM = FWRO + 0x4940,
  241. FWVLANTEM = FWRO + 0x4944,
  242. FWVLANTS = FWRO + 0x4950,
  243. FWVLANTSR0 = FWRO + 0x4954,
  244. FWVLANTSR1 = FWRO + 0x4958,
  245. FWVLANTSR2 = FWRO + 0x4960,
  246. FWVLANTSR3 = FWRO + 0x4970,
  247. FWPBFC0 = FWRO + 0x4a00,
  248. FWPBFCSDC00 = FWRO + 0x4a04,
  249. FWL23URL0 = FWRO + 0x4e00,
  250. FWL23URL1 = FWRO + 0x4e04,
  251. FWL23URL2 = FWRO + 0x4e08,
  252. FWL23URL3 = FWRO + 0x4e0c,
  253. FWL23URLR = FWRO + 0x4e10,
  254. FWL23UTIM = FWRO + 0x4e20,
  255. FWL23URR = FWRO + 0x4e30,
  256. FWL23URRR0 = FWRO + 0x4e34,
  257. FWL23URRR1 = FWRO + 0x4e38,
  258. FWL23URRR2 = FWRO + 0x4e3c,
  259. FWL23URRR3 = FWRO + 0x4e40,
  260. FWL23URMC0 = FWRO + 0x4f00,
  261. FWPMFGC0 = FWRO + 0x5000,
  262. FWPGFC0 = FWRO + 0x5100,
  263. FWPGFIGSC0 = FWRO + 0x5104,
  264. FWPGFENC0 = FWRO + 0x5108,
  265. FWPGFENM0 = FWRO + 0x510c,
  266. FWPGFCSTC00 = FWRO + 0x5110,
  267. FWPGFCSTC10 = FWRO + 0x5114,
  268. FWPGFCSTM00 = FWRO + 0x5118,
  269. FWPGFCSTM10 = FWRO + 0x511c,
  270. FWPGFCTC0 = FWRO + 0x5120,
  271. FWPGFCTM0 = FWRO + 0x5124,
  272. FWPGFHCC0 = FWRO + 0x5128,
  273. FWPGFSM0 = FWRO + 0x512c,
  274. FWPGFGC0 = FWRO + 0x5130,
  275. FWPGFGL0 = FWRO + 0x5500,
  276. FWPGFGL1 = FWRO + 0x5504,
  277. FWPGFGLR = FWRO + 0x5518,
  278. FWPGFGR = FWRO + 0x5510,
  279. FWPGFGRR0 = FWRO + 0x5514,
  280. FWPGFGRR1 = FWRO + 0x5518,
  281. FWPGFRIM = FWRO + 0x5520,
  282. FWPMTRFC0 = FWRO + 0x5600,
  283. FWPMTRCBSC0 = FWRO + 0x5604,
  284. FWPMTRC0RC0 = FWRO + 0x5608,
  285. FWPMTREBSC0 = FWRO + 0x560c,
  286. FWPMTREIRC0 = FWRO + 0x5610,
  287. FWPMTRFM0 = FWRO + 0x5614,
  288. FWFTL0 = FWRO + 0x6000,
  289. FWFTL1 = FWRO + 0x6004,
  290. FWFTLR = FWRO + 0x6008,
  291. FWFTOC = FWRO + 0x6010,
  292. FWFTOPC = FWRO + 0x6014,
  293. FWFTIM = FWRO + 0x6020,
  294. FWFTR = FWRO + 0x6030,
  295. FWFTRR0 = FWRO + 0x6034,
  296. FWFTRR1 = FWRO + 0x6038,
  297. FWFTRR2 = FWRO + 0x603c,
  298. FWSEQNGC0 = FWRO + 0x6100,
  299. FWSEQNGM0 = FWRO + 0x6104,
  300. FWSEQNRC = FWRO + 0x6200,
  301. FWCTFDCN0 = FWRO + 0x6300,
  302. FWLTHFDCN0 = FWRO + 0x6304,
  303. FWIPFDCN0 = FWRO + 0x6308,
  304. FWLTWFDCN0 = FWRO + 0x630c,
  305. FWPBFDCN0 = FWRO + 0x6310,
  306. FWMHLCN0 = FWRO + 0x6314,
  307. FWIHLCN0 = FWRO + 0x6318,
  308. FWICRDCN0 = FWRO + 0x6500,
  309. FWWMRDCN0 = FWRO + 0x6504,
  310. FWCTRDCN0 = FWRO + 0x6508,
  311. FWLTHRDCN0 = FWRO + 0x650c,
  312. FWIPRDCN0 = FWRO + 0x6510,
  313. FWLTWRDCN0 = FWRO + 0x6514,
  314. FWPBRDCN0 = FWRO + 0x6518,
  315. FWPMFDCN0 = FWRO + 0x6700,
  316. FWPGFDCN0 = FWRO + 0x6780,
  317. FWPMGDCN0 = FWRO + 0x6800,
  318. FWPMYDCN0 = FWRO + 0x6804,
  319. FWPMRDCN0 = FWRO + 0x6808,
  320. FWFRPPCN0 = FWRO + 0x6a00,
  321. FWFRDPCN0 = FWRO + 0x6a04,
  322. FWEIS00 = FWRO + 0x7900,
  323. FWEIE00 = FWRO + 0x7904,
  324. FWEID00 = FWRO + 0x7908,
  325. FWEIS1 = FWRO + 0x7a00,
  326. FWEIE1 = FWRO + 0x7a04,
  327. FWEID1 = FWRO + 0x7a08,
  328. FWEIS2 = FWRO + 0x7a10,
  329. FWEIE2 = FWRO + 0x7a14,
  330. FWEID2 = FWRO + 0x7a18,
  331. FWEIS3 = FWRO + 0x7a20,
  332. FWEIE3 = FWRO + 0x7a24,
  333. FWEID3 = FWRO + 0x7a28,
  334. FWEIS4 = FWRO + 0x7a30,
  335. FWEIE4 = FWRO + 0x7a34,
  336. FWEID4 = FWRO + 0x7a38,
  337. FWEIS5 = FWRO + 0x7a40,
  338. FWEIE5 = FWRO + 0x7a44,
  339. FWEID5 = FWRO + 0x7a48,
  340. FWEIS60 = FWRO + 0x7a50,
  341. FWEIE60 = FWRO + 0x7a54,
  342. FWEID60 = FWRO + 0x7a58,
  343. FWEIS61 = FWRO + 0x7a60,
  344. FWEIE61 = FWRO + 0x7a64,
  345. FWEID61 = FWRO + 0x7a68,
  346. FWEIS62 = FWRO + 0x7a70,
  347. FWEIE62 = FWRO + 0x7a74,
  348. FWEID62 = FWRO + 0x7a78,
  349. FWEIS63 = FWRO + 0x7a80,
  350. FWEIE63 = FWRO + 0x7a84,
  351. FWEID63 = FWRO + 0x7a88,
  352. FWEIS70 = FWRO + 0x7a90,
  353. FWEIE70 = FWRO + 0x7A94,
  354. FWEID70 = FWRO + 0x7a98,
  355. FWEIS71 = FWRO + 0x7aa0,
  356. FWEIE71 = FWRO + 0x7aa4,
  357. FWEID71 = FWRO + 0x7aa8,
  358. FWEIS72 = FWRO + 0x7ab0,
  359. FWEIE72 = FWRO + 0x7ab4,
  360. FWEID72 = FWRO + 0x7ab8,
  361. FWEIS73 = FWRO + 0x7ac0,
  362. FWEIE73 = FWRO + 0x7ac4,
  363. FWEID73 = FWRO + 0x7ac8,
  364. FWEIS80 = FWRO + 0x7ad0,
  365. FWEIE80 = FWRO + 0x7ad4,
  366. FWEID80 = FWRO + 0x7ad8,
  367. FWEIS81 = FWRO + 0x7ae0,
  368. FWEIE81 = FWRO + 0x7ae4,
  369. FWEID81 = FWRO + 0x7ae8,
  370. FWEIS82 = FWRO + 0x7af0,
  371. FWEIE82 = FWRO + 0x7af4,
  372. FWEID82 = FWRO + 0x7af8,
  373. FWEIS83 = FWRO + 0x7b00,
  374. FWEIE83 = FWRO + 0x7b04,
  375. FWEID83 = FWRO + 0x7b08,
  376. FWMIS0 = FWRO + 0x7c00,
  377. FWMIE0 = FWRO + 0x7c04,
  378. FWMID0 = FWRO + 0x7c08,
  379. FWSCR0 = FWRO + 0x7d00,
  380. FWSCR1 = FWRO + 0x7d04,
  381. FWSCR2 = FWRO + 0x7d08,
  382. FWSCR3 = FWRO + 0x7d0c,
  383. FWSCR4 = FWRO + 0x7d10,
  384. FWSCR5 = FWRO + 0x7d14,
  385. FWSCR6 = FWRO + 0x7d18,
  386. FWSCR7 = FWRO + 0x7d1c,
  387. FWSCR8 = FWRO + 0x7d20,
  388. FWSCR9 = FWRO + 0x7d24,
  389. FWSCR10 = FWRO + 0x7d28,
  390. FWSCR11 = FWRO + 0x7d2c,
  391. FWSCR12 = FWRO + 0x7d30,
  392. FWSCR13 = FWRO + 0x7d34,
  393. FWSCR14 = FWRO + 0x7d38,
  394. FWSCR15 = FWRO + 0x7d3c,
  395. FWSCR16 = FWRO + 0x7d40,
  396. FWSCR17 = FWRO + 0x7d44,
  397. FWSCR18 = FWRO + 0x7d48,
  398. FWSCR19 = FWRO + 0x7d4c,
  399. FWSCR20 = FWRO + 0x7d50,
  400. FWSCR21 = FWRO + 0x7d54,
  401. FWSCR22 = FWRO + 0x7d58,
  402. FWSCR23 = FWRO + 0x7d5c,
  403. FWSCR24 = FWRO + 0x7d60,
  404. FWSCR25 = FWRO + 0x7d64,
  405. FWSCR26 = FWRO + 0x7d68,
  406. FWSCR27 = FWRO + 0x7d6c,
  407. FWSCR28 = FWRO + 0x7d70,
  408. FWSCR29 = FWRO + 0x7d74,
  409. FWSCR30 = FWRO + 0x7d78,
  410. FWSCR31 = FWRO + 0x7d7c,
  411. FWSCR32 = FWRO + 0x7d80,
  412. FWSCR33 = FWRO + 0x7d84,
  413. FWSCR34 = FWRO + 0x7d88,
  414. FWSCR35 = FWRO + 0x7d8c,
  415. FWSCR36 = FWRO + 0x7d90,
  416. FWSCR37 = FWRO + 0x7d94,
  417. FWSCR38 = FWRO + 0x7d98,
  418. FWSCR39 = FWRO + 0x7d9c,
  419. FWSCR40 = FWRO + 0x7da0,
  420. FWSCR41 = FWRO + 0x7da4,
  421. FWSCR42 = FWRO + 0x7da8,
  422. FWSCR43 = FWRO + 0x7dac,
  423. FWSCR44 = FWRO + 0x7db0,
  424. FWSCR45 = FWRO + 0x7db4,
  425. FWSCR46 = FWRO + 0x7db8,
  426. TPEMIMC0 = TPRO + 0x0000,
  427. TPEMIMC1 = TPRO + 0x0004,
  428. TPEMIMC2 = TPRO + 0x0008,
  429. TPEMIMC3 = TPRO + 0x000c,
  430. TPEMIMC4 = TPRO + 0x0010,
  431. TPEMIMC5 = TPRO + 0x0014,
  432. TPEMIMC60 = TPRO + 0x0080,
  433. TPEMIMC70 = TPRO + 0x0100,
  434. TSIM = TPRO + 0x0700,
  435. TFIM = TPRO + 0x0704,
  436. TCIM = TPRO + 0x0708,
  437. TGIM0 = TPRO + 0x0710,
  438. TGIM1 = TPRO + 0x0714,
  439. TEIM0 = TPRO + 0x0720,
  440. TEIM1 = TPRO + 0x0724,
  441. TEIM2 = TPRO + 0x0728,
  442. RIPV = CARO + 0x0000,
  443. RRC = CARO + 0x0004,
  444. RCEC = CARO + 0x0008,
  445. RCDC = CARO + 0x000c,
  446. RSSIS = CARO + 0x0010,
  447. RSSIE = CARO + 0x0014,
  448. RSSID = CARO + 0x0018,
  449. CABPIBWMC = CARO + 0x0020,
  450. CABPWMLC = CARO + 0x0040,
  451. CABPPFLC0 = CARO + 0x0050,
  452. CABPPWMLC0 = CARO + 0x0060,
  453. CABPPPFLC00 = CARO + 0x00a0,
  454. CABPULC = CARO + 0x0100,
  455. CABPIRM = CARO + 0x0140,
  456. CABPPCM = CARO + 0x0144,
  457. CABPLCM = CARO + 0x0148,
  458. CABPCPM = CARO + 0x0180,
  459. CABPMCPM = CARO + 0x0200,
  460. CARDNM = CARO + 0x0280,
  461. CARDMNM = CARO + 0x0284,
  462. CARDCN = CARO + 0x0290,
  463. CAEIS0 = CARO + 0x0300,
  464. CAEIE0 = CARO + 0x0304,
  465. CAEID0 = CARO + 0x0308,
  466. CAEIS1 = CARO + 0x0310,
  467. CAEIE1 = CARO + 0x0314,
  468. CAEID1 = CARO + 0x0318,
  469. CAMIS0 = CARO + 0x0340,
  470. CAMIE0 = CARO + 0x0344,
  471. CAMID0 = CARO + 0x0348,
  472. CAMIS1 = CARO + 0x0350,
  473. CAMIE1 = CARO + 0x0354,
  474. CAMID1 = CARO + 0x0358,
  475. CASCR = CARO + 0x0380,
  476. EAMC = TARO + 0x0000,
  477. EAMS = TARO + 0x0004,
  478. EAIRC = TARO + 0x0010,
  479. EATDQSC = TARO + 0x0014,
  480. EATDQC = TARO + 0x0018,
  481. EATDQAC = TARO + 0x001c,
  482. EATPEC = TARO + 0x0020,
  483. EATMFSC0 = TARO + 0x0040,
  484. EATDQDC0 = TARO + 0x0060,
  485. EATDQM0 = TARO + 0x0080,
  486. EATDQMLM0 = TARO + 0x00a0,
  487. EACTQC = TARO + 0x0100,
  488. EACTDQDC = TARO + 0x0104,
  489. EACTDQM = TARO + 0x0108,
  490. EACTDQMLM = TARO + 0x010c,
  491. EAVCC = TARO + 0x0130,
  492. EAVTC = TARO + 0x0134,
  493. EATTFC = TARO + 0x0138,
  494. EACAEC = TARO + 0x0200,
  495. EACC = TARO + 0x0204,
  496. EACAIVC0 = TARO + 0x0220,
  497. EACAULC0 = TARO + 0x0240,
  498. EACOEM = TARO + 0x0260,
  499. EACOIVM0 = TARO + 0x0280,
  500. EACOULM0 = TARO + 0x02a0,
  501. EACGSM = TARO + 0x02c0,
  502. EATASC = TARO + 0x0300,
  503. EATASENC0 = TARO + 0x0320,
  504. EATASCTENC = TARO + 0x0340,
  505. EATASENM0 = TARO + 0x0360,
  506. EATASCTENM = TARO + 0x0380,
  507. EATASCSTC0 = TARO + 0x03a0,
  508. EATASCSTC1 = TARO + 0x03a4,
  509. EATASCSTM0 = TARO + 0x03a8,
  510. EATASCSTM1 = TARO + 0x03ac,
  511. EATASCTC = TARO + 0x03b0,
  512. EATASCTM = TARO + 0x03b4,
  513. EATASGL0 = TARO + 0x03c0,
  514. EATASGL1 = TARO + 0x03c4,
  515. EATASGLR = TARO + 0x03c8,
  516. EATASGR = TARO + 0x03d0,
  517. EATASGRR = TARO + 0x03d4,
  518. EATASHCC = TARO + 0x03e0,
  519. EATASRIRM = TARO + 0x03e4,
  520. EATASSM = TARO + 0x03e8,
  521. EAUSMFSECN = TARO + 0x0400,
  522. EATFECN = TARO + 0x0404,
  523. EAFSECN = TARO + 0x0408,
  524. EADQOECN = TARO + 0x040c,
  525. EADQSECN = TARO + 0x0410,
  526. EACKSECN = TARO + 0x0414,
  527. EAEIS0 = TARO + 0x0500,
  528. EAEIE0 = TARO + 0x0504,
  529. EAEID0 = TARO + 0x0508,
  530. EAEIS1 = TARO + 0x0510,
  531. EAEIE1 = TARO + 0x0514,
  532. EAEID1 = TARO + 0x0518,
  533. EAEIS2 = TARO + 0x0520,
  534. EAEIE2 = TARO + 0x0524,
  535. EAEID2 = TARO + 0x0528,
  536. EASCR = TARO + 0x0580,
  537. MPSM = RMRO + 0x0000,
  538. MPIC = RMRO + 0x0004,
  539. MPIM = RMRO + 0x0008,
  540. MIOC = RMRO + 0x0010,
  541. MIOM = RMRO + 0x0014,
  542. MXMS = RMRO + 0x0018,
  543. MTFFC = RMRO + 0x0020,
  544. MTPFC = RMRO + 0x0024,
  545. MTPFC2 = RMRO + 0x0028,
  546. MTPFC30 = RMRO + 0x0030,
  547. MTATC0 = RMRO + 0x0050,
  548. MTIM = RMRO + 0x0060,
  549. MRGC = RMRO + 0x0080,
  550. MRMAC0 = RMRO + 0x0084,
  551. MRMAC1 = RMRO + 0x0088,
  552. MRAFC = RMRO + 0x008c,
  553. MRSCE = RMRO + 0x0090,
  554. MRSCP = RMRO + 0x0094,
  555. MRSCC = RMRO + 0x0098,
  556. MRFSCE = RMRO + 0x009c,
  557. MRFSCP = RMRO + 0x00a0,
  558. MTRC = RMRO + 0x00a4,
  559. MRIM = RMRO + 0x00a8,
  560. MRPFM = RMRO + 0x00ac,
  561. MPFC0 = RMRO + 0x0100,
  562. MLVC = RMRO + 0x0180,
  563. MEEEC = RMRO + 0x0184,
  564. MLBC = RMRO + 0x0188,
  565. MXGMIIC = RMRO + 0x0190,
  566. MPCH = RMRO + 0x0194,
  567. MANC = RMRO + 0x0198,
  568. MANM = RMRO + 0x019c,
  569. MPLCA1 = RMRO + 0x01a0,
  570. MPLCA2 = RMRO + 0x01a4,
  571. MPLCA3 = RMRO + 0x01a8,
  572. MPLCA4 = RMRO + 0x01ac,
  573. MPLCAM = RMRO + 0x01b0,
  574. MHDC1 = RMRO + 0x01c0,
  575. MHDC2 = RMRO + 0x01c4,
  576. MEIS = RMRO + 0x0200,
  577. MEIE = RMRO + 0x0204,
  578. MEID = RMRO + 0x0208,
  579. MMIS0 = RMRO + 0x0210,
  580. MMIE0 = RMRO + 0x0214,
  581. MMID0 = RMRO + 0x0218,
  582. MMIS1 = RMRO + 0x0220,
  583. MMIE1 = RMRO + 0x0224,
  584. MMID1 = RMRO + 0x0228,
  585. MMIS2 = RMRO + 0x0230,
  586. MMIE2 = RMRO + 0x0234,
  587. MMID2 = RMRO + 0x0238,
  588. MMPFTCT = RMRO + 0x0300,
  589. MAPFTCT = RMRO + 0x0304,
  590. MPFRCT = RMRO + 0x0308,
  591. MFCICT = RMRO + 0x030c,
  592. MEEECT = RMRO + 0x0310,
  593. MMPCFTCT0 = RMRO + 0x0320,
  594. MAPCFTCT0 = RMRO + 0x0330,
  595. MPCFRCT0 = RMRO + 0x0340,
  596. MHDCC = RMRO + 0x0350,
  597. MROVFC = RMRO + 0x0354,
  598. MRHCRCEC = RMRO + 0x0358,
  599. MRXBCE = RMRO + 0x0400,
  600. MRXBCP = RMRO + 0x0404,
  601. MRGFCE = RMRO + 0x0408,
  602. MRGFCP = RMRO + 0x040c,
  603. MRBFC = RMRO + 0x0410,
  604. MRMFC = RMRO + 0x0414,
  605. MRUFC = RMRO + 0x0418,
  606. MRPEFC = RMRO + 0x041c,
  607. MRNEFC = RMRO + 0x0420,
  608. MRFMEFC = RMRO + 0x0424,
  609. MRFFMEFC = RMRO + 0x0428,
  610. MRCFCEFC = RMRO + 0x042c,
  611. MRFCEFC = RMRO + 0x0430,
  612. MRRCFEFC = RMRO + 0x0434,
  613. MRUEFC = RMRO + 0x043c,
  614. MROEFC = RMRO + 0x0440,
  615. MRBOEC = RMRO + 0x0444,
  616. MTXBCE = RMRO + 0x0500,
  617. MTXBCP = RMRO + 0x0504,
  618. MTGFCE = RMRO + 0x0508,
  619. MTGFCP = RMRO + 0x050c,
  620. MTBFC = RMRO + 0x0510,
  621. MTMFC = RMRO + 0x0514,
  622. MTUFC = RMRO + 0x0518,
  623. MTEFC = RMRO + 0x051c,
  624. GWMC = GWRO + 0x0000,
  625. GWMS = GWRO + 0x0004,
  626. GWIRC = GWRO + 0x0010,
  627. GWRDQSC = GWRO + 0x0014,
  628. GWRDQC = GWRO + 0x0018,
  629. GWRDQAC = GWRO + 0x001c,
  630. GWRGC = GWRO + 0x0020,
  631. GWRMFSC0 = GWRO + 0x0040,
  632. GWRDQDC0 = GWRO + 0x0060,
  633. GWRDQM0 = GWRO + 0x0080,
  634. GWRDQMLM0 = GWRO + 0x00a0,
  635. GWMTIRM = GWRO + 0x0100,
  636. GWMSTLS = GWRO + 0x0104,
  637. GWMSTLR = GWRO + 0x0108,
  638. GWMSTSS = GWRO + 0x010c,
  639. GWMSTSR = GWRO + 0x0110,
  640. GWMAC0 = GWRO + 0x0120,
  641. GWMAC1 = GWRO + 0x0124,
  642. GWVCC = GWRO + 0x0130,
  643. GWVTC = GWRO + 0x0134,
  644. GWTTFC = GWRO + 0x0138,
  645. GWTDCAC00 = GWRO + 0x0140,
  646. GWTDCAC10 = GWRO + 0x0144,
  647. GWTSDCC0 = GWRO + 0x0160,
  648. GWTNM = GWRO + 0x0180,
  649. GWTMNM = GWRO + 0x0184,
  650. GWAC = GWRO + 0x0190,
  651. GWDCBAC0 = GWRO + 0x0194,
  652. GWDCBAC1 = GWRO + 0x0198,
  653. GWIICBSC = GWRO + 0x019c,
  654. GWMDNC = GWRO + 0x01a0,
  655. GWTRC0 = GWRO + 0x0200,
  656. GWTPC0 = GWRO + 0x0300,
  657. GWARIRM = GWRO + 0x0380,
  658. GWDCC0 = GWRO + 0x0400,
  659. GWAARSS = GWRO + 0x0800,
  660. GWAARSR0 = GWRO + 0x0804,
  661. GWAARSR1 = GWRO + 0x0808,
  662. GWIDAUAS0 = GWRO + 0x0840,
  663. GWIDASM0 = GWRO + 0x0880,
  664. GWIDASAM00 = GWRO + 0x0900,
  665. GWIDASAM10 = GWRO + 0x0904,
  666. GWIDACAM00 = GWRO + 0x0980,
  667. GWIDACAM10 = GWRO + 0x0984,
  668. GWGRLC = GWRO + 0x0a00,
  669. GWGRLULC = GWRO + 0x0a04,
  670. GWRLIVC0 = GWRO + 0x0a80,
  671. GWRLULC0 = GWRO + 0x0a84,
  672. GWIDPC = GWRO + 0x0b00,
  673. GWIDC0 = GWRO + 0x0c00,
  674. GWDIS0 = GWRO + 0x1100,
  675. GWDIE0 = GWRO + 0x1104,
  676. GWDID0 = GWRO + 0x1108,
  677. GWTSDIS = GWRO + 0x1180,
  678. GWTSDIE = GWRO + 0x1184,
  679. GWTSDID = GWRO + 0x1188,
  680. GWEIS0 = GWRO + 0x1190,
  681. GWEIE0 = GWRO + 0x1194,
  682. GWEID0 = GWRO + 0x1198,
  683. GWEIS1 = GWRO + 0x11a0,
  684. GWEIE1 = GWRO + 0x11a4,
  685. GWEID1 = GWRO + 0x11a8,
  686. GWEIS20 = GWRO + 0x1200,
  687. GWEIE20 = GWRO + 0x1204,
  688. GWEID20 = GWRO + 0x1208,
  689. GWEIS3 = GWRO + 0x1280,
  690. GWEIE3 = GWRO + 0x1284,
  691. GWEID3 = GWRO + 0x1288,
  692. GWEIS4 = GWRO + 0x1290,
  693. GWEIE4 = GWRO + 0x1294,
  694. GWEID4 = GWRO + 0x1298,
  695. GWEIS5 = GWRO + 0x12a0,
  696. GWEIE5 = GWRO + 0x12a4,
  697. GWEID5 = GWRO + 0x12a8,
  698. GWSCR0 = GWRO + 0x1800,
  699. GWSCR1 = GWRO + 0x1900,
  700. };
  701. /* ETHA/RMAC */
  702. enum rswitch_etha_mode {
  703. EAMC_OPC_RESET,
  704. EAMC_OPC_DISABLE,
  705. EAMC_OPC_CONFIG,
  706. EAMC_OPC_OPERATION,
  707. };
  708. #define EAMS_OPS_MASK EAMC_OPC_OPERATION
  709. #define EAVCC_VEM_SC_TAG (0x3 << 16)
  710. #define MPIC_PIS GENMASK(2, 0)
  711. #define MPIC_PIS_GMII 2
  712. #define MPIC_PIS_XGMII 4
  713. #define MPIC_LSC GENMASK(5, 3)
  714. #define MPIC_LSC_100M 1
  715. #define MPIC_LSC_1G 2
  716. #define MPIC_LSC_2_5G 3
  717. #define MPIC_PSMCS GENMASK(22, 16)
  718. #define MPIC_PSMHT GENMASK(26, 24)
  719. #define MPSM_PSME BIT(0)
  720. #define MPSM_MFF BIT(2)
  721. #define MPSM_MMF_C22 0
  722. #define MPSM_MMF_C45 1
  723. #define MPSM_PDA GENMASK(7, 3)
  724. #define MPSM_PRA GENMASK(12, 8)
  725. #define MPSM_POP GENMASK(14, 13)
  726. #define MPSM_POP_ADDRESS 0
  727. #define MPSM_POP_WRITE 1
  728. #define MPSM_POP_READ_C22 2
  729. #define MPSM_POP_READ_C45 3
  730. #define MPSM_PRD GENMASK(31, 16)
  731. #define MLVC_PLV BIT(16)
  732. /* GWCA */
  733. enum rswitch_gwca_mode {
  734. GWMC_OPC_RESET,
  735. GWMC_OPC_DISABLE,
  736. GWMC_OPC_CONFIG,
  737. GWMC_OPC_OPERATION,
  738. };
  739. #define GWMS_OPS_MASK GWMC_OPC_OPERATION
  740. #define GWMTIRM_MTIOG BIT(0)
  741. #define GWMTIRM_MTR BIT(1)
  742. #define GWVCC_VEM_SC_TAG (0x3 << 16)
  743. #define GWARIRM_ARIOG BIT(0)
  744. #define GWARIRM_ARR BIT(1)
  745. #define GWMDNC_TSDMN(num) (((num) << 16) & GENMASK(17, 16))
  746. #define GWMDNC_TXDMN(num) (((num) << 8) & GENMASK(12, 8))
  747. #define GWMDNC_RXDMN(num) ((num) & GENMASK(4, 0))
  748. #define GWDCC_BALR BIT(24)
  749. #define GWDCC_DCP_MASK GENMASK(18, 16)
  750. #define GWDCC_DCP(prio) FIELD_PREP(GWDCC_DCP_MASK, (prio))
  751. #define GWDCC_DQT BIT(11)
  752. #define GWDCC_ETS BIT(9)
  753. #define GWDCC_EDE BIT(8)
  754. #define GWTRC(queue) (GWTRC0 + (queue) / 32 * 4)
  755. #define GWTPC_PPPL(ipv) BIT(ipv)
  756. #define GWDCC_OFFS(queue) (GWDCC0 + (queue) * 4)
  757. #define GWDIS(i) (GWDIS0 + (i) * 0x10)
  758. #define GWDIE(i) (GWDIE0 + (i) * 0x10)
  759. #define GWDID(i) (GWDID0 + (i) * 0x10)
  760. /* COMA */
  761. #define RRC_RR BIT(0)
  762. #define RRC_RR_CLR 0
  763. #define RCEC_ACE_DEFAULT (BIT(0) | BIT(AGENT_INDEX_GWCA))
  764. #define RCEC_RCE BIT(16)
  765. #define RCDC_RCD BIT(16)
  766. #define CABPIRM_BPIOG BIT(0)
  767. #define CABPIRM_BPR BIT(1)
  768. #define CABPPFLC_INIT_VALUE 0x00800080
  769. /* MFWD */
  770. #define FWPC0(i) (FWPC00 + (i) * 0x10)
  771. #define FWPC0_LTHTA BIT(0)
  772. #define FWPC0_IP4UE BIT(3)
  773. #define FWPC0_IP4TE BIT(4)
  774. #define FWPC0_IP4OE BIT(5)
  775. #define FWPC0_L2SE BIT(9)
  776. #define FWPC0_IP4EA BIT(10)
  777. #define FWPC0_IPDSA BIT(12)
  778. #define FWPC0_IPHLA BIT(18)
  779. #define FWPC0_MACDSA BIT(20)
  780. #define FWPC0_MACSSA BIT(23)
  781. #define FWPC0_MACHLA BIT(26)
  782. #define FWPC0_MACHMA BIT(27)
  783. #define FWPC0_VLANSA BIT(28)
  784. #define FWPC1(i) (FWPC10 + (i) * 0x10)
  785. #define FWCP1_LTHFW GENMASK(16 + (RSWITCH_NUM_AGENTS - 1), 16)
  786. #define FWPC1_DDE BIT(0)
  787. #define FWPC2(i) (FWPC20 + (i) * 0x10)
  788. #define FWCP2_LTWFW GENMASK(16 + (RSWITCH_NUM_AGENTS - 1), 16)
  789. #define FWCP2_LTWFW_MASK GENMASK(16 + (RSWITCH_NUM_AGENTS - 1), 16)
  790. #define FWPBFC(i) (FWPBFC0 + (i) * 0x10)
  791. #define FWPBFC_PBDV GENMASK(RSWITCH_NUM_AGENTS - 1, 0)
  792. #define FWPBFCSDC(j, i) (FWPBFCSDC00 + (i) * 0x10 + (j) * 0x04)
  793. #define FWMACHEC_MACHMUE_MASK GENMASK(26, 16)
  794. #define FWMACTIM_MACTIOG BIT(0)
  795. #define FWMACTIM_MACTR BIT(1)
  796. #define FWMACAGUSPC_MACAGUSP GENMASK(9, 0)
  797. #define FWMACAGC_MACAGT GENMASK(15, 0)
  798. #define FWMACAGC_MACAGE BIT(16)
  799. #define FWMACAGC_MACAGSL BIT(17)
  800. #define FWMACAGC_MACAGPM BIT(18)
  801. #define FWMACAGC_MACDES BIT(24)
  802. #define FWMACAGC_MACAGOG BIT(28)
  803. #define FWMACAGC_MACDESOG BIT(29)
  804. #define RSW_AGEING_CLK_PER_US 0x140
  805. #define RSW_AGEING_TIME 300
  806. /* TOP */
  807. #define TPEMIMC7(queue) (TPEMIMC70 + (queue) * 4)
  808. /* Descriptors */
  809. enum RX_DS_CC_BIT {
  810. RX_DS = 0x0fff, /* Data size */
  811. RX_TR = 0x1000, /* Truncation indication */
  812. RX_EI = 0x2000, /* Error indication */
  813. RX_PS = 0xc000, /* Padding selection */
  814. };
  815. enum TX_DS_TAGL_BIT {
  816. TX_DS = 0x0fff, /* Data size */
  817. TX_TAGL = 0xf000, /* Frame tag LSBs */
  818. };
  819. enum DIE_DT {
  820. /* Frame data */
  821. DT_FSINGLE = 0x80,
  822. DT_FSTART = 0x90,
  823. DT_FMID = 0xa0,
  824. DT_FEND = 0xb0,
  825. /* Chain control */
  826. DT_LEMPTY = 0xc0,
  827. DT_EEMPTY = 0xd0,
  828. DT_LINKFIX = 0x00,
  829. DT_LINK = 0xe0,
  830. DT_EOS = 0xf0,
  831. /* HW/SW arbitration */
  832. DT_FEMPTY = 0x40,
  833. DT_FEMPTY_IS = 0x10,
  834. DT_FEMPTY_IC = 0x20,
  835. DT_FEMPTY_ND = 0x30,
  836. DT_FEMPTY_START = 0x50,
  837. DT_FEMPTY_MID = 0x60,
  838. DT_FEMPTY_END = 0x70,
  839. DT_MASK = 0xf0,
  840. DIE = 0x08, /* Descriptor Interrupt Enable */
  841. };
  842. /* Both transmission and reception */
  843. #define INFO1_FMT BIT(2)
  844. #define INFO1_TXC BIT(3)
  845. /* For transmission */
  846. #define INFO1_TSUN(val) ((u64)(val) << 8ULL)
  847. #define INFO1_IPV(prio) ((u64)(prio) << 28ULL)
  848. #define INFO1_CSD0(index) ((u64)(index) << 32ULL)
  849. #define INFO1_CSD1(index) ((u64)(index) << 40ULL)
  850. #define INFO1_DV(port_vector) ((u64)(port_vector) << 48ULL)
  851. /* For reception */
  852. #define INFO1_SPN(port) ((u64)(port) << 36ULL)
  853. /* For timestamp descriptor in dptrl (Byte 4 to 7) */
  854. #define TS_DESC_TSUN(dptrl) ((dptrl) & GENMASK(7, 0))
  855. #define TS_DESC_SPN(dptrl) (((dptrl) & GENMASK(10, 8)) >> 8)
  856. #define TS_DESC_DPN(dptrl) (((dptrl) & GENMASK(17, 16)) >> 16)
  857. #define TS_DESC_TN(dptrl) ((dptrl) & BIT(24))
  858. struct rswitch_desc {
  859. __le16 info_ds; /* Descriptor size */
  860. u8 die_dt; /* Descriptor interrupt enable and type */
  861. __u8 dptrh; /* Descriptor pointer MSB */
  862. __le32 dptrl; /* Descriptor pointer LSW */
  863. } __packed;
  864. struct rswitch_ts_desc {
  865. struct rswitch_desc desc;
  866. __le32 ts_nsec;
  867. __le32 ts_sec;
  868. } __packed;
  869. struct rswitch_ext_desc {
  870. struct rswitch_desc desc;
  871. __le64 info1;
  872. } __packed;
  873. struct rswitch_ext_ts_desc {
  874. struct rswitch_desc desc;
  875. __le64 info1;
  876. __le32 ts_nsec;
  877. __le32 ts_sec;
  878. } __packed;
  879. struct rswitch_etha {
  880. unsigned int index;
  881. void __iomem *addr;
  882. void __iomem *coma_addr;
  883. bool external_phy;
  884. struct mii_bus *mii;
  885. phy_interface_t phy_interface;
  886. u32 psmcs;
  887. u8 mac_addr[MAX_ADDR_LEN];
  888. int link;
  889. int speed;
  890. /* This hardware could not be initialized twice so that marked
  891. * this flag to avoid multiple initialization.
  892. */
  893. bool operated;
  894. };
  895. /* The datasheet said descriptor "chain" and/or "queue". For consistency of
  896. * name, this driver calls "queue".
  897. */
  898. struct rswitch_gwca_queue {
  899. union {
  900. struct rswitch_ext_desc *tx_ring;
  901. struct rswitch_ext_ts_desc *rx_ring;
  902. struct rswitch_ts_desc *ts_ring;
  903. };
  904. /* Common */
  905. dma_addr_t ring_dma;
  906. unsigned int ring_size;
  907. unsigned int cur;
  908. unsigned int dirty;
  909. /* For [rt]x_ring */
  910. unsigned int index;
  911. bool dir_tx;
  912. struct net_device *ndev; /* queue to ndev for irq */
  913. union {
  914. /* For TX */
  915. struct {
  916. struct sk_buff **skbs;
  917. dma_addr_t *unmap_addrs;
  918. };
  919. /* For RX */
  920. struct {
  921. void **rx_bufs;
  922. struct sk_buff *skb_fstart;
  923. u16 pkt_len;
  924. };
  925. };
  926. };
  927. #define RSWITCH_NUM_IRQ_REGS (RSWITCH_MAX_NUM_QUEUES / BITS_PER_TYPE(u32))
  928. struct rswitch_gwca {
  929. unsigned int index;
  930. struct rswitch_desc *linkfix_table;
  931. dma_addr_t linkfix_table_dma;
  932. u32 linkfix_table_size;
  933. struct rswitch_gwca_queue *queues;
  934. int num_queues;
  935. struct rswitch_gwca_queue ts_queue;
  936. DECLARE_BITMAP(used, RSWITCH_MAX_NUM_QUEUES);
  937. u32 tx_irq_bits[RSWITCH_NUM_IRQ_REGS];
  938. u32 rx_irq_bits[RSWITCH_NUM_IRQ_REGS];
  939. };
  940. #define NUM_QUEUES_PER_NDEV 2
  941. #define TS_TAGS_PER_PORT 256
  942. struct rswitch_device {
  943. struct rswitch_private *priv;
  944. struct net_device *ndev;
  945. struct napi_struct napi;
  946. void __iomem *addr;
  947. struct rswitch_gwca_queue *tx_queue;
  948. struct rswitch_gwca_queue *rx_queue;
  949. struct sk_buff *ts_skb[TS_TAGS_PER_PORT];
  950. DECLARE_BITMAP(ts_skb_used, TS_TAGS_PER_PORT);
  951. bool disabled;
  952. struct list_head list;
  953. int port;
  954. struct rswitch_etha *etha;
  955. struct device_node *np_port;
  956. struct phy *serdes;
  957. struct net_device *brdev; /* master bridge device */
  958. unsigned int learning_requested : 1;
  959. unsigned int learning_offloaded : 1;
  960. unsigned int forwarding_requested : 1;
  961. unsigned int forwarding_offloaded : 1;
  962. };
  963. struct rswitch_mfwd_mac_table_entry {
  964. int queue_index;
  965. unsigned char addr[MAX_ADDR_LEN];
  966. };
  967. struct rswitch_mfwd {
  968. struct rswitch_mac_table_entry *mac_table_entries;
  969. int num_mac_table_entries;
  970. };
  971. struct rswitch_private {
  972. struct platform_device *pdev;
  973. void __iomem *addr;
  974. struct rcar_gen4_ptp_private *ptp_priv;
  975. struct rswitch_device *rdev[RSWITCH_NUM_PORTS];
  976. DECLARE_BITMAP(opened_ports, RSWITCH_NUM_PORTS);
  977. struct rswitch_gwca gwca;
  978. struct rswitch_etha etha[RSWITCH_NUM_PORTS];
  979. struct rswitch_mfwd mfwd;
  980. struct list_head port_list;
  981. spinlock_t lock; /* lock interrupt registers' control */
  982. struct clk *clk;
  983. bool etha_no_runtime_change;
  984. bool gwca_halt;
  985. struct net_device *offload_brdev;
  986. enum hwtstamp_tx_types tstamp_tx_ctrl;
  987. enum hwtstamp_rx_filters tstamp_rx_ctrl;
  988. };
  989. bool is_rdev(const struct net_device *ndev);
  990. void rswitch_modify(void __iomem *addr, enum rswitch_reg reg, u32 clear, u32 set);
  991. #endif /* #ifndef __RSWITCH_H__ */