seville_vsc9953.c 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119
  1. // SPDX-License-Identifier: (GPL-2.0 OR MIT)
  2. /* Distributed Switch Architecture VSC9953 driver
  3. * Copyright (C) 2020, Maxim Kochetkov <[email protected]>
  4. */
  5. #include <linux/types.h>
  6. #include <soc/mscc/ocelot_vcap.h>
  7. #include <soc/mscc/ocelot_sys.h>
  8. #include <soc/mscc/ocelot.h>
  9. #include <linux/mdio/mdio-mscc-miim.h>
  10. #include <linux/of_mdio.h>
  11. #include <linux/of_platform.h>
  12. #include <linux/pcs-lynx.h>
  13. #include <linux/dsa/ocelot.h>
  14. #include <linux/iopoll.h>
  15. #include "felix.h"
  16. #define VSC9953_NUM_PORTS 10
  17. #define VSC9953_VCAP_POLICER_BASE 11
  18. #define VSC9953_VCAP_POLICER_MAX 31
  19. #define VSC9953_VCAP_POLICER_BASE2 120
  20. #define VSC9953_VCAP_POLICER_MAX2 161
  21. #define VSC9953_PORT_MODE_SERDES (OCELOT_PORT_MODE_1000BASEX | \
  22. OCELOT_PORT_MODE_SGMII | \
  23. OCELOT_PORT_MODE_QSGMII)
  24. static const u32 vsc9953_port_modes[VSC9953_NUM_PORTS] = {
  25. VSC9953_PORT_MODE_SERDES,
  26. VSC9953_PORT_MODE_SERDES,
  27. VSC9953_PORT_MODE_SERDES,
  28. VSC9953_PORT_MODE_SERDES,
  29. VSC9953_PORT_MODE_SERDES,
  30. VSC9953_PORT_MODE_SERDES,
  31. VSC9953_PORT_MODE_SERDES,
  32. VSC9953_PORT_MODE_SERDES,
  33. OCELOT_PORT_MODE_INTERNAL,
  34. OCELOT_PORT_MODE_INTERNAL,
  35. };
  36. static const u32 vsc9953_ana_regmap[] = {
  37. REG(ANA_ADVLEARN, 0x00b500),
  38. REG(ANA_VLANMASK, 0x00b504),
  39. REG_RESERVED(ANA_PORT_B_DOMAIN),
  40. REG(ANA_ANAGEFIL, 0x00b50c),
  41. REG(ANA_ANEVENTS, 0x00b510),
  42. REG(ANA_STORMLIMIT_BURST, 0x00b514),
  43. REG(ANA_STORMLIMIT_CFG, 0x00b518),
  44. REG(ANA_ISOLATED_PORTS, 0x00b528),
  45. REG(ANA_COMMUNITY_PORTS, 0x00b52c),
  46. REG(ANA_AUTOAGE, 0x00b530),
  47. REG(ANA_MACTOPTIONS, 0x00b534),
  48. REG(ANA_LEARNDISC, 0x00b538),
  49. REG(ANA_AGENCTRL, 0x00b53c),
  50. REG(ANA_MIRRORPORTS, 0x00b540),
  51. REG(ANA_EMIRRORPORTS, 0x00b544),
  52. REG(ANA_FLOODING, 0x00b548),
  53. REG(ANA_FLOODING_IPMC, 0x00b54c),
  54. REG(ANA_SFLOW_CFG, 0x00b550),
  55. REG(ANA_PORT_MODE, 0x00b57c),
  56. REG_RESERVED(ANA_CUT_THRU_CFG),
  57. REG(ANA_PGID_PGID, 0x00b600),
  58. REG(ANA_TABLES_ANMOVED, 0x00b4ac),
  59. REG(ANA_TABLES_MACHDATA, 0x00b4b0),
  60. REG(ANA_TABLES_MACLDATA, 0x00b4b4),
  61. REG_RESERVED(ANA_TABLES_STREAMDATA),
  62. REG(ANA_TABLES_MACACCESS, 0x00b4b8),
  63. REG(ANA_TABLES_MACTINDX, 0x00b4bc),
  64. REG(ANA_TABLES_VLANACCESS, 0x00b4c0),
  65. REG(ANA_TABLES_VLANTIDX, 0x00b4c4),
  66. REG_RESERVED(ANA_TABLES_ISDXACCESS),
  67. REG_RESERVED(ANA_TABLES_ISDXTIDX),
  68. REG(ANA_TABLES_ENTRYLIM, 0x00b480),
  69. REG_RESERVED(ANA_TABLES_PTP_ID_HIGH),
  70. REG_RESERVED(ANA_TABLES_PTP_ID_LOW),
  71. REG_RESERVED(ANA_TABLES_STREAMACCESS),
  72. REG_RESERVED(ANA_TABLES_STREAMTIDX),
  73. REG_RESERVED(ANA_TABLES_SEQ_HISTORY),
  74. REG_RESERVED(ANA_TABLES_SEQ_MASK),
  75. REG_RESERVED(ANA_TABLES_SFID_MASK),
  76. REG_RESERVED(ANA_TABLES_SFIDACCESS),
  77. REG_RESERVED(ANA_TABLES_SFIDTIDX),
  78. REG_RESERVED(ANA_MSTI_STATE),
  79. REG_RESERVED(ANA_OAM_UPM_LM_CNT),
  80. REG_RESERVED(ANA_SG_ACCESS_CTRL),
  81. REG_RESERVED(ANA_SG_CONFIG_REG_1),
  82. REG_RESERVED(ANA_SG_CONFIG_REG_2),
  83. REG_RESERVED(ANA_SG_CONFIG_REG_3),
  84. REG_RESERVED(ANA_SG_CONFIG_REG_4),
  85. REG_RESERVED(ANA_SG_CONFIG_REG_5),
  86. REG_RESERVED(ANA_SG_GCL_GS_CONFIG),
  87. REG_RESERVED(ANA_SG_GCL_TI_CONFIG),
  88. REG_RESERVED(ANA_SG_STATUS_REG_1),
  89. REG_RESERVED(ANA_SG_STATUS_REG_2),
  90. REG_RESERVED(ANA_SG_STATUS_REG_3),
  91. REG(ANA_PORT_VLAN_CFG, 0x000000),
  92. REG(ANA_PORT_DROP_CFG, 0x000004),
  93. REG(ANA_PORT_QOS_CFG, 0x000008),
  94. REG(ANA_PORT_VCAP_CFG, 0x00000c),
  95. REG(ANA_PORT_VCAP_S1_KEY_CFG, 0x000010),
  96. REG(ANA_PORT_VCAP_S2_CFG, 0x00001c),
  97. REG(ANA_PORT_PCP_DEI_MAP, 0x000020),
  98. REG(ANA_PORT_CPU_FWD_CFG, 0x000060),
  99. REG(ANA_PORT_CPU_FWD_BPDU_CFG, 0x000064),
  100. REG(ANA_PORT_CPU_FWD_GARP_CFG, 0x000068),
  101. REG(ANA_PORT_CPU_FWD_CCM_CFG, 0x00006c),
  102. REG(ANA_PORT_PORT_CFG, 0x000070),
  103. REG(ANA_PORT_POL_CFG, 0x000074),
  104. REG_RESERVED(ANA_PORT_PTP_CFG),
  105. REG_RESERVED(ANA_PORT_PTP_DLY1_CFG),
  106. REG_RESERVED(ANA_PORT_PTP_DLY2_CFG),
  107. REG_RESERVED(ANA_PORT_SFID_CFG),
  108. REG(ANA_PFC_PFC_CFG, 0x00c000),
  109. REG_RESERVED(ANA_PFC_PFC_TIMER),
  110. REG_RESERVED(ANA_IPT_OAM_MEP_CFG),
  111. REG_RESERVED(ANA_IPT_IPT),
  112. REG_RESERVED(ANA_PPT_PPT),
  113. REG_RESERVED(ANA_FID_MAP_FID_MAP),
  114. REG(ANA_AGGR_CFG, 0x00c600),
  115. REG(ANA_CPUQ_CFG, 0x00c604),
  116. REG_RESERVED(ANA_CPUQ_CFG2),
  117. REG(ANA_CPUQ_8021_CFG, 0x00c60c),
  118. REG(ANA_DSCP_CFG, 0x00c64c),
  119. REG(ANA_DSCP_REWR_CFG, 0x00c74c),
  120. REG(ANA_VCAP_RNG_TYPE_CFG, 0x00c78c),
  121. REG(ANA_VCAP_RNG_VAL_CFG, 0x00c7ac),
  122. REG_RESERVED(ANA_VRAP_CFG),
  123. REG_RESERVED(ANA_VRAP_HDR_DATA),
  124. REG_RESERVED(ANA_VRAP_HDR_MASK),
  125. REG(ANA_DISCARD_CFG, 0x00c7d8),
  126. REG(ANA_FID_CFG, 0x00c7dc),
  127. REG(ANA_POL_PIR_CFG, 0x00a000),
  128. REG(ANA_POL_CIR_CFG, 0x00a004),
  129. REG(ANA_POL_MODE_CFG, 0x00a008),
  130. REG(ANA_POL_PIR_STATE, 0x00a00c),
  131. REG(ANA_POL_CIR_STATE, 0x00a010),
  132. REG_RESERVED(ANA_POL_STATE),
  133. REG(ANA_POL_FLOWC, 0x00c280),
  134. REG(ANA_POL_HYST, 0x00c2ec),
  135. REG_RESERVED(ANA_POL_MISC_CFG),
  136. };
  137. static const u32 vsc9953_qs_regmap[] = {
  138. REG(QS_XTR_GRP_CFG, 0x000000),
  139. REG(QS_XTR_RD, 0x000008),
  140. REG(QS_XTR_FRM_PRUNING, 0x000010),
  141. REG(QS_XTR_FLUSH, 0x000018),
  142. REG(QS_XTR_DATA_PRESENT, 0x00001c),
  143. REG(QS_XTR_CFG, 0x000020),
  144. REG(QS_INJ_GRP_CFG, 0x000024),
  145. REG(QS_INJ_WR, 0x00002c),
  146. REG(QS_INJ_CTRL, 0x000034),
  147. REG(QS_INJ_STATUS, 0x00003c),
  148. REG(QS_INJ_ERR, 0x000040),
  149. REG_RESERVED(QS_INH_DBG),
  150. };
  151. static const u32 vsc9953_vcap_regmap[] = {
  152. /* VCAP_CORE_CFG */
  153. REG(VCAP_CORE_UPDATE_CTRL, 0x000000),
  154. REG(VCAP_CORE_MV_CFG, 0x000004),
  155. /* VCAP_CORE_CACHE */
  156. REG(VCAP_CACHE_ENTRY_DAT, 0x000008),
  157. REG(VCAP_CACHE_MASK_DAT, 0x000108),
  158. REG(VCAP_CACHE_ACTION_DAT, 0x000208),
  159. REG(VCAP_CACHE_CNT_DAT, 0x000308),
  160. REG(VCAP_CACHE_TG_DAT, 0x000388),
  161. /* VCAP_CONST */
  162. REG(VCAP_CONST_VCAP_VER, 0x000398),
  163. REG(VCAP_CONST_ENTRY_WIDTH, 0x00039c),
  164. REG(VCAP_CONST_ENTRY_CNT, 0x0003a0),
  165. REG(VCAP_CONST_ENTRY_SWCNT, 0x0003a4),
  166. REG(VCAP_CONST_ENTRY_TG_WIDTH, 0x0003a8),
  167. REG(VCAP_CONST_ACTION_DEF_CNT, 0x0003ac),
  168. REG(VCAP_CONST_ACTION_WIDTH, 0x0003b0),
  169. REG(VCAP_CONST_CNT_WIDTH, 0x0003b4),
  170. REG_RESERVED(VCAP_CONST_CORE_CNT),
  171. REG_RESERVED(VCAP_CONST_IF_CNT),
  172. };
  173. static const u32 vsc9953_qsys_regmap[] = {
  174. REG(QSYS_PORT_MODE, 0x003600),
  175. REG(QSYS_SWITCH_PORT_MODE, 0x003630),
  176. REG(QSYS_STAT_CNT_CFG, 0x00365c),
  177. REG(QSYS_EEE_CFG, 0x003660),
  178. REG(QSYS_EEE_THRES, 0x003688),
  179. REG(QSYS_IGR_NO_SHARING, 0x00368c),
  180. REG(QSYS_EGR_NO_SHARING, 0x003690),
  181. REG(QSYS_SW_STATUS, 0x003694),
  182. REG(QSYS_EXT_CPU_CFG, 0x0036c0),
  183. REG_RESERVED(QSYS_PAD_CFG),
  184. REG(QSYS_CPU_GROUP_MAP, 0x0036c8),
  185. REG_RESERVED(QSYS_QMAP),
  186. REG_RESERVED(QSYS_ISDX_SGRP),
  187. REG_RESERVED(QSYS_TIMED_FRAME_ENTRY),
  188. REG_RESERVED(QSYS_TFRM_MISC),
  189. REG_RESERVED(QSYS_TFRM_PORT_DLY),
  190. REG_RESERVED(QSYS_TFRM_TIMER_CFG_1),
  191. REG_RESERVED(QSYS_TFRM_TIMER_CFG_2),
  192. REG_RESERVED(QSYS_TFRM_TIMER_CFG_3),
  193. REG_RESERVED(QSYS_TFRM_TIMER_CFG_4),
  194. REG_RESERVED(QSYS_TFRM_TIMER_CFG_5),
  195. REG_RESERVED(QSYS_TFRM_TIMER_CFG_6),
  196. REG_RESERVED(QSYS_TFRM_TIMER_CFG_7),
  197. REG_RESERVED(QSYS_TFRM_TIMER_CFG_8),
  198. REG(QSYS_RED_PROFILE, 0x003724),
  199. REG(QSYS_RES_QOS_MODE, 0x003764),
  200. REG(QSYS_RES_CFG, 0x004000),
  201. REG(QSYS_RES_STAT, 0x004004),
  202. REG(QSYS_EGR_DROP_MODE, 0x003768),
  203. REG(QSYS_EQ_CTRL, 0x00376c),
  204. REG_RESERVED(QSYS_EVENTS_CORE),
  205. REG_RESERVED(QSYS_QMAXSDU_CFG_0),
  206. REG_RESERVED(QSYS_QMAXSDU_CFG_1),
  207. REG_RESERVED(QSYS_QMAXSDU_CFG_2),
  208. REG_RESERVED(QSYS_QMAXSDU_CFG_3),
  209. REG_RESERVED(QSYS_QMAXSDU_CFG_4),
  210. REG_RESERVED(QSYS_QMAXSDU_CFG_5),
  211. REG_RESERVED(QSYS_QMAXSDU_CFG_6),
  212. REG_RESERVED(QSYS_QMAXSDU_CFG_7),
  213. REG_RESERVED(QSYS_PREEMPTION_CFG),
  214. REG(QSYS_CIR_CFG, 0x000000),
  215. REG_RESERVED(QSYS_EIR_CFG),
  216. REG(QSYS_SE_CFG, 0x000008),
  217. REG(QSYS_SE_DWRR_CFG, 0x00000c),
  218. REG_RESERVED(QSYS_SE_CONNECT),
  219. REG_RESERVED(QSYS_SE_DLB_SENSE),
  220. REG(QSYS_CIR_STATE, 0x000044),
  221. REG_RESERVED(QSYS_EIR_STATE),
  222. REG_RESERVED(QSYS_SE_STATE),
  223. REG(QSYS_HSCH_MISC_CFG, 0x003774),
  224. REG_RESERVED(QSYS_TAG_CONFIG),
  225. REG_RESERVED(QSYS_TAS_PARAM_CFG_CTRL),
  226. REG_RESERVED(QSYS_PORT_MAX_SDU),
  227. REG_RESERVED(QSYS_PARAM_CFG_REG_1),
  228. REG_RESERVED(QSYS_PARAM_CFG_REG_2),
  229. REG_RESERVED(QSYS_PARAM_CFG_REG_3),
  230. REG_RESERVED(QSYS_PARAM_CFG_REG_4),
  231. REG_RESERVED(QSYS_PARAM_CFG_REG_5),
  232. REG_RESERVED(QSYS_GCL_CFG_REG_1),
  233. REG_RESERVED(QSYS_GCL_CFG_REG_2),
  234. REG_RESERVED(QSYS_PARAM_STATUS_REG_1),
  235. REG_RESERVED(QSYS_PARAM_STATUS_REG_2),
  236. REG_RESERVED(QSYS_PARAM_STATUS_REG_3),
  237. REG_RESERVED(QSYS_PARAM_STATUS_REG_4),
  238. REG_RESERVED(QSYS_PARAM_STATUS_REG_5),
  239. REG_RESERVED(QSYS_PARAM_STATUS_REG_6),
  240. REG_RESERVED(QSYS_PARAM_STATUS_REG_7),
  241. REG_RESERVED(QSYS_PARAM_STATUS_REG_8),
  242. REG_RESERVED(QSYS_PARAM_STATUS_REG_9),
  243. REG_RESERVED(QSYS_GCL_STATUS_REG_1),
  244. REG_RESERVED(QSYS_GCL_STATUS_REG_2),
  245. };
  246. static const u32 vsc9953_rew_regmap[] = {
  247. REG(REW_PORT_VLAN_CFG, 0x000000),
  248. REG(REW_TAG_CFG, 0x000004),
  249. REG(REW_PORT_CFG, 0x000008),
  250. REG(REW_DSCP_CFG, 0x00000c),
  251. REG(REW_PCP_DEI_QOS_MAP_CFG, 0x000010),
  252. REG_RESERVED(REW_PTP_CFG),
  253. REG_RESERVED(REW_PTP_DLY1_CFG),
  254. REG_RESERVED(REW_RED_TAG_CFG),
  255. REG(REW_DSCP_REMAP_DP1_CFG, 0x000610),
  256. REG(REW_DSCP_REMAP_CFG, 0x000710),
  257. REG_RESERVED(REW_STAT_CFG),
  258. REG_RESERVED(REW_REW_STICKY),
  259. REG_RESERVED(REW_PPT),
  260. };
  261. static const u32 vsc9953_sys_regmap[] = {
  262. REG(SYS_COUNT_RX_OCTETS, 0x000000),
  263. REG(SYS_COUNT_RX_UNICAST, 0x000004),
  264. REG(SYS_COUNT_RX_MULTICAST, 0x000008),
  265. REG(SYS_COUNT_RX_BROADCAST, 0x00000c),
  266. REG(SYS_COUNT_RX_SHORTS, 0x000010),
  267. REG(SYS_COUNT_RX_FRAGMENTS, 0x000014),
  268. REG(SYS_COUNT_RX_JABBERS, 0x000018),
  269. REG(SYS_COUNT_RX_CRC_ALIGN_ERRS, 0x00001c),
  270. REG(SYS_COUNT_RX_SYM_ERRS, 0x000020),
  271. REG(SYS_COUNT_RX_64, 0x000024),
  272. REG(SYS_COUNT_RX_65_127, 0x000028),
  273. REG(SYS_COUNT_RX_128_255, 0x00002c),
  274. REG(SYS_COUNT_RX_256_511, 0x000030),
  275. REG(SYS_COUNT_RX_512_1023, 0x000034),
  276. REG(SYS_COUNT_RX_1024_1526, 0x000038),
  277. REG(SYS_COUNT_RX_1527_MAX, 0x00003c),
  278. REG(SYS_COUNT_RX_PAUSE, 0x000040),
  279. REG(SYS_COUNT_RX_CONTROL, 0x000044),
  280. REG(SYS_COUNT_RX_LONGS, 0x000048),
  281. REG(SYS_COUNT_RX_CLASSIFIED_DROPS, 0x00004c),
  282. REG(SYS_COUNT_RX_RED_PRIO_0, 0x000050),
  283. REG(SYS_COUNT_RX_RED_PRIO_1, 0x000054),
  284. REG(SYS_COUNT_RX_RED_PRIO_2, 0x000058),
  285. REG(SYS_COUNT_RX_RED_PRIO_3, 0x00005c),
  286. REG(SYS_COUNT_RX_RED_PRIO_4, 0x000060),
  287. REG(SYS_COUNT_RX_RED_PRIO_5, 0x000064),
  288. REG(SYS_COUNT_RX_RED_PRIO_6, 0x000068),
  289. REG(SYS_COUNT_RX_RED_PRIO_7, 0x00006c),
  290. REG(SYS_COUNT_RX_YELLOW_PRIO_0, 0x000070),
  291. REG(SYS_COUNT_RX_YELLOW_PRIO_1, 0x000074),
  292. REG(SYS_COUNT_RX_YELLOW_PRIO_2, 0x000078),
  293. REG(SYS_COUNT_RX_YELLOW_PRIO_3, 0x00007c),
  294. REG(SYS_COUNT_RX_YELLOW_PRIO_4, 0x000080),
  295. REG(SYS_COUNT_RX_YELLOW_PRIO_5, 0x000084),
  296. REG(SYS_COUNT_RX_YELLOW_PRIO_6, 0x000088),
  297. REG(SYS_COUNT_RX_YELLOW_PRIO_7, 0x00008c),
  298. REG(SYS_COUNT_RX_GREEN_PRIO_0, 0x000090),
  299. REG(SYS_COUNT_RX_GREEN_PRIO_1, 0x000094),
  300. REG(SYS_COUNT_RX_GREEN_PRIO_2, 0x000098),
  301. REG(SYS_COUNT_RX_GREEN_PRIO_3, 0x00009c),
  302. REG(SYS_COUNT_RX_GREEN_PRIO_4, 0x0000a0),
  303. REG(SYS_COUNT_RX_GREEN_PRIO_5, 0x0000a4),
  304. REG(SYS_COUNT_RX_GREEN_PRIO_6, 0x0000a8),
  305. REG(SYS_COUNT_RX_GREEN_PRIO_7, 0x0000ac),
  306. REG(SYS_COUNT_TX_OCTETS, 0x000100),
  307. REG(SYS_COUNT_TX_UNICAST, 0x000104),
  308. REG(SYS_COUNT_TX_MULTICAST, 0x000108),
  309. REG(SYS_COUNT_TX_BROADCAST, 0x00010c),
  310. REG(SYS_COUNT_TX_COLLISION, 0x000110),
  311. REG(SYS_COUNT_TX_DROPS, 0x000114),
  312. REG(SYS_COUNT_TX_PAUSE, 0x000118),
  313. REG(SYS_COUNT_TX_64, 0x00011c),
  314. REG(SYS_COUNT_TX_65_127, 0x000120),
  315. REG(SYS_COUNT_TX_128_255, 0x000124),
  316. REG(SYS_COUNT_TX_256_511, 0x000128),
  317. REG(SYS_COUNT_TX_512_1023, 0x00012c),
  318. REG(SYS_COUNT_TX_1024_1526, 0x000130),
  319. REG(SYS_COUNT_TX_1527_MAX, 0x000134),
  320. REG(SYS_COUNT_TX_YELLOW_PRIO_0, 0x000138),
  321. REG(SYS_COUNT_TX_YELLOW_PRIO_1, 0x00013c),
  322. REG(SYS_COUNT_TX_YELLOW_PRIO_2, 0x000140),
  323. REG(SYS_COUNT_TX_YELLOW_PRIO_3, 0x000144),
  324. REG(SYS_COUNT_TX_YELLOW_PRIO_4, 0x000148),
  325. REG(SYS_COUNT_TX_YELLOW_PRIO_5, 0x00014c),
  326. REG(SYS_COUNT_TX_YELLOW_PRIO_6, 0x000150),
  327. REG(SYS_COUNT_TX_YELLOW_PRIO_7, 0x000154),
  328. REG(SYS_COUNT_TX_GREEN_PRIO_0, 0x000158),
  329. REG(SYS_COUNT_TX_GREEN_PRIO_1, 0x00015c),
  330. REG(SYS_COUNT_TX_GREEN_PRIO_2, 0x000160),
  331. REG(SYS_COUNT_TX_GREEN_PRIO_3, 0x000164),
  332. REG(SYS_COUNT_TX_GREEN_PRIO_4, 0x000168),
  333. REG(SYS_COUNT_TX_GREEN_PRIO_5, 0x00016c),
  334. REG(SYS_COUNT_TX_GREEN_PRIO_6, 0x000170),
  335. REG(SYS_COUNT_TX_GREEN_PRIO_7, 0x000174),
  336. REG(SYS_COUNT_TX_AGED, 0x000178),
  337. REG(SYS_COUNT_DROP_LOCAL, 0x000200),
  338. REG(SYS_COUNT_DROP_TAIL, 0x000204),
  339. REG(SYS_COUNT_DROP_YELLOW_PRIO_0, 0x000208),
  340. REG(SYS_COUNT_DROP_YELLOW_PRIO_1, 0x00020c),
  341. REG(SYS_COUNT_DROP_YELLOW_PRIO_2, 0x000210),
  342. REG(SYS_COUNT_DROP_YELLOW_PRIO_3, 0x000214),
  343. REG(SYS_COUNT_DROP_YELLOW_PRIO_4, 0x000218),
  344. REG(SYS_COUNT_DROP_YELLOW_PRIO_5, 0x00021c),
  345. REG(SYS_COUNT_DROP_YELLOW_PRIO_6, 0x000220),
  346. REG(SYS_COUNT_DROP_YELLOW_PRIO_7, 0x000224),
  347. REG(SYS_COUNT_DROP_GREEN_PRIO_0, 0x000228),
  348. REG(SYS_COUNT_DROP_GREEN_PRIO_1, 0x00022c),
  349. REG(SYS_COUNT_DROP_GREEN_PRIO_2, 0x000230),
  350. REG(SYS_COUNT_DROP_GREEN_PRIO_3, 0x000234),
  351. REG(SYS_COUNT_DROP_GREEN_PRIO_4, 0x000238),
  352. REG(SYS_COUNT_DROP_GREEN_PRIO_5, 0x00023c),
  353. REG(SYS_COUNT_DROP_GREEN_PRIO_6, 0x000240),
  354. REG(SYS_COUNT_DROP_GREEN_PRIO_7, 0x000244),
  355. REG(SYS_RESET_CFG, 0x000318),
  356. REG_RESERVED(SYS_SR_ETYPE_CFG),
  357. REG(SYS_VLAN_ETYPE_CFG, 0x000320),
  358. REG(SYS_PORT_MODE, 0x000324),
  359. REG(SYS_FRONT_PORT_MODE, 0x000354),
  360. REG(SYS_FRM_AGING, 0x00037c),
  361. REG(SYS_STAT_CFG, 0x000380),
  362. REG_RESERVED(SYS_SW_STATUS),
  363. REG_RESERVED(SYS_MISC_CFG),
  364. REG_RESERVED(SYS_REW_MAC_HIGH_CFG),
  365. REG_RESERVED(SYS_REW_MAC_LOW_CFG),
  366. REG_RESERVED(SYS_TIMESTAMP_OFFSET),
  367. REG(SYS_PAUSE_CFG, 0x00044c),
  368. REG(SYS_PAUSE_TOT_CFG, 0x000478),
  369. REG(SYS_ATOP, 0x00047c),
  370. REG(SYS_ATOP_TOT_CFG, 0x0004a8),
  371. REG(SYS_MAC_FC_CFG, 0x0004ac),
  372. REG(SYS_MMGT, 0x0004d4),
  373. REG_RESERVED(SYS_MMGT_FAST),
  374. REG_RESERVED(SYS_EVENTS_DIF),
  375. REG_RESERVED(SYS_EVENTS_CORE),
  376. REG_RESERVED(SYS_PTP_STATUS),
  377. REG_RESERVED(SYS_PTP_TXSTAMP),
  378. REG_RESERVED(SYS_PTP_NXT),
  379. REG_RESERVED(SYS_PTP_CFG),
  380. REG_RESERVED(SYS_RAM_INIT),
  381. REG_RESERVED(SYS_CM_ADDR),
  382. REG_RESERVED(SYS_CM_DATA_WR),
  383. REG_RESERVED(SYS_CM_DATA_RD),
  384. REG_RESERVED(SYS_CM_OP),
  385. REG_RESERVED(SYS_CM_DATA),
  386. };
  387. static const u32 vsc9953_gcb_regmap[] = {
  388. REG(GCB_SOFT_RST, 0x000008),
  389. REG(GCB_MIIM_MII_STATUS, 0x0000ac),
  390. REG(GCB_MIIM_MII_CMD, 0x0000b4),
  391. REG(GCB_MIIM_MII_DATA, 0x0000b8),
  392. };
  393. static const u32 vsc9953_dev_gmii_regmap[] = {
  394. REG(DEV_CLOCK_CFG, 0x0),
  395. REG(DEV_PORT_MISC, 0x4),
  396. REG_RESERVED(DEV_EVENTS),
  397. REG(DEV_EEE_CFG, 0xc),
  398. REG_RESERVED(DEV_RX_PATH_DELAY),
  399. REG_RESERVED(DEV_TX_PATH_DELAY),
  400. REG_RESERVED(DEV_PTP_PREDICT_CFG),
  401. REG(DEV_MAC_ENA_CFG, 0x10),
  402. REG(DEV_MAC_MODE_CFG, 0x14),
  403. REG(DEV_MAC_MAXLEN_CFG, 0x18),
  404. REG(DEV_MAC_TAGS_CFG, 0x1c),
  405. REG(DEV_MAC_ADV_CHK_CFG, 0x20),
  406. REG(DEV_MAC_IFG_CFG, 0x24),
  407. REG(DEV_MAC_HDX_CFG, 0x28),
  408. REG_RESERVED(DEV_MAC_DBG_CFG),
  409. REG(DEV_MAC_FC_MAC_LOW_CFG, 0x30),
  410. REG(DEV_MAC_FC_MAC_HIGH_CFG, 0x34),
  411. REG(DEV_MAC_STICKY, 0x38),
  412. REG_RESERVED(PCS1G_CFG),
  413. REG_RESERVED(PCS1G_MODE_CFG),
  414. REG_RESERVED(PCS1G_SD_CFG),
  415. REG_RESERVED(PCS1G_ANEG_CFG),
  416. REG_RESERVED(PCS1G_ANEG_NP_CFG),
  417. REG_RESERVED(PCS1G_LB_CFG),
  418. REG_RESERVED(PCS1G_DBG_CFG),
  419. REG_RESERVED(PCS1G_CDET_CFG),
  420. REG_RESERVED(PCS1G_ANEG_STATUS),
  421. REG_RESERVED(PCS1G_ANEG_NP_STATUS),
  422. REG_RESERVED(PCS1G_LINK_STATUS),
  423. REG_RESERVED(PCS1G_LINK_DOWN_CNT),
  424. REG_RESERVED(PCS1G_STICKY),
  425. REG_RESERVED(PCS1G_DEBUG_STATUS),
  426. REG_RESERVED(PCS1G_LPI_CFG),
  427. REG_RESERVED(PCS1G_LPI_WAKE_ERROR_CNT),
  428. REG_RESERVED(PCS1G_LPI_STATUS),
  429. REG_RESERVED(PCS1G_TSTPAT_MODE_CFG),
  430. REG_RESERVED(PCS1G_TSTPAT_STATUS),
  431. REG_RESERVED(DEV_PCS_FX100_CFG),
  432. REG_RESERVED(DEV_PCS_FX100_STATUS),
  433. };
  434. static const u32 *vsc9953_regmap[TARGET_MAX] = {
  435. [ANA] = vsc9953_ana_regmap,
  436. [QS] = vsc9953_qs_regmap,
  437. [QSYS] = vsc9953_qsys_regmap,
  438. [REW] = vsc9953_rew_regmap,
  439. [SYS] = vsc9953_sys_regmap,
  440. [S0] = vsc9953_vcap_regmap,
  441. [S1] = vsc9953_vcap_regmap,
  442. [S2] = vsc9953_vcap_regmap,
  443. [GCB] = vsc9953_gcb_regmap,
  444. [DEV_GMII] = vsc9953_dev_gmii_regmap,
  445. };
  446. /* Addresses are relative to the device's base address */
  447. static const struct resource vsc9953_resources[] = {
  448. DEFINE_RES_MEM_NAMED(0x0010000, 0x0010000, "sys"),
  449. DEFINE_RES_MEM_NAMED(0x0030000, 0x0010000, "rew"),
  450. DEFINE_RES_MEM_NAMED(0x0040000, 0x0000400, "s0"),
  451. DEFINE_RES_MEM_NAMED(0x0050000, 0x0000400, "s1"),
  452. DEFINE_RES_MEM_NAMED(0x0060000, 0x0000400, "s2"),
  453. DEFINE_RES_MEM_NAMED(0x0070000, 0x0000200, "devcpu_gcb"),
  454. DEFINE_RES_MEM_NAMED(0x0080000, 0x0000100, "qs"),
  455. DEFINE_RES_MEM_NAMED(0x0090000, 0x00000cc, "ptp"),
  456. DEFINE_RES_MEM_NAMED(0x0100000, 0x0010000, "port0"),
  457. DEFINE_RES_MEM_NAMED(0x0110000, 0x0010000, "port1"),
  458. DEFINE_RES_MEM_NAMED(0x0120000, 0x0010000, "port2"),
  459. DEFINE_RES_MEM_NAMED(0x0130000, 0x0010000, "port3"),
  460. DEFINE_RES_MEM_NAMED(0x0140000, 0x0010000, "port4"),
  461. DEFINE_RES_MEM_NAMED(0x0150000, 0x0010000, "port5"),
  462. DEFINE_RES_MEM_NAMED(0x0160000, 0x0010000, "port6"),
  463. DEFINE_RES_MEM_NAMED(0x0170000, 0x0010000, "port7"),
  464. DEFINE_RES_MEM_NAMED(0x0180000, 0x0010000, "port8"),
  465. DEFINE_RES_MEM_NAMED(0x0190000, 0x0010000, "port9"),
  466. DEFINE_RES_MEM_NAMED(0x0200000, 0x0020000, "qsys"),
  467. DEFINE_RES_MEM_NAMED(0x0280000, 0x0010000, "ana"),
  468. };
  469. static const char * const vsc9953_resource_names[TARGET_MAX] = {
  470. [SYS] = "sys",
  471. [REW] = "rew",
  472. [S0] = "s0",
  473. [S1] = "s1",
  474. [S2] = "s2",
  475. [GCB] = "devcpu_gcb",
  476. [QS] = "qs",
  477. [PTP] = "ptp",
  478. [QSYS] = "qsys",
  479. [ANA] = "ana",
  480. };
  481. static const struct reg_field vsc9953_regfields[REGFIELD_MAX] = {
  482. [ANA_ADVLEARN_VLAN_CHK] = REG_FIELD(ANA_ADVLEARN, 10, 10),
  483. [ANA_ADVLEARN_LEARN_MIRROR] = REG_FIELD(ANA_ADVLEARN, 0, 9),
  484. [ANA_ANEVENTS_AUTOAGE] = REG_FIELD(ANA_ANEVENTS, 24, 24),
  485. [ANA_ANEVENTS_STORM_DROP] = REG_FIELD(ANA_ANEVENTS, 22, 22),
  486. [ANA_ANEVENTS_LEARN_DROP] = REG_FIELD(ANA_ANEVENTS, 21, 21),
  487. [ANA_ANEVENTS_AGED_ENTRY] = REG_FIELD(ANA_ANEVENTS, 20, 20),
  488. [ANA_ANEVENTS_CPU_LEARN_FAILED] = REG_FIELD(ANA_ANEVENTS, 19, 19),
  489. [ANA_ANEVENTS_AUTO_LEARN_FAILED] = REG_FIELD(ANA_ANEVENTS, 18, 18),
  490. [ANA_ANEVENTS_LEARN_REMOVE] = REG_FIELD(ANA_ANEVENTS, 17, 17),
  491. [ANA_ANEVENTS_AUTO_LEARNED] = REG_FIELD(ANA_ANEVENTS, 16, 16),
  492. [ANA_ANEVENTS_AUTO_MOVED] = REG_FIELD(ANA_ANEVENTS, 15, 15),
  493. [ANA_ANEVENTS_CLASSIFIED_DROP] = REG_FIELD(ANA_ANEVENTS, 13, 13),
  494. [ANA_ANEVENTS_CLASSIFIED_COPY] = REG_FIELD(ANA_ANEVENTS, 12, 12),
  495. [ANA_ANEVENTS_VLAN_DISCARD] = REG_FIELD(ANA_ANEVENTS, 11, 11),
  496. [ANA_ANEVENTS_FWD_DISCARD] = REG_FIELD(ANA_ANEVENTS, 10, 10),
  497. [ANA_ANEVENTS_MULTICAST_FLOOD] = REG_FIELD(ANA_ANEVENTS, 9, 9),
  498. [ANA_ANEVENTS_UNICAST_FLOOD] = REG_FIELD(ANA_ANEVENTS, 8, 8),
  499. [ANA_ANEVENTS_DEST_KNOWN] = REG_FIELD(ANA_ANEVENTS, 7, 7),
  500. [ANA_ANEVENTS_BUCKET3_MATCH] = REG_FIELD(ANA_ANEVENTS, 6, 6),
  501. [ANA_ANEVENTS_BUCKET2_MATCH] = REG_FIELD(ANA_ANEVENTS, 5, 5),
  502. [ANA_ANEVENTS_BUCKET1_MATCH] = REG_FIELD(ANA_ANEVENTS, 4, 4),
  503. [ANA_ANEVENTS_BUCKET0_MATCH] = REG_FIELD(ANA_ANEVENTS, 3, 3),
  504. [ANA_ANEVENTS_CPU_OPERATION] = REG_FIELD(ANA_ANEVENTS, 2, 2),
  505. [ANA_ANEVENTS_DMAC_LOOKUP] = REG_FIELD(ANA_ANEVENTS, 1, 1),
  506. [ANA_ANEVENTS_SMAC_LOOKUP] = REG_FIELD(ANA_ANEVENTS, 0, 0),
  507. [ANA_TABLES_MACACCESS_B_DOM] = REG_FIELD(ANA_TABLES_MACACCESS, 16, 16),
  508. [ANA_TABLES_MACTINDX_BUCKET] = REG_FIELD(ANA_TABLES_MACTINDX, 11, 12),
  509. [ANA_TABLES_MACTINDX_M_INDEX] = REG_FIELD(ANA_TABLES_MACTINDX, 0, 10),
  510. [SYS_RESET_CFG_CORE_ENA] = REG_FIELD(SYS_RESET_CFG, 7, 7),
  511. [SYS_RESET_CFG_MEM_ENA] = REG_FIELD(SYS_RESET_CFG, 6, 6),
  512. [SYS_RESET_CFG_MEM_INIT] = REG_FIELD(SYS_RESET_CFG, 5, 5),
  513. [GCB_SOFT_RST_SWC_RST] = REG_FIELD(GCB_SOFT_RST, 0, 0),
  514. [GCB_MIIM_MII_STATUS_PENDING] = REG_FIELD(GCB_MIIM_MII_STATUS, 2, 2),
  515. [GCB_MIIM_MII_STATUS_BUSY] = REG_FIELD(GCB_MIIM_MII_STATUS, 3, 3),
  516. /* Replicated per number of ports (11), register size 4 per port */
  517. [QSYS_SWITCH_PORT_MODE_PORT_ENA] = REG_FIELD_ID(QSYS_SWITCH_PORT_MODE, 13, 13, 11, 4),
  518. [QSYS_SWITCH_PORT_MODE_YEL_RSRVD] = REG_FIELD_ID(QSYS_SWITCH_PORT_MODE, 10, 10, 11, 4),
  519. [QSYS_SWITCH_PORT_MODE_INGRESS_DROP_MODE] = REG_FIELD_ID(QSYS_SWITCH_PORT_MODE, 9, 9, 11, 4),
  520. [QSYS_SWITCH_PORT_MODE_TX_PFC_ENA] = REG_FIELD_ID(QSYS_SWITCH_PORT_MODE, 1, 8, 11, 4),
  521. [QSYS_SWITCH_PORT_MODE_TX_PFC_MODE] = REG_FIELD_ID(QSYS_SWITCH_PORT_MODE, 0, 0, 11, 4),
  522. [SYS_PORT_MODE_INCL_INJ_HDR] = REG_FIELD_ID(SYS_PORT_MODE, 4, 5, 11, 4),
  523. [SYS_PORT_MODE_INCL_XTR_HDR] = REG_FIELD_ID(SYS_PORT_MODE, 2, 3, 11, 4),
  524. [SYS_PORT_MODE_INCL_HDR_ERR] = REG_FIELD_ID(SYS_PORT_MODE, 0, 0, 11, 4),
  525. [SYS_PAUSE_CFG_PAUSE_START] = REG_FIELD_ID(SYS_PAUSE_CFG, 11, 20, 11, 4),
  526. [SYS_PAUSE_CFG_PAUSE_STOP] = REG_FIELD_ID(SYS_PAUSE_CFG, 1, 10, 11, 4),
  527. [SYS_PAUSE_CFG_PAUSE_ENA] = REG_FIELD_ID(SYS_PAUSE_CFG, 0, 1, 11, 4),
  528. };
  529. static const struct ocelot_stat_layout vsc9953_stats_layout[OCELOT_NUM_STATS] = {
  530. OCELOT_COMMON_STATS,
  531. };
  532. static const struct vcap_field vsc9953_vcap_es0_keys[] = {
  533. [VCAP_ES0_EGR_PORT] = { 0, 4},
  534. [VCAP_ES0_IGR_PORT] = { 4, 4},
  535. [VCAP_ES0_RSV] = { 8, 2},
  536. [VCAP_ES0_L2_MC] = { 10, 1},
  537. [VCAP_ES0_L2_BC] = { 11, 1},
  538. [VCAP_ES0_VID] = { 12, 12},
  539. [VCAP_ES0_DP] = { 24, 1},
  540. [VCAP_ES0_PCP] = { 25, 3},
  541. };
  542. static const struct vcap_field vsc9953_vcap_es0_actions[] = {
  543. [VCAP_ES0_ACT_PUSH_OUTER_TAG] = { 0, 2},
  544. [VCAP_ES0_ACT_PUSH_INNER_TAG] = { 2, 1},
  545. [VCAP_ES0_ACT_TAG_A_TPID_SEL] = { 3, 2},
  546. [VCAP_ES0_ACT_TAG_A_VID_SEL] = { 5, 1},
  547. [VCAP_ES0_ACT_TAG_A_PCP_SEL] = { 6, 2},
  548. [VCAP_ES0_ACT_TAG_A_DEI_SEL] = { 8, 2},
  549. [VCAP_ES0_ACT_TAG_B_TPID_SEL] = { 10, 2},
  550. [VCAP_ES0_ACT_TAG_B_VID_SEL] = { 12, 1},
  551. [VCAP_ES0_ACT_TAG_B_PCP_SEL] = { 13, 2},
  552. [VCAP_ES0_ACT_TAG_B_DEI_SEL] = { 15, 2},
  553. [VCAP_ES0_ACT_VID_A_VAL] = { 17, 12},
  554. [VCAP_ES0_ACT_PCP_A_VAL] = { 29, 3},
  555. [VCAP_ES0_ACT_DEI_A_VAL] = { 32, 1},
  556. [VCAP_ES0_ACT_VID_B_VAL] = { 33, 12},
  557. [VCAP_ES0_ACT_PCP_B_VAL] = { 45, 3},
  558. [VCAP_ES0_ACT_DEI_B_VAL] = { 48, 1},
  559. [VCAP_ES0_ACT_RSV] = { 49, 24},
  560. [VCAP_ES0_ACT_HIT_STICKY] = { 73, 1},
  561. };
  562. static const struct vcap_field vsc9953_vcap_is1_keys[] = {
  563. [VCAP_IS1_HK_TYPE] = { 0, 1},
  564. [VCAP_IS1_HK_LOOKUP] = { 1, 2},
  565. [VCAP_IS1_HK_IGR_PORT_MASK] = { 3, 11},
  566. [VCAP_IS1_HK_RSV] = { 14, 10},
  567. /* VCAP_IS1_HK_OAM_Y1731 not supported */
  568. [VCAP_IS1_HK_L2_MC] = { 24, 1},
  569. [VCAP_IS1_HK_L2_BC] = { 25, 1},
  570. [VCAP_IS1_HK_IP_MC] = { 26, 1},
  571. [VCAP_IS1_HK_VLAN_TAGGED] = { 27, 1},
  572. [VCAP_IS1_HK_VLAN_DBL_TAGGED] = { 28, 1},
  573. [VCAP_IS1_HK_TPID] = { 29, 1},
  574. [VCAP_IS1_HK_VID] = { 30, 12},
  575. [VCAP_IS1_HK_DEI] = { 42, 1},
  576. [VCAP_IS1_HK_PCP] = { 43, 3},
  577. /* Specific Fields for IS1 Half Key S1_NORMAL */
  578. [VCAP_IS1_HK_L2_SMAC] = { 46, 48},
  579. [VCAP_IS1_HK_ETYPE_LEN] = { 94, 1},
  580. [VCAP_IS1_HK_ETYPE] = { 95, 16},
  581. [VCAP_IS1_HK_IP_SNAP] = {111, 1},
  582. [VCAP_IS1_HK_IP4] = {112, 1},
  583. /* Layer-3 Information */
  584. [VCAP_IS1_HK_L3_FRAGMENT] = {113, 1},
  585. [VCAP_IS1_HK_L3_FRAG_OFS_GT0] = {114, 1},
  586. [VCAP_IS1_HK_L3_OPTIONS] = {115, 1},
  587. [VCAP_IS1_HK_L3_DSCP] = {116, 6},
  588. [VCAP_IS1_HK_L3_IP4_SIP] = {122, 32},
  589. /* Layer-4 Information */
  590. [VCAP_IS1_HK_TCP_UDP] = {154, 1},
  591. [VCAP_IS1_HK_TCP] = {155, 1},
  592. [VCAP_IS1_HK_L4_SPORT] = {156, 16},
  593. [VCAP_IS1_HK_L4_RNG] = {172, 8},
  594. /* Specific Fields for IS1 Half Key S1_5TUPLE_IP4 */
  595. [VCAP_IS1_HK_IP4_INNER_TPID] = { 46, 1},
  596. [VCAP_IS1_HK_IP4_INNER_VID] = { 47, 12},
  597. [VCAP_IS1_HK_IP4_INNER_DEI] = { 59, 1},
  598. [VCAP_IS1_HK_IP4_INNER_PCP] = { 60, 3},
  599. [VCAP_IS1_HK_IP4_IP4] = { 63, 1},
  600. [VCAP_IS1_HK_IP4_L3_FRAGMENT] = { 64, 1},
  601. [VCAP_IS1_HK_IP4_L3_FRAG_OFS_GT0] = { 65, 1},
  602. [VCAP_IS1_HK_IP4_L3_OPTIONS] = { 66, 1},
  603. [VCAP_IS1_HK_IP4_L3_DSCP] = { 67, 6},
  604. [VCAP_IS1_HK_IP4_L3_IP4_DIP] = { 73, 32},
  605. [VCAP_IS1_HK_IP4_L3_IP4_SIP] = {105, 32},
  606. [VCAP_IS1_HK_IP4_L3_PROTO] = {137, 8},
  607. [VCAP_IS1_HK_IP4_TCP_UDP] = {145, 1},
  608. [VCAP_IS1_HK_IP4_TCP] = {146, 1},
  609. [VCAP_IS1_HK_IP4_L4_RNG] = {147, 8},
  610. [VCAP_IS1_HK_IP4_IP_PAYLOAD_S1_5TUPLE] = {155, 32},
  611. };
  612. static const struct vcap_field vsc9953_vcap_is1_actions[] = {
  613. [VCAP_IS1_ACT_DSCP_ENA] = { 0, 1},
  614. [VCAP_IS1_ACT_DSCP_VAL] = { 1, 6},
  615. [VCAP_IS1_ACT_QOS_ENA] = { 7, 1},
  616. [VCAP_IS1_ACT_QOS_VAL] = { 8, 3},
  617. [VCAP_IS1_ACT_DP_ENA] = { 11, 1},
  618. [VCAP_IS1_ACT_DP_VAL] = { 12, 1},
  619. [VCAP_IS1_ACT_PAG_OVERRIDE_MASK] = { 13, 8},
  620. [VCAP_IS1_ACT_PAG_VAL] = { 21, 8},
  621. [VCAP_IS1_ACT_RSV] = { 29, 11},
  622. [VCAP_IS1_ACT_VID_REPLACE_ENA] = { 40, 1},
  623. [VCAP_IS1_ACT_VID_ADD_VAL] = { 41, 12},
  624. [VCAP_IS1_ACT_FID_SEL] = { 53, 2},
  625. [VCAP_IS1_ACT_FID_VAL] = { 55, 13},
  626. [VCAP_IS1_ACT_PCP_DEI_ENA] = { 68, 1},
  627. [VCAP_IS1_ACT_PCP_VAL] = { 69, 3},
  628. [VCAP_IS1_ACT_DEI_VAL] = { 72, 1},
  629. [VCAP_IS1_ACT_VLAN_POP_CNT_ENA] = { 73, 1},
  630. [VCAP_IS1_ACT_VLAN_POP_CNT] = { 74, 2},
  631. [VCAP_IS1_ACT_CUSTOM_ACE_TYPE_ENA] = { 76, 4},
  632. [VCAP_IS1_ACT_HIT_STICKY] = { 80, 1},
  633. };
  634. static struct vcap_field vsc9953_vcap_is2_keys[] = {
  635. /* Common: 41 bits */
  636. [VCAP_IS2_TYPE] = { 0, 4},
  637. [VCAP_IS2_HK_FIRST] = { 4, 1},
  638. [VCAP_IS2_HK_PAG] = { 5, 8},
  639. [VCAP_IS2_HK_IGR_PORT_MASK] = { 13, 11},
  640. [VCAP_IS2_HK_RSV2] = { 24, 1},
  641. [VCAP_IS2_HK_HOST_MATCH] = { 25, 1},
  642. [VCAP_IS2_HK_L2_MC] = { 26, 1},
  643. [VCAP_IS2_HK_L2_BC] = { 27, 1},
  644. [VCAP_IS2_HK_VLAN_TAGGED] = { 28, 1},
  645. [VCAP_IS2_HK_VID] = { 29, 12},
  646. [VCAP_IS2_HK_DEI] = { 41, 1},
  647. [VCAP_IS2_HK_PCP] = { 42, 3},
  648. /* MAC_ETYPE / MAC_LLC / MAC_SNAP / OAM common */
  649. [VCAP_IS2_HK_L2_DMAC] = { 45, 48},
  650. [VCAP_IS2_HK_L2_SMAC] = { 93, 48},
  651. /* MAC_ETYPE (TYPE=000) */
  652. [VCAP_IS2_HK_MAC_ETYPE_ETYPE] = {141, 16},
  653. [VCAP_IS2_HK_MAC_ETYPE_L2_PAYLOAD0] = {157, 16},
  654. [VCAP_IS2_HK_MAC_ETYPE_L2_PAYLOAD1] = {173, 8},
  655. [VCAP_IS2_HK_MAC_ETYPE_L2_PAYLOAD2] = {181, 3},
  656. /* MAC_LLC (TYPE=001) */
  657. [VCAP_IS2_HK_MAC_LLC_L2_LLC] = {141, 40},
  658. /* MAC_SNAP (TYPE=010) */
  659. [VCAP_IS2_HK_MAC_SNAP_L2_SNAP] = {141, 40},
  660. /* MAC_ARP (TYPE=011) */
  661. [VCAP_IS2_HK_MAC_ARP_SMAC] = { 45, 48},
  662. [VCAP_IS2_HK_MAC_ARP_ADDR_SPACE_OK] = { 93, 1},
  663. [VCAP_IS2_HK_MAC_ARP_PROTO_SPACE_OK] = { 94, 1},
  664. [VCAP_IS2_HK_MAC_ARP_LEN_OK] = { 95, 1},
  665. [VCAP_IS2_HK_MAC_ARP_TARGET_MATCH] = { 96, 1},
  666. [VCAP_IS2_HK_MAC_ARP_SENDER_MATCH] = { 97, 1},
  667. [VCAP_IS2_HK_MAC_ARP_OPCODE_UNKNOWN] = { 98, 1},
  668. [VCAP_IS2_HK_MAC_ARP_OPCODE] = { 99, 2},
  669. [VCAP_IS2_HK_MAC_ARP_L3_IP4_DIP] = {101, 32},
  670. [VCAP_IS2_HK_MAC_ARP_L3_IP4_SIP] = {133, 32},
  671. [VCAP_IS2_HK_MAC_ARP_DIP_EQ_SIP] = {165, 1},
  672. /* IP4_TCP_UDP / IP4_OTHER common */
  673. [VCAP_IS2_HK_IP4] = { 45, 1},
  674. [VCAP_IS2_HK_L3_FRAGMENT] = { 46, 1},
  675. [VCAP_IS2_HK_L3_FRAG_OFS_GT0] = { 47, 1},
  676. [VCAP_IS2_HK_L3_OPTIONS] = { 48, 1},
  677. [VCAP_IS2_HK_IP4_L3_TTL_GT0] = { 49, 1},
  678. [VCAP_IS2_HK_L3_TOS] = { 50, 8},
  679. [VCAP_IS2_HK_L3_IP4_DIP] = { 58, 32},
  680. [VCAP_IS2_HK_L3_IP4_SIP] = { 90, 32},
  681. [VCAP_IS2_HK_DIP_EQ_SIP] = {122, 1},
  682. /* IP4_TCP_UDP (TYPE=100) */
  683. [VCAP_IS2_HK_TCP] = {123, 1},
  684. [VCAP_IS2_HK_L4_DPORT] = {124, 16},
  685. [VCAP_IS2_HK_L4_SPORT] = {140, 16},
  686. [VCAP_IS2_HK_L4_RNG] = {156, 8},
  687. [VCAP_IS2_HK_L4_SPORT_EQ_DPORT] = {164, 1},
  688. [VCAP_IS2_HK_L4_SEQUENCE_EQ0] = {165, 1},
  689. [VCAP_IS2_HK_L4_FIN] = {166, 1},
  690. [VCAP_IS2_HK_L4_SYN] = {167, 1},
  691. [VCAP_IS2_HK_L4_RST] = {168, 1},
  692. [VCAP_IS2_HK_L4_PSH] = {169, 1},
  693. [VCAP_IS2_HK_L4_ACK] = {170, 1},
  694. [VCAP_IS2_HK_L4_URG] = {171, 1},
  695. /* IP4_OTHER (TYPE=101) */
  696. [VCAP_IS2_HK_IP4_L3_PROTO] = {123, 8},
  697. [VCAP_IS2_HK_L3_PAYLOAD] = {131, 56},
  698. /* IP6_STD (TYPE=110) */
  699. [VCAP_IS2_HK_IP6_L3_TTL_GT0] = { 45, 1},
  700. [VCAP_IS2_HK_L3_IP6_SIP] = { 46, 128},
  701. [VCAP_IS2_HK_IP6_L3_PROTO] = {174, 8},
  702. };
  703. static struct vcap_field vsc9953_vcap_is2_actions[] = {
  704. [VCAP_IS2_ACT_HIT_ME_ONCE] = { 0, 1},
  705. [VCAP_IS2_ACT_CPU_COPY_ENA] = { 1, 1},
  706. [VCAP_IS2_ACT_CPU_QU_NUM] = { 2, 3},
  707. [VCAP_IS2_ACT_MASK_MODE] = { 5, 2},
  708. [VCAP_IS2_ACT_MIRROR_ENA] = { 7, 1},
  709. [VCAP_IS2_ACT_LRN_DIS] = { 8, 1},
  710. [VCAP_IS2_ACT_POLICE_ENA] = { 9, 1},
  711. [VCAP_IS2_ACT_POLICE_IDX] = { 10, 8},
  712. [VCAP_IS2_ACT_POLICE_VCAP_ONLY] = { 21, 1},
  713. [VCAP_IS2_ACT_PORT_MASK] = { 22, 10},
  714. [VCAP_IS2_ACT_ACL_ID] = { 44, 6},
  715. [VCAP_IS2_ACT_HIT_CNT] = { 50, 32},
  716. };
  717. static struct vcap_props vsc9953_vcap_props[] = {
  718. [VCAP_ES0] = {
  719. .action_type_width = 0,
  720. .action_table = {
  721. [ES0_ACTION_TYPE_NORMAL] = {
  722. .width = 73, /* HIT_STICKY not included */
  723. .count = 1,
  724. },
  725. },
  726. .target = S0,
  727. .keys = vsc9953_vcap_es0_keys,
  728. .actions = vsc9953_vcap_es0_actions,
  729. },
  730. [VCAP_IS1] = {
  731. .action_type_width = 0,
  732. .action_table = {
  733. [IS1_ACTION_TYPE_NORMAL] = {
  734. .width = 80, /* HIT_STICKY not included */
  735. .count = 4,
  736. },
  737. },
  738. .target = S1,
  739. .keys = vsc9953_vcap_is1_keys,
  740. .actions = vsc9953_vcap_is1_actions,
  741. },
  742. [VCAP_IS2] = {
  743. .action_type_width = 1,
  744. .action_table = {
  745. [IS2_ACTION_TYPE_NORMAL] = {
  746. .width = 50, /* HIT_CNT not included */
  747. .count = 2
  748. },
  749. [IS2_ACTION_TYPE_SMAC_SIP] = {
  750. .width = 6,
  751. .count = 4
  752. },
  753. },
  754. .target = S2,
  755. .keys = vsc9953_vcap_is2_keys,
  756. .actions = vsc9953_vcap_is2_actions,
  757. },
  758. };
  759. #define VSC9953_INIT_TIMEOUT 50000
  760. #define VSC9953_GCB_RST_SLEEP 100
  761. #define VSC9953_SYS_RAMINIT_SLEEP 80
  762. static int vsc9953_gcb_soft_rst_status(struct ocelot *ocelot)
  763. {
  764. int val;
  765. ocelot_field_read(ocelot, GCB_SOFT_RST_SWC_RST, &val);
  766. return val;
  767. }
  768. static int vsc9953_sys_ram_init_status(struct ocelot *ocelot)
  769. {
  770. int val;
  771. ocelot_field_read(ocelot, SYS_RESET_CFG_MEM_INIT, &val);
  772. return val;
  773. }
  774. /* CORE_ENA is in SYS:SYSTEM:RESET_CFG
  775. * MEM_INIT is in SYS:SYSTEM:RESET_CFG
  776. * MEM_ENA is in SYS:SYSTEM:RESET_CFG
  777. */
  778. static int vsc9953_reset(struct ocelot *ocelot)
  779. {
  780. int val, err;
  781. /* soft-reset the switch core */
  782. ocelot_field_write(ocelot, GCB_SOFT_RST_SWC_RST, 1);
  783. err = readx_poll_timeout(vsc9953_gcb_soft_rst_status, ocelot, val, !val,
  784. VSC9953_GCB_RST_SLEEP, VSC9953_INIT_TIMEOUT);
  785. if (err) {
  786. dev_err(ocelot->dev, "timeout: switch core reset\n");
  787. return err;
  788. }
  789. /* initialize switch mem ~40us */
  790. ocelot_field_write(ocelot, SYS_RESET_CFG_MEM_ENA, 1);
  791. ocelot_field_write(ocelot, SYS_RESET_CFG_MEM_INIT, 1);
  792. err = readx_poll_timeout(vsc9953_sys_ram_init_status, ocelot, val, !val,
  793. VSC9953_SYS_RAMINIT_SLEEP,
  794. VSC9953_INIT_TIMEOUT);
  795. if (err) {
  796. dev_err(ocelot->dev, "timeout: switch sram init\n");
  797. return err;
  798. }
  799. /* enable switch core */
  800. ocelot_field_write(ocelot, SYS_RESET_CFG_CORE_ENA, 1);
  801. return 0;
  802. }
  803. static void vsc9953_phylink_validate(struct ocelot *ocelot, int port,
  804. unsigned long *supported,
  805. struct phylink_link_state *state)
  806. {
  807. __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, };
  808. phylink_set_port_modes(mask);
  809. phylink_set(mask, Autoneg);
  810. phylink_set(mask, Pause);
  811. phylink_set(mask, Asym_Pause);
  812. phylink_set(mask, 10baseT_Full);
  813. phylink_set(mask, 10baseT_Half);
  814. phylink_set(mask, 100baseT_Full);
  815. phylink_set(mask, 100baseT_Half);
  816. phylink_set(mask, 1000baseT_Full);
  817. phylink_set(mask, 1000baseX_Full);
  818. if (state->interface == PHY_INTERFACE_MODE_INTERNAL) {
  819. phylink_set(mask, 2500baseT_Full);
  820. phylink_set(mask, 2500baseX_Full);
  821. }
  822. linkmode_and(supported, supported, mask);
  823. linkmode_and(state->advertising, state->advertising, mask);
  824. }
  825. /* Watermark encode
  826. * Bit 9: Unit; 0:1, 1:16
  827. * Bit 8-0: Value to be multiplied with unit
  828. */
  829. static u16 vsc9953_wm_enc(u16 value)
  830. {
  831. WARN_ON(value >= 16 * BIT(9));
  832. if (value >= BIT(9))
  833. return BIT(9) | (value / 16);
  834. return value;
  835. }
  836. static u16 vsc9953_wm_dec(u16 wm)
  837. {
  838. WARN_ON(wm & ~GENMASK(9, 0));
  839. if (wm & BIT(9))
  840. return (wm & GENMASK(8, 0)) * 16;
  841. return wm;
  842. }
  843. static void vsc9953_wm_stat(u32 val, u32 *inuse, u32 *maxuse)
  844. {
  845. *inuse = (val & GENMASK(25, 13)) >> 13;
  846. *maxuse = val & GENMASK(12, 0);
  847. }
  848. static const struct ocelot_ops vsc9953_ops = {
  849. .reset = vsc9953_reset,
  850. .wm_enc = vsc9953_wm_enc,
  851. .wm_dec = vsc9953_wm_dec,
  852. .wm_stat = vsc9953_wm_stat,
  853. .port_to_netdev = felix_port_to_netdev,
  854. .netdev_to_port = felix_netdev_to_port,
  855. };
  856. static int vsc9953_mdio_bus_alloc(struct ocelot *ocelot)
  857. {
  858. struct felix *felix = ocelot_to_felix(ocelot);
  859. struct device *dev = ocelot->dev;
  860. struct mii_bus *bus;
  861. int port;
  862. int rc;
  863. felix->pcs = devm_kcalloc(dev, felix->info->num_ports,
  864. sizeof(struct phylink_pcs *),
  865. GFP_KERNEL);
  866. if (!felix->pcs) {
  867. dev_err(dev, "failed to allocate array for PCS PHYs\n");
  868. return -ENOMEM;
  869. }
  870. rc = mscc_miim_setup(dev, &bus, "VSC9953 internal MDIO bus",
  871. ocelot->targets[GCB],
  872. ocelot->map[GCB][GCB_MIIM_MII_STATUS & REG_MASK],
  873. true);
  874. if (rc) {
  875. dev_err(dev, "failed to setup MDIO bus\n");
  876. return rc;
  877. }
  878. /* Needed in order to initialize the bus mutex lock */
  879. rc = devm_of_mdiobus_register(dev, bus, NULL);
  880. if (rc < 0) {
  881. dev_err(dev, "failed to register MDIO bus\n");
  882. return rc;
  883. }
  884. felix->imdio = bus;
  885. for (port = 0; port < felix->info->num_ports; port++) {
  886. struct ocelot_port *ocelot_port = ocelot->ports[port];
  887. struct phylink_pcs *phylink_pcs;
  888. struct mdio_device *mdio_device;
  889. int addr = port + 4;
  890. if (dsa_is_unused_port(felix->ds, port))
  891. continue;
  892. if (ocelot_port->phy_mode == PHY_INTERFACE_MODE_INTERNAL)
  893. continue;
  894. mdio_device = mdio_device_create(felix->imdio, addr);
  895. if (IS_ERR(mdio_device))
  896. continue;
  897. phylink_pcs = lynx_pcs_create(mdio_device);
  898. if (!phylink_pcs) {
  899. mdio_device_free(mdio_device);
  900. continue;
  901. }
  902. felix->pcs[port] = phylink_pcs;
  903. dev_info(dev, "Found PCS at internal MDIO address %d\n", addr);
  904. }
  905. return 0;
  906. }
  907. static void vsc9953_mdio_bus_free(struct ocelot *ocelot)
  908. {
  909. struct felix *felix = ocelot_to_felix(ocelot);
  910. int port;
  911. for (port = 0; port < ocelot->num_phys_ports; port++) {
  912. struct phylink_pcs *phylink_pcs = felix->pcs[port];
  913. struct mdio_device *mdio_device;
  914. if (!phylink_pcs)
  915. continue;
  916. mdio_device = lynx_get_mdio_device(phylink_pcs);
  917. mdio_device_free(mdio_device);
  918. lynx_pcs_destroy(phylink_pcs);
  919. }
  920. /* mdiobus_unregister and mdiobus_free handled by devres */
  921. }
  922. static const struct felix_info seville_info_vsc9953 = {
  923. .resources = vsc9953_resources,
  924. .num_resources = ARRAY_SIZE(vsc9953_resources),
  925. .resource_names = vsc9953_resource_names,
  926. .regfields = vsc9953_regfields,
  927. .map = vsc9953_regmap,
  928. .ops = &vsc9953_ops,
  929. .stats_layout = vsc9953_stats_layout,
  930. .vcap = vsc9953_vcap_props,
  931. .vcap_pol_base = VSC9953_VCAP_POLICER_BASE,
  932. .vcap_pol_max = VSC9953_VCAP_POLICER_MAX,
  933. .vcap_pol_base2 = VSC9953_VCAP_POLICER_BASE2,
  934. .vcap_pol_max2 = VSC9953_VCAP_POLICER_MAX2,
  935. .num_mact_rows = 2048,
  936. .num_ports = VSC9953_NUM_PORTS,
  937. .num_tx_queues = OCELOT_NUM_TC,
  938. .mdio_bus_alloc = vsc9953_mdio_bus_alloc,
  939. .mdio_bus_free = vsc9953_mdio_bus_free,
  940. .phylink_validate = vsc9953_phylink_validate,
  941. .port_modes = vsc9953_port_modes,
  942. };
  943. static int seville_probe(struct platform_device *pdev)
  944. {
  945. struct dsa_switch *ds;
  946. struct ocelot *ocelot;
  947. struct resource *res;
  948. struct felix *felix;
  949. int err;
  950. felix = kzalloc(sizeof(struct felix), GFP_KERNEL);
  951. if (!felix) {
  952. err = -ENOMEM;
  953. dev_err(&pdev->dev, "Failed to allocate driver memory\n");
  954. goto err_alloc_felix;
  955. }
  956. platform_set_drvdata(pdev, felix);
  957. ocelot = &felix->ocelot;
  958. ocelot->dev = &pdev->dev;
  959. ocelot->num_flooding_pgids = 1;
  960. felix->info = &seville_info_vsc9953;
  961. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  962. if (!res) {
  963. err = -EINVAL;
  964. dev_err(&pdev->dev, "Invalid resource\n");
  965. goto err_alloc_felix;
  966. }
  967. felix->switch_base = res->start;
  968. ds = kzalloc(sizeof(struct dsa_switch), GFP_KERNEL);
  969. if (!ds) {
  970. err = -ENOMEM;
  971. dev_err(&pdev->dev, "Failed to allocate DSA switch\n");
  972. goto err_alloc_ds;
  973. }
  974. ds->dev = &pdev->dev;
  975. ds->num_ports = felix->info->num_ports;
  976. ds->ops = &felix_switch_ops;
  977. ds->priv = ocelot;
  978. felix->ds = ds;
  979. felix->tag_proto = DSA_TAG_PROTO_SEVILLE;
  980. err = dsa_register_switch(ds);
  981. if (err) {
  982. dev_err(&pdev->dev, "Failed to register DSA switch: %d\n", err);
  983. goto err_register_ds;
  984. }
  985. return 0;
  986. err_register_ds:
  987. kfree(ds);
  988. err_alloc_ds:
  989. err_alloc_felix:
  990. kfree(felix);
  991. return err;
  992. }
  993. static int seville_remove(struct platform_device *pdev)
  994. {
  995. struct felix *felix = platform_get_drvdata(pdev);
  996. if (!felix)
  997. return 0;
  998. dsa_unregister_switch(felix->ds);
  999. kfree(felix->ds);
  1000. kfree(felix);
  1001. return 0;
  1002. }
  1003. static void seville_shutdown(struct platform_device *pdev)
  1004. {
  1005. struct felix *felix = platform_get_drvdata(pdev);
  1006. if (!felix)
  1007. return;
  1008. dsa_switch_shutdown(felix->ds);
  1009. platform_set_drvdata(pdev, NULL);
  1010. }
  1011. static const struct of_device_id seville_of_match[] = {
  1012. { .compatible = "mscc,vsc9953-switch" },
  1013. { },
  1014. };
  1015. MODULE_DEVICE_TABLE(of, seville_of_match);
  1016. static struct platform_driver seville_vsc9953_driver = {
  1017. .probe = seville_probe,
  1018. .remove = seville_remove,
  1019. .shutdown = seville_shutdown,
  1020. .driver = {
  1021. .name = "mscc_seville",
  1022. .of_match_table = of_match_ptr(seville_of_match),
  1023. },
  1024. };
  1025. module_platform_driver(seville_vsc9953_driver);
  1026. MODULE_DESCRIPTION("Seville Switch driver");
  1027. MODULE_LICENSE("GPL v2");