sja1105.c 97 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright 2016-2018 NXP
  4. * Copyright 2018, Sensor-Technik Wiedemann GmbH
  5. * Copyright 2018-2019, Vladimir Oltean <olteanv@gmail.com>
  6. * Copyright 2020-2021 NXP
  7. *
  8. * Ported from Linux (drivers/net/dsa/sja1105/).
  9. */
  10. #include <common.h>
  11. #include <dm/device_compat.h>
  12. #include <linux/bitops.h>
  13. #include <linux/bitrev.h>
  14. #include <linux/errno.h>
  15. #include <linux/delay.h>
  16. #include <linux/if_ether.h>
  17. #include <linux/if_vlan.h>
  18. #include <linux/types.h>
  19. #include <net/dsa.h>
  20. #include <stdlib.h>
  21. #include <spi.h>
  22. #include <miiphy.h>
  23. #include <dm/of_extra.h>
  24. enum packing_op {
  25. PACK,
  26. UNPACK,
  27. };
  28. #define ETHER_CRC32_POLY 0x04C11DB7
  29. #define ETH_P_SJA1105 0xdadb
  30. #define SJA1105_NUM_PORTS 5
  31. #define SJA1110_NUM_PORTS 11
  32. #define SJA1105_MAX_NUM_PORTS SJA1110_NUM_PORTS
  33. #define SJA1105_NUM_TC 8
  34. #define SJA1105ET_FDB_BIN_SIZE 4
  35. #define SJA1105_SIZE_CGU_CMD 4
  36. #define SJA1105_SIZE_RESET_CMD 4
  37. #define SJA1105_SIZE_MDIO_CMD 4
  38. #define SJA1105_SIZE_SPI_MSG_HEADER 4
  39. #define SJA1105_SIZE_SPI_MSG_MAXLEN (64 * 4)
  40. #define SJA1105_SIZE_DEVICE_ID 4
  41. #define SJA1105_SIZE_TABLE_HEADER 12
  42. #define SJA1105_SIZE_L2_POLICING_ENTRY 8
  43. #define SJA1105_SIZE_VLAN_LOOKUP_ENTRY 8
  44. #define SJA1110_SIZE_VLAN_LOOKUP_ENTRY 12
  45. #define SJA1105_SIZE_L2_FORWARDING_ENTRY 8
  46. #define SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY 12
  47. #define SJA1105_SIZE_XMII_PARAMS_ENTRY 4
  48. #define SJA1110_SIZE_XMII_PARAMS_ENTRY 8
  49. #define SJA1105ET_SIZE_MAC_CONFIG_ENTRY 28
  50. #define SJA1105ET_SIZE_GENERAL_PARAMS_ENTRY 40
  51. #define SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY 32
  52. #define SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY 44
  53. #define SJA1110_SIZE_GENERAL_PARAMS_ENTRY 56
  54. #define SJA1105_MAX_L2_LOOKUP_COUNT 1024
  55. #define SJA1105_MAX_L2_POLICING_COUNT 45
  56. #define SJA1110_MAX_L2_POLICING_COUNT 110
  57. #define SJA1105_MAX_VLAN_LOOKUP_COUNT 4096
  58. #define SJA1105_MAX_L2_FORWARDING_COUNT 13
  59. #define SJA1110_MAX_L2_FORWARDING_COUNT 19
  60. #define SJA1105_MAX_MAC_CONFIG_COUNT 5
  61. #define SJA1110_MAX_MAC_CONFIG_COUNT 11
  62. #define SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT 1
  63. #define SJA1105_MAX_GENERAL_PARAMS_COUNT 1
  64. #define SJA1105_MAX_XMII_PARAMS_COUNT 1
  65. #define SJA1105_MAX_FRAME_MEMORY 929
  66. #define SJA1105E_DEVICE_ID 0x9C00000Cull
  67. #define SJA1105T_DEVICE_ID 0x9E00030Eull
  68. #define SJA1105PR_DEVICE_ID 0xAF00030Eull
  69. #define SJA1105QS_DEVICE_ID 0xAE00030Eull
  70. #define SJA1110_DEVICE_ID 0xB700030Full
  71. #define SJA1105ET_PART_NO 0x9A83
  72. #define SJA1105P_PART_NO 0x9A84
  73. #define SJA1105Q_PART_NO 0x9A85
  74. #define SJA1105R_PART_NO 0x9A86
  75. #define SJA1105S_PART_NO 0x9A87
  76. #define SJA1110A_PART_NO 0x1110
  77. #define SJA1110B_PART_NO 0x1111
  78. #define SJA1110C_PART_NO 0x1112
  79. #define SJA1110D_PART_NO 0x1113
  80. #define SJA1110_ACU 0x1c4400
  81. #define SJA1110_RGU 0x1c6000
  82. #define SJA1110_CGU 0x1c6400
  83. #define SJA1110_SPI_ADDR(x) ((x) / 4)
  84. #define SJA1110_ACU_ADDR(x) (SJA1110_ACU + SJA1110_SPI_ADDR(x))
  85. #define SJA1110_CGU_ADDR(x) (SJA1110_CGU + SJA1110_SPI_ADDR(x))
  86. #define SJA1110_RGU_ADDR(x) (SJA1110_RGU + SJA1110_SPI_ADDR(x))
  87. #define SJA1105_RSV_ADDR 0xffffffffffffffffull
  88. #define SJA1110_PCS_BANK_REG SJA1110_SPI_ADDR(0x3fc)
  89. #define DSA_8021Q_DIR_TX BIT(11)
  90. #define DSA_8021Q_PORT_SHIFT 0
  91. #define DSA_8021Q_PORT_MASK GENMASK(3, 0)
  92. #define DSA_8021Q_PORT(x) (((x) << DSA_8021Q_PORT_SHIFT) & \
  93. DSA_8021Q_PORT_MASK)
  94. #define SJA1105_RATE_MBPS(speed) (((speed) * 64000) / 1000)
  95. /* XPCS registers */
  96. /* VR MII MMD registers offsets */
  97. #define DW_VR_MII_DIG_CTRL1 0x8000
  98. #define DW_VR_MII_AN_CTRL 0x8001
  99. #define DW_VR_MII_DIG_CTRL2 0x80e1
  100. /* VR_MII_DIG_CTRL1 */
  101. #define DW_VR_MII_DIG_CTRL1_MAC_AUTO_SW BIT(9)
  102. /* VR_MII_DIG_CTRL2 */
  103. #define DW_VR_MII_DIG_CTRL2_TX_POL_INV BIT(4)
  104. /* VR_MII_AN_CTRL */
  105. #define DW_VR_MII_AN_CTRL_TX_CONFIG_SHIFT 3
  106. #define DW_VR_MII_TX_CONFIG_MASK BIT(3)
  107. #define DW_VR_MII_TX_CONFIG_MAC_SIDE_SGMII 0x0
  108. #define DW_VR_MII_AN_CTRL_PCS_MODE_SHIFT 1
  109. #define DW_VR_MII_PCS_MODE_MASK GENMASK(2, 1)
  110. #define DW_VR_MII_PCS_MODE_C37_SGMII 0x2
  111. /* PMA registers */
  112. /* LANE_DRIVER1_0 register */
  113. #define SJA1110_LANE_DRIVER1_0 0x8038
  114. #define SJA1110_TXDRV(x) (((x) << 12) & GENMASK(14, 12))
  115. /* LANE_DRIVER2_0 register */
  116. #define SJA1110_LANE_DRIVER2_0 0x803a
  117. #define SJA1110_TXDRVTRIM_LSB(x) ((x) & GENMASK_ULL(15, 0))
  118. /* LANE_DRIVER2_1 register */
  119. #define SJA1110_LANE_DRIVER2_1 0x803b
  120. #define SJA1110_LANE_DRIVER2_1_RSV BIT(9)
  121. #define SJA1110_TXDRVTRIM_MSB(x) (((x) & GENMASK_ULL(23, 16)) >> 16)
  122. /* LANE_TRIM register */
  123. #define SJA1110_LANE_TRIM 0x8040
  124. #define SJA1110_TXTEN BIT(11)
  125. #define SJA1110_TXRTRIM(x) (((x) << 8) & GENMASK(10, 8))
  126. #define SJA1110_TXPLL_BWSEL BIT(7)
  127. #define SJA1110_RXTEN BIT(6)
  128. #define SJA1110_RXRTRIM(x) (((x) << 3) & GENMASK(5, 3))
  129. #define SJA1110_CDR_GAIN BIT(2)
  130. #define SJA1110_ACCOUPLE_RXVCM_EN BIT(0)
  131. /* LANE_DATAPATH_1 register */
  132. #define SJA1110_LANE_DATAPATH_1 0x8037
  133. /* POWERDOWN_ENABLE register */
  134. #define SJA1110_POWERDOWN_ENABLE 0x8041
  135. #define SJA1110_TXPLL_PD BIT(12)
  136. #define SJA1110_TXPD BIT(11)
  137. #define SJA1110_RXPKDETEN BIT(10)
  138. #define SJA1110_RXCH_PD BIT(9)
  139. #define SJA1110_RXBIAS_PD BIT(8)
  140. #define SJA1110_RESET_SER_EN BIT(7)
  141. #define SJA1110_RESET_SER BIT(6)
  142. #define SJA1110_RESET_DES BIT(5)
  143. #define SJA1110_RCVEN BIT(4)
  144. /* RXPLL_CTRL0 register */
  145. #define SJA1110_RXPLL_CTRL0 0x8065
  146. #define SJA1110_RXPLL_FBDIV(x) (((x) << 2) & GENMASK(9, 2))
  147. /* RXPLL_CTRL1 register */
  148. #define SJA1110_RXPLL_CTRL1 0x8066
  149. #define SJA1110_RXPLL_REFDIV(x) ((x) & GENMASK(4, 0))
  150. /* TXPLL_CTRL0 register */
  151. #define SJA1110_TXPLL_CTRL0 0x806d
  152. #define SJA1110_TXPLL_FBDIV(x) ((x) & GENMASK(11, 0))
  153. /* TXPLL_CTRL1 register */
  154. #define SJA1110_TXPLL_CTRL1 0x806e
  155. #define SJA1110_TXPLL_REFDIV(x) ((x) & GENMASK(5, 0))
  156. /* RX_DATA_DETECT register */
  157. #define SJA1110_RX_DATA_DETECT 0x8045
  158. /* RX_CDR_CTLE register */
  159. #define SJA1110_RX_CDR_CTLE 0x8042
  160. /* UM10944.pdf Page 11, Table 2. Configuration Blocks */
  161. enum {
  162. BLKID_L2_POLICING = 0x06,
  163. BLKID_VLAN_LOOKUP = 0x07,
  164. BLKID_L2_FORWARDING = 0x08,
  165. BLKID_MAC_CONFIG = 0x09,
  166. BLKID_L2_FORWARDING_PARAMS = 0x0E,
  167. BLKID_GENERAL_PARAMS = 0x11,
  168. BLKID_XMII_PARAMS = 0x4E,
  169. };
  170. enum sja1105_blk_idx {
  171. BLK_IDX_L2_POLICING = 0,
  172. BLK_IDX_VLAN_LOOKUP,
  173. BLK_IDX_L2_FORWARDING,
  174. BLK_IDX_MAC_CONFIG,
  175. BLK_IDX_L2_FORWARDING_PARAMS,
  176. BLK_IDX_GENERAL_PARAMS,
  177. BLK_IDX_XMII_PARAMS,
  178. BLK_IDX_MAX,
  179. };
  180. struct sja1105_general_params_entry {
  181. u64 mac_fltres1;
  182. u64 mac_fltres0;
  183. u64 mac_flt1;
  184. u64 mac_flt0;
  185. u64 casc_port;
  186. u64 host_port;
  187. u64 mirr_port;
  188. u64 tpid;
  189. u64 tpid2;
  190. };
  191. struct sja1105_vlan_lookup_entry {
  192. u64 vmemb_port;
  193. u64 vlan_bc;
  194. u64 tag_port;
  195. u64 vlanid;
  196. u64 type_entry; /* SJA1110 only */
  197. };
  198. struct sja1105_l2_forwarding_entry {
  199. u64 bc_domain;
  200. u64 reach_port;
  201. u64 fl_domain;
  202. };
  203. struct sja1105_l2_forwarding_params_entry {
  204. u64 part_spc[SJA1105_NUM_TC];
  205. };
  206. struct sja1105_l2_policing_entry {
  207. u64 sharindx;
  208. u64 smax;
  209. u64 rate;
  210. u64 maxlen;
  211. u64 partition;
  212. };
  213. struct sja1105_mac_config_entry {
  214. u64 top[SJA1105_NUM_TC];
  215. u64 base[SJA1105_NUM_TC];
  216. u64 enabled[SJA1105_NUM_TC];
  217. u64 speed;
  218. u64 vlanid;
  219. u64 egress;
  220. u64 ingress;
  221. };
  222. struct sja1105_xmii_params_entry {
  223. u64 phy_mac[SJA1105_MAX_NUM_PORTS];
  224. u64 xmii_mode[SJA1105_MAX_NUM_PORTS];
  225. u64 special[SJA1105_MAX_NUM_PORTS];
  226. };
  227. struct sja1105_table_header {
  228. u64 block_id;
  229. u64 len;
  230. u64 crc;
  231. };
  232. struct sja1105_table_ops {
  233. size_t (*packing)(void *buf, void *entry_ptr, enum packing_op op);
  234. size_t unpacked_entry_size;
  235. size_t packed_entry_size;
  236. size_t max_entry_count;
  237. };
  238. struct sja1105_table {
  239. const struct sja1105_table_ops *ops;
  240. size_t entry_count;
  241. void *entries;
  242. };
  243. struct sja1105_static_config {
  244. u64 device_id;
  245. struct sja1105_table tables[BLK_IDX_MAX];
  246. };
  247. struct sja1105_xpcs_cfg {
  248. bool inband_an;
  249. int speed;
  250. };
  251. struct sja1105_private {
  252. struct sja1105_static_config static_config;
  253. bool rgmii_rx_delay[SJA1105_MAX_NUM_PORTS];
  254. bool rgmii_tx_delay[SJA1105_MAX_NUM_PORTS];
  255. u16 pvid[SJA1105_MAX_NUM_PORTS];
  256. struct sja1105_xpcs_cfg xpcs_cfg[SJA1105_MAX_NUM_PORTS];
  257. struct mii_dev *mdio_pcs;
  258. const struct sja1105_info *info;
  259. struct udevice *dev;
  260. };
  261. typedef enum {
  262. SPI_READ = 0,
  263. SPI_WRITE = 1,
  264. } sja1105_spi_rw_mode_t;
  265. typedef enum {
  266. XMII_MAC = 0,
  267. XMII_PHY = 1,
  268. } sja1105_mii_role_t;
  269. typedef enum {
  270. XMII_MODE_MII = 0,
  271. XMII_MODE_RMII = 1,
  272. XMII_MODE_RGMII = 2,
  273. XMII_MODE_SGMII = 3,
  274. } sja1105_phy_interface_t;
  275. enum {
  276. SJA1105_SPEED_AUTO,
  277. SJA1105_SPEED_10MBPS,
  278. SJA1105_SPEED_100MBPS,
  279. SJA1105_SPEED_1000MBPS,
  280. SJA1105_SPEED_MAX,
  281. };
  282. enum sja1110_vlan_type {
  283. SJA1110_VLAN_INVALID = 0,
  284. SJA1110_VLAN_C_TAG = 1, /* Single inner VLAN tag */
  285. SJA1110_VLAN_S_TAG = 2, /* Single outer VLAN tag */
  286. SJA1110_VLAN_D_TAG = 3, /* Double tagged, use outer tag for lookup */
  287. };
  288. /* Keeps the different addresses between E/T and P/Q/R/S */
  289. struct sja1105_regs {
  290. u64 device_id;
  291. u64 prod_id;
  292. u64 status;
  293. u64 port_control;
  294. u64 rgu;
  295. u64 config;
  296. u64 rmii_pll1;
  297. u64 pad_mii_tx[SJA1105_MAX_NUM_PORTS];
  298. u64 pad_mii_rx[SJA1105_MAX_NUM_PORTS];
  299. u64 pad_mii_id[SJA1105_MAX_NUM_PORTS];
  300. u64 cgu_idiv[SJA1105_MAX_NUM_PORTS];
  301. u64 mii_tx_clk[SJA1105_MAX_NUM_PORTS];
  302. u64 mii_rx_clk[SJA1105_MAX_NUM_PORTS];
  303. u64 mii_ext_tx_clk[SJA1105_MAX_NUM_PORTS];
  304. u64 mii_ext_rx_clk[SJA1105_MAX_NUM_PORTS];
  305. u64 rgmii_tx_clk[SJA1105_MAX_NUM_PORTS];
  306. u64 rmii_ref_clk[SJA1105_MAX_NUM_PORTS];
  307. u64 rmii_ext_tx_clk[SJA1105_MAX_NUM_PORTS];
  308. u64 pcs_base[SJA1105_MAX_NUM_PORTS];
  309. };
  310. struct sja1105_info {
  311. u64 device_id;
  312. u64 part_no;
  313. const struct sja1105_table_ops *static_ops;
  314. const struct sja1105_regs *regs;
  315. int (*reset_cmd)(struct sja1105_private *priv);
  316. int (*setup_rgmii_delay)(struct sja1105_private *priv, int port);
  317. int (*pcs_mdio_read)(struct mii_dev *bus, int phy, int mmd, int reg);
  318. int (*pcs_mdio_write)(struct mii_dev *bus, int phy, int mmd, int reg,
  319. u16 val);
  320. int (*pma_config)(struct sja1105_private *priv, int port);
  321. const char *name;
  322. bool supports_mii[SJA1105_MAX_NUM_PORTS];
  323. bool supports_rmii[SJA1105_MAX_NUM_PORTS];
  324. bool supports_rgmii[SJA1105_MAX_NUM_PORTS];
  325. bool supports_sgmii[SJA1105_MAX_NUM_PORTS];
  326. const u64 port_speed[SJA1105_SPEED_MAX];
  327. };
  328. struct sja1105_chunk {
  329. u8 *buf;
  330. size_t len;
  331. u64 reg_addr;
  332. };
  333. struct sja1105_spi_message {
  334. u64 access;
  335. u64 read_count;
  336. u64 address;
  337. };
  338. /* Common structure for CFG_PAD_MIIx_RX and CFG_PAD_MIIx_TX */
  339. struct sja1105_cfg_pad_mii {
  340. u64 d32_os;
  341. u64 d32_ih;
  342. u64 d32_ipud;
  343. u64 d10_ih;
  344. u64 d10_os;
  345. u64 d10_ipud;
  346. u64 ctrl_os;
  347. u64 ctrl_ih;
  348. u64 ctrl_ipud;
  349. u64 clk_os;
  350. u64 clk_ih;
  351. u64 clk_ipud;
  352. };
  353. struct sja1105_cfg_pad_mii_id {
  354. u64 rxc_stable_ovr;
  355. u64 rxc_delay;
  356. u64 rxc_bypass;
  357. u64 rxc_pd;
  358. u64 txc_stable_ovr;
  359. u64 txc_delay;
  360. u64 txc_bypass;
  361. u64 txc_pd;
  362. };
  363. struct sja1105_cgu_idiv {
  364. u64 clksrc;
  365. u64 autoblock;
  366. u64 idiv;
  367. u64 pd;
  368. };
  369. struct sja1105_cgu_pll_ctrl {
  370. u64 pllclksrc;
  371. u64 msel;
  372. u64 autoblock;
  373. u64 psel;
  374. u64 direct;
  375. u64 fbsel;
  376. u64 bypass;
  377. u64 pd;
  378. };
  379. enum {
  380. CLKSRC_MII0_TX_CLK = 0x00,
  381. CLKSRC_MII0_RX_CLK = 0x01,
  382. CLKSRC_MII1_TX_CLK = 0x02,
  383. CLKSRC_MII1_RX_CLK = 0x03,
  384. CLKSRC_MII2_TX_CLK = 0x04,
  385. CLKSRC_MII2_RX_CLK = 0x05,
  386. CLKSRC_MII3_TX_CLK = 0x06,
  387. CLKSRC_MII3_RX_CLK = 0x07,
  388. CLKSRC_MII4_TX_CLK = 0x08,
  389. CLKSRC_MII4_RX_CLK = 0x09,
  390. CLKSRC_PLL0 = 0x0B,
  391. CLKSRC_PLL1 = 0x0E,
  392. CLKSRC_IDIV0 = 0x11,
  393. CLKSRC_IDIV1 = 0x12,
  394. CLKSRC_IDIV2 = 0x13,
  395. CLKSRC_IDIV3 = 0x14,
  396. CLKSRC_IDIV4 = 0x15,
  397. };
  398. struct sja1105_cgu_mii_ctrl {
  399. u64 clksrc;
  400. u64 autoblock;
  401. u64 pd;
  402. };
  403. static int get_reverse_lsw32_offset(int offset, size_t len)
  404. {
  405. int closest_multiple_of_4;
  406. int word_index;
  407. word_index = offset / 4;
  408. closest_multiple_of_4 = word_index * 4;
  409. offset -= closest_multiple_of_4;
  410. word_index = (len / 4) - word_index - 1;
  411. return word_index * 4 + offset;
  412. }
  413. /* Simplified version of the "packing" function from Linux, adapted
  414. * to support only sja1105's quirk: QUIRK_LSW32_IS_FIRST
  415. */
  416. static void sja1105_packing(void *pbuf, u64 *uval, int startbit, int endbit,
  417. size_t pbuflen, enum packing_op op)
  418. {
  419. int plogical_first_u8, plogical_last_u8, box;
  420. if (op == UNPACK)
  421. *uval = 0;
  422. plogical_first_u8 = startbit / 8;
  423. plogical_last_u8 = endbit / 8;
  424. for (box = plogical_first_u8; box >= plogical_last_u8; box--) {
  425. int box_start_bit, box_end_bit, box_addr;
  426. int proj_start_bit, proj_end_bit;
  427. u64 proj_mask;
  428. u8 box_mask;
  429. if (box == plogical_first_u8)
  430. box_start_bit = startbit % 8;
  431. else
  432. box_start_bit = 7;
  433. if (box == plogical_last_u8)
  434. box_end_bit = endbit % 8;
  435. else
  436. box_end_bit = 0;
  437. proj_start_bit = ((box * 8) + box_start_bit) - endbit;
  438. proj_end_bit = ((box * 8) + box_end_bit) - endbit;
  439. proj_mask = GENMASK_ULL(proj_start_bit, proj_end_bit);
  440. box_mask = GENMASK_ULL(box_start_bit, box_end_bit);
  441. box_addr = pbuflen - box - 1;
  442. box_addr = get_reverse_lsw32_offset(box_addr, pbuflen);
  443. if (op == UNPACK) {
  444. u64 pval;
  445. /* Read from pbuf, write to uval */
  446. pval = ((u8 *)pbuf)[box_addr] & box_mask;
  447. pval >>= box_end_bit;
  448. pval <<= proj_end_bit;
  449. *uval &= ~proj_mask;
  450. *uval |= pval;
  451. } else {
  452. u64 pval;
  453. /* Write to pbuf, read from uval */
  454. pval = (*uval) & proj_mask;
  455. pval >>= proj_end_bit;
  456. pval <<= box_end_bit;
  457. ((u8 *)pbuf)[box_addr] &= ~box_mask;
  458. ((u8 *)pbuf)[box_addr] |= pval;
  459. }
  460. }
  461. }
  462. static u32 crc32_add(u32 crc, u8 byte)
  463. {
  464. u32 byte32 = bitrev32(byte);
  465. int i;
  466. for (i = 0; i < 8; i++) {
  467. if ((crc ^ byte32) & BIT(31)) {
  468. crc <<= 1;
  469. crc ^= ETHER_CRC32_POLY;
  470. } else {
  471. crc <<= 1;
  472. }
  473. byte32 <<= 1;
  474. }
  475. return crc;
  476. }
  477. /* Little-endian Ethernet CRC32 of data packed as big-endian u32 words */
  478. static uint32_t sja1105_crc32(void *buf, size_t len)
  479. {
  480. unsigned int i;
  481. u64 chunk;
  482. u32 crc;
  483. /* seed */
  484. crc = 0xFFFFFFFF;
  485. for (i = 0; i < len; i += 4) {
  486. sja1105_packing(buf + i, &chunk, 31, 0, 4, UNPACK);
  487. crc = crc32_add(crc, chunk & 0xFF);
  488. crc = crc32_add(crc, (chunk >> 8) & 0xFF);
  489. crc = crc32_add(crc, (chunk >> 16) & 0xFF);
  490. crc = crc32_add(crc, (chunk >> 24) & 0xFF);
  491. }
  492. return bitrev32(~crc);
  493. }
  494. static void sja1105_spi_message_pack(void *buf, struct sja1105_spi_message *msg)
  495. {
  496. const int size = SJA1105_SIZE_SPI_MSG_HEADER;
  497. memset(buf, 0, size);
  498. sja1105_packing(buf, &msg->access, 31, 31, size, PACK);
  499. sja1105_packing(buf, &msg->read_count, 30, 25, size, PACK);
  500. sja1105_packing(buf, &msg->address, 24, 4, size, PACK);
  501. }
  502. static int sja1105_xfer_buf(const struct sja1105_private *priv,
  503. sja1105_spi_rw_mode_t rw, u64 reg_addr,
  504. u8 *buf, size_t len)
  505. {
  506. struct udevice *dev = priv->dev;
  507. struct sja1105_chunk chunk = {
  508. .len = min_t(size_t, len, SJA1105_SIZE_SPI_MSG_MAXLEN),
  509. .reg_addr = reg_addr,
  510. .buf = buf,
  511. };
  512. int num_chunks;
  513. int rc, i;
  514. rc = dm_spi_claim_bus(dev);
  515. if (rc)
  516. return rc;
  517. num_chunks = DIV_ROUND_UP(len, SJA1105_SIZE_SPI_MSG_MAXLEN);
  518. for (i = 0; i < num_chunks; i++) {
  519. u8 hdr_buf[SJA1105_SIZE_SPI_MSG_HEADER];
  520. struct sja1105_spi_message msg;
  521. u8 *rx_buf = NULL;
  522. u8 *tx_buf = NULL;
  523. /* Populate the transfer's header buffer */
  524. msg.address = chunk.reg_addr;
  525. msg.access = rw;
  526. if (rw == SPI_READ)
  527. msg.read_count = chunk.len / 4;
  528. else
  529. /* Ignored */
  530. msg.read_count = 0;
  531. sja1105_spi_message_pack(hdr_buf, &msg);
  532. rc = dm_spi_xfer(dev, SJA1105_SIZE_SPI_MSG_HEADER * 8, hdr_buf,
  533. NULL, SPI_XFER_BEGIN);
  534. if (rc)
  535. goto out;
  536. /* Populate the transfer's data buffer */
  537. if (rw == SPI_READ)
  538. rx_buf = chunk.buf;
  539. else
  540. tx_buf = chunk.buf;
  541. rc = dm_spi_xfer(dev, chunk.len * 8, tx_buf, rx_buf,
  542. SPI_XFER_END);
  543. if (rc)
  544. goto out;
  545. /* Calculate next chunk */
  546. chunk.buf += chunk.len;
  547. chunk.reg_addr += chunk.len / 4;
  548. chunk.len = min_t(size_t, (ptrdiff_t)(buf + len - chunk.buf),
  549. SJA1105_SIZE_SPI_MSG_MAXLEN);
  550. }
  551. out:
  552. dm_spi_release_bus(dev);
  553. return rc;
  554. }
  555. static int sja1105et_reset_cmd(struct sja1105_private *priv)
  556. {
  557. const struct sja1105_regs *regs = priv->info->regs;
  558. u8 packed_buf[SJA1105_SIZE_RESET_CMD] = {0};
  559. const int size = SJA1105_SIZE_RESET_CMD;
  560. u64 cold_rst = 1;
  561. sja1105_packing(packed_buf, &cold_rst, 3, 3, size, PACK);
  562. return sja1105_xfer_buf(priv, SPI_WRITE, regs->rgu, packed_buf,
  563. SJA1105_SIZE_RESET_CMD);
  564. }
  565. static int sja1105pqrs_reset_cmd(struct sja1105_private *priv)
  566. {
  567. const struct sja1105_regs *regs = priv->info->regs;
  568. u8 packed_buf[SJA1105_SIZE_RESET_CMD] = {0};
  569. const int size = SJA1105_SIZE_RESET_CMD;
  570. u64 cold_rst = 1;
  571. sja1105_packing(packed_buf, &cold_rst, 2, 2, size, PACK);
  572. return sja1105_xfer_buf(priv, SPI_WRITE, regs->rgu, packed_buf,
  573. SJA1105_SIZE_RESET_CMD);
  574. }
  575. static int sja1110_reset_cmd(struct sja1105_private *priv)
  576. {
  577. const struct sja1105_regs *regs = priv->info->regs;
  578. u8 packed_buf[SJA1105_SIZE_RESET_CMD] = {0};
  579. const int size = SJA1105_SIZE_RESET_CMD;
  580. u64 switch_rst = 1;
  581. /* Only reset the switch core.
  582. * A full cold reset would re-enable the BASE_MCSS_CLOCK PLL which
  583. * would turn on the microcontroller, potentially letting it execute
  584. * code which could interfere with our configuration.
  585. */
  586. sja1105_packing(packed_buf, &switch_rst, 20, 20, size, PACK);
  587. return sja1105_xfer_buf(priv, SPI_WRITE, regs->rgu, packed_buf,
  588. SJA1105_SIZE_RESET_CMD);
  589. }
  590. static size_t sja1105et_general_params_entry_packing(void *buf, void *entry_ptr,
  591. enum packing_op op)
  592. {
  593. const size_t size = SJA1105ET_SIZE_GENERAL_PARAMS_ENTRY;
  594. struct sja1105_general_params_entry *entry = entry_ptr;
  595. sja1105_packing(buf, &entry->mac_fltres1, 311, 264, size, op);
  596. sja1105_packing(buf, &entry->mac_fltres0, 263, 216, size, op);
  597. sja1105_packing(buf, &entry->mac_flt1, 215, 168, size, op);
  598. sja1105_packing(buf, &entry->mac_flt0, 167, 120, size, op);
  599. sja1105_packing(buf, &entry->casc_port, 115, 113, size, op);
  600. sja1105_packing(buf, &entry->host_port, 112, 110, size, op);
  601. sja1105_packing(buf, &entry->mirr_port, 109, 107, size, op);
  602. sja1105_packing(buf, &entry->tpid, 42, 27, size, op);
  603. sja1105_packing(buf, &entry->tpid2, 25, 10, size, op);
  604. return size;
  605. }
  606. static size_t sja1110_general_params_entry_packing(void *buf, void *entry_ptr,
  607. enum packing_op op)
  608. {
  609. struct sja1105_general_params_entry *entry = entry_ptr;
  610. const size_t size = SJA1110_SIZE_GENERAL_PARAMS_ENTRY;
  611. sja1105_packing(buf, &entry->mac_fltres1, 438, 391, size, op);
  612. sja1105_packing(buf, &entry->mac_fltres0, 390, 343, size, op);
  613. sja1105_packing(buf, &entry->mac_flt1, 342, 295, size, op);
  614. sja1105_packing(buf, &entry->mac_flt0, 294, 247, size, op);
  615. sja1105_packing(buf, &entry->casc_port, 242, 232, size, op);
  616. sja1105_packing(buf, &entry->host_port, 231, 228, size, op);
  617. sja1105_packing(buf, &entry->mirr_port, 227, 224, size, op);
  618. sja1105_packing(buf, &entry->tpid2, 159, 144, size, op);
  619. sja1105_packing(buf, &entry->tpid, 142, 127, size, op);
  620. return size;
  621. }
  622. static size_t
  623. sja1105pqrs_general_params_entry_packing(void *buf, void *entry_ptr,
  624. enum packing_op op)
  625. {
  626. const size_t size = SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY;
  627. struct sja1105_general_params_entry *entry = entry_ptr;
  628. sja1105_packing(buf, &entry->mac_fltres1, 343, 296, size, op);
  629. sja1105_packing(buf, &entry->mac_fltres0, 295, 248, size, op);
  630. sja1105_packing(buf, &entry->mac_flt1, 247, 200, size, op);
  631. sja1105_packing(buf, &entry->mac_flt0, 199, 152, size, op);
  632. sja1105_packing(buf, &entry->casc_port, 147, 145, size, op);
  633. sja1105_packing(buf, &entry->host_port, 144, 142, size, op);
  634. sja1105_packing(buf, &entry->mirr_port, 141, 139, size, op);
  635. sja1105_packing(buf, &entry->tpid, 74, 59, size, op);
  636. sja1105_packing(buf, &entry->tpid2, 57, 42, size, op);
  637. return size;
  638. }
  639. static size_t
  640. sja1105_l2_forwarding_params_entry_packing(void *buf, void *entry_ptr,
  641. enum packing_op op)
  642. {
  643. const size_t size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY;
  644. struct sja1105_l2_forwarding_params_entry *entry = entry_ptr;
  645. int offset, i;
  646. for (i = 0, offset = 13; i < SJA1105_NUM_TC; i++, offset += 10)
  647. sja1105_packing(buf, &entry->part_spc[i],
  648. offset + 9, offset + 0, size, op);
  649. return size;
  650. }
  651. static size_t
  652. sja1110_l2_forwarding_params_entry_packing(void *buf, void *entry_ptr,
  653. enum packing_op op)
  654. {
  655. struct sja1105_l2_forwarding_params_entry *entry = entry_ptr;
  656. const size_t size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY;
  657. int offset, i;
  658. for (i = 0, offset = 5; i < 8; i++, offset += 11)
  659. sja1105_packing(buf, &entry->part_spc[i],
  660. offset + 10, offset + 0, size, op);
  661. return size;
  662. }
  663. static size_t sja1105_l2_forwarding_entry_packing(void *buf, void *entry_ptr,
  664. enum packing_op op)
  665. {
  666. const size_t size = SJA1105_SIZE_L2_FORWARDING_ENTRY;
  667. struct sja1105_l2_forwarding_entry *entry = entry_ptr;
  668. sja1105_packing(buf, &entry->bc_domain, 63, 59, size, op);
  669. sja1105_packing(buf, &entry->reach_port, 58, 54, size, op);
  670. sja1105_packing(buf, &entry->fl_domain, 53, 49, size, op);
  671. return size;
  672. }
  673. static size_t sja1110_l2_forwarding_entry_packing(void *buf, void *entry_ptr,
  674. enum packing_op op)
  675. {
  676. struct sja1105_l2_forwarding_entry *entry = entry_ptr;
  677. const size_t size = SJA1105_SIZE_L2_FORWARDING_ENTRY;
  678. sja1105_packing(buf, &entry->bc_domain, 63, 53, size, op);
  679. sja1105_packing(buf, &entry->reach_port, 52, 42, size, op);
  680. sja1105_packing(buf, &entry->fl_domain, 41, 31, size, op);
  681. return size;
  682. }
  683. static size_t sja1105_l2_policing_entry_packing(void *buf, void *entry_ptr,
  684. enum packing_op op)
  685. {
  686. struct sja1105_l2_policing_entry *entry = entry_ptr;
  687. const size_t size = SJA1105_SIZE_L2_POLICING_ENTRY;
  688. sja1105_packing(buf, &entry->sharindx, 63, 58, size, op);
  689. sja1105_packing(buf, &entry->smax, 57, 42, size, op);
  690. sja1105_packing(buf, &entry->rate, 41, 26, size, op);
  691. sja1105_packing(buf, &entry->maxlen, 25, 15, size, op);
  692. sja1105_packing(buf, &entry->partition, 14, 12, size, op);
  693. return size;
  694. }
  695. static size_t sja1110_l2_policing_entry_packing(void *buf, void *entry_ptr,
  696. enum packing_op op)
  697. {
  698. struct sja1105_l2_policing_entry *entry = entry_ptr;
  699. const size_t size = SJA1105_SIZE_L2_POLICING_ENTRY;
  700. sja1105_packing(buf, &entry->sharindx, 63, 57, size, op);
  701. sja1105_packing(buf, &entry->smax, 56, 39, size, op);
  702. sja1105_packing(buf, &entry->rate, 38, 21, size, op);
  703. sja1105_packing(buf, &entry->maxlen, 20, 10, size, op);
  704. sja1105_packing(buf, &entry->partition, 9, 7, size, op);
  705. return size;
  706. }
  707. static size_t sja1105et_mac_config_entry_packing(void *buf, void *entry_ptr,
  708. enum packing_op op)
  709. {
  710. const size_t size = SJA1105ET_SIZE_MAC_CONFIG_ENTRY;
  711. struct sja1105_mac_config_entry *entry = entry_ptr;
  712. int offset, i;
  713. for (i = 0, offset = 72; i < SJA1105_NUM_TC; i++, offset += 19) {
  714. sja1105_packing(buf, &entry->enabled[i],
  715. offset + 0, offset + 0, size, op);
  716. sja1105_packing(buf, &entry->base[i],
  717. offset + 9, offset + 1, size, op);
  718. sja1105_packing(buf, &entry->top[i],
  719. offset + 18, offset + 10, size, op);
  720. }
  721. sja1105_packing(buf, &entry->speed, 66, 65, size, op);
  722. sja1105_packing(buf, &entry->vlanid, 21, 10, size, op);
  723. sja1105_packing(buf, &entry->egress, 2, 2, size, op);
  724. sja1105_packing(buf, &entry->ingress, 1, 1, size, op);
  725. return size;
  726. }
  727. static size_t sja1105pqrs_mac_config_entry_packing(void *buf, void *entry_ptr,
  728. enum packing_op op)
  729. {
  730. const size_t size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY;
  731. struct sja1105_mac_config_entry *entry = entry_ptr;
  732. int offset, i;
  733. for (i = 0, offset = 104; i < SJA1105_NUM_TC; i++, offset += 19) {
  734. sja1105_packing(buf, &entry->enabled[i],
  735. offset + 0, offset + 0, size, op);
  736. sja1105_packing(buf, &entry->base[i],
  737. offset + 9, offset + 1, size, op);
  738. sja1105_packing(buf, &entry->top[i],
  739. offset + 18, offset + 10, size, op);
  740. }
  741. sja1105_packing(buf, &entry->speed, 98, 97, size, op);
  742. sja1105_packing(buf, &entry->vlanid, 53, 42, size, op);
  743. sja1105_packing(buf, &entry->egress, 32, 32, size, op);
  744. sja1105_packing(buf, &entry->ingress, 31, 31, size, op);
  745. return size;
  746. }
  747. static size_t sja1110_mac_config_entry_packing(void *buf, void *entry_ptr,
  748. enum packing_op op)
  749. {
  750. const size_t size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY;
  751. struct sja1105_mac_config_entry *entry = entry_ptr;
  752. int offset, i;
  753. for (i = 0, offset = 104; i < 8; i++, offset += 19) {
  754. sja1105_packing(buf, &entry->enabled[i],
  755. offset + 0, offset + 0, size, op);
  756. sja1105_packing(buf, &entry->base[i],
  757. offset + 9, offset + 1, size, op);
  758. sja1105_packing(buf, &entry->top[i],
  759. offset + 18, offset + 10, size, op);
  760. }
  761. sja1105_packing(buf, &entry->speed, 98, 96, size, op);
  762. sja1105_packing(buf, &entry->vlanid, 52, 41, size, op);
  763. sja1105_packing(buf, &entry->egress, 31, 31, size, op);
  764. sja1105_packing(buf, &entry->ingress, 30, 30, size, op);
  765. return size;
  766. }
  767. static size_t sja1105_vlan_lookup_entry_packing(void *buf, void *entry_ptr,
  768. enum packing_op op)
  769. {
  770. const size_t size = SJA1105_SIZE_VLAN_LOOKUP_ENTRY;
  771. struct sja1105_vlan_lookup_entry *entry = entry_ptr;
  772. sja1105_packing(buf, &entry->vmemb_port, 53, 49, size, op);
  773. sja1105_packing(buf, &entry->vlan_bc, 48, 44, size, op);
  774. sja1105_packing(buf, &entry->tag_port, 43, 39, size, op);
  775. sja1105_packing(buf, &entry->vlanid, 38, 27, size, op);
  776. return size;
  777. }
  778. static size_t sja1110_vlan_lookup_entry_packing(void *buf, void *entry_ptr,
  779. enum packing_op op)
  780. {
  781. struct sja1105_vlan_lookup_entry *entry = entry_ptr;
  782. const size_t size = SJA1110_SIZE_VLAN_LOOKUP_ENTRY;
  783. sja1105_packing(buf, &entry->vmemb_port, 73, 63, size, op);
  784. sja1105_packing(buf, &entry->vlan_bc, 62, 52, size, op);
  785. sja1105_packing(buf, &entry->tag_port, 51, 41, size, op);
  786. sja1105_packing(buf, &entry->type_entry, 40, 39, size, op);
  787. sja1105_packing(buf, &entry->vlanid, 38, 27, size, op);
  788. return size;
  789. }
  790. static size_t sja1105_xmii_params_entry_packing(void *buf, void *entry_ptr,
  791. enum packing_op op)
  792. {
  793. const size_t size = SJA1105_SIZE_XMII_PARAMS_ENTRY;
  794. struct sja1105_xmii_params_entry *entry = entry_ptr;
  795. int offset, i;
  796. for (i = 0, offset = 17; i < SJA1105_NUM_PORTS; i++, offset += 3) {
  797. sja1105_packing(buf, &entry->xmii_mode[i],
  798. offset + 1, offset + 0, size, op);
  799. sja1105_packing(buf, &entry->phy_mac[i],
  800. offset + 2, offset + 2, size, op);
  801. }
  802. return size;
  803. }
  804. static size_t sja1110_xmii_params_entry_packing(void *buf, void *entry_ptr,
  805. enum packing_op op)
  806. {
  807. const size_t size = SJA1110_SIZE_XMII_PARAMS_ENTRY;
  808. struct sja1105_xmii_params_entry *entry = entry_ptr;
  809. int offset, i;
  810. for (i = 0, offset = 20; i < SJA1110_NUM_PORTS; i++, offset += 4) {
  811. sja1105_packing(buf, &entry->xmii_mode[i],
  812. offset + 1, offset + 0, size, op);
  813. sja1105_packing(buf, &entry->phy_mac[i],
  814. offset + 2, offset + 2, size, op);
  815. sja1105_packing(buf, &entry->special[i],
  816. offset + 3, offset + 3, size, op);
  817. }
  818. return size;
  819. }
  820. static size_t sja1105_table_header_packing(void *buf, void *entry_ptr,
  821. enum packing_op op)
  822. {
  823. const size_t size = SJA1105_SIZE_TABLE_HEADER;
  824. struct sja1105_table_header *entry = entry_ptr;
  825. sja1105_packing(buf, &entry->block_id, 31, 24, size, op);
  826. sja1105_packing(buf, &entry->len, 55, 32, size, op);
  827. sja1105_packing(buf, &entry->crc, 95, 64, size, op);
  828. return size;
  829. }
  830. static void
  831. sja1105_table_header_pack_with_crc(void *buf, struct sja1105_table_header *hdr)
  832. {
  833. /* First pack the table as-is, then calculate the CRC, and
  834. * finally put the proper CRC into the packed buffer
  835. */
  836. memset(buf, 0, SJA1105_SIZE_TABLE_HEADER);
  837. sja1105_table_header_packing(buf, hdr, PACK);
  838. hdr->crc = sja1105_crc32(buf, SJA1105_SIZE_TABLE_HEADER - 4);
  839. sja1105_packing(buf + SJA1105_SIZE_TABLE_HEADER - 4, &hdr->crc,
  840. 31, 0, 4, PACK);
  841. }
  842. static void sja1105_table_write_crc(u8 *table_start, u8 *crc_ptr)
  843. {
  844. u64 computed_crc;
  845. int len_bytes;
  846. len_bytes = (uintptr_t)(crc_ptr - table_start);
  847. computed_crc = sja1105_crc32(table_start, len_bytes);
  848. sja1105_packing(crc_ptr, &computed_crc, 31, 0, 4, PACK);
  849. }
  850. /* The block IDs that the switches support are unfortunately sparse, so keep a
  851. * mapping table to "block indices" and translate back and forth.
  852. */
  853. static const u64 blk_id_map[BLK_IDX_MAX] = {
  854. [BLK_IDX_L2_POLICING] = BLKID_L2_POLICING,
  855. [BLK_IDX_VLAN_LOOKUP] = BLKID_VLAN_LOOKUP,
  856. [BLK_IDX_L2_FORWARDING] = BLKID_L2_FORWARDING,
  857. [BLK_IDX_MAC_CONFIG] = BLKID_MAC_CONFIG,
  858. [BLK_IDX_L2_FORWARDING_PARAMS] = BLKID_L2_FORWARDING_PARAMS,
  859. [BLK_IDX_GENERAL_PARAMS] = BLKID_GENERAL_PARAMS,
  860. [BLK_IDX_XMII_PARAMS] = BLKID_XMII_PARAMS,
  861. };
  862. static void
  863. sja1105_static_config_pack(void *buf, struct sja1105_static_config *config)
  864. {
  865. struct sja1105_table_header header = {0};
  866. enum sja1105_blk_idx i;
  867. u8 *p = buf;
  868. int j;
  869. sja1105_packing(p, &config->device_id, 31, 0, 4, PACK);
  870. p += SJA1105_SIZE_DEVICE_ID;
  871. for (i = 0; i < BLK_IDX_MAX; i++) {
  872. const struct sja1105_table *table;
  873. u8 *table_start;
  874. table = &config->tables[i];
  875. if (!table->entry_count)
  876. continue;
  877. header.block_id = blk_id_map[i];
  878. header.len = table->entry_count *
  879. table->ops->packed_entry_size / 4;
  880. sja1105_table_header_pack_with_crc(p, &header);
  881. p += SJA1105_SIZE_TABLE_HEADER;
  882. table_start = p;
  883. for (j = 0; j < table->entry_count; j++) {
  884. u8 *entry_ptr = table->entries;
  885. entry_ptr += j * table->ops->unpacked_entry_size;
  886. memset(p, 0, table->ops->packed_entry_size);
  887. table->ops->packing(p, entry_ptr, PACK);
  888. p += table->ops->packed_entry_size;
  889. }
  890. sja1105_table_write_crc(table_start, p);
  891. p += 4;
  892. }
  893. /* Final header:
  894. * Block ID does not matter
  895. * Length of 0 marks that header is final
  896. * CRC will be replaced on-the-fly
  897. */
  898. header.block_id = 0;
  899. header.len = 0;
  900. header.crc = 0xDEADBEEF;
  901. memset(p, 0, SJA1105_SIZE_TABLE_HEADER);
  902. sja1105_table_header_packing(p, &header, PACK);
  903. }
  904. static size_t
  905. sja1105_static_config_get_length(const struct sja1105_static_config *config)
  906. {
  907. unsigned int header_count;
  908. enum sja1105_blk_idx i;
  909. unsigned int sum;
  910. /* Ending header */
  911. header_count = 1;
  912. sum = SJA1105_SIZE_DEVICE_ID;
  913. /* Tables (headers and entries) */
  914. for (i = 0; i < BLK_IDX_MAX; i++) {
  915. const struct sja1105_table *table;
  916. table = &config->tables[i];
  917. if (table->entry_count)
  918. header_count++;
  919. sum += table->ops->packed_entry_size * table->entry_count;
  920. }
  921. /* Headers have an additional CRC at the end */
  922. sum += header_count * (SJA1105_SIZE_TABLE_HEADER + 4);
  923. /* Last header does not have an extra CRC because there is no data */
  924. sum -= 4;
  925. return sum;
  926. }
  927. /* Compatibility matrices */
  928. static const struct sja1105_table_ops sja1105et_table_ops[BLK_IDX_MAX] = {
  929. [BLK_IDX_L2_POLICING] = {
  930. .packing = sja1105_l2_policing_entry_packing,
  931. .unpacked_entry_size = sizeof(struct sja1105_l2_policing_entry),
  932. .packed_entry_size = SJA1105_SIZE_L2_POLICING_ENTRY,
  933. .max_entry_count = SJA1105_MAX_L2_POLICING_COUNT,
  934. },
  935. [BLK_IDX_VLAN_LOOKUP] = {
  936. .packing = sja1105_vlan_lookup_entry_packing,
  937. .unpacked_entry_size = sizeof(struct sja1105_vlan_lookup_entry),
  938. .packed_entry_size = SJA1105_SIZE_VLAN_LOOKUP_ENTRY,
  939. .max_entry_count = SJA1105_MAX_VLAN_LOOKUP_COUNT,
  940. },
  941. [BLK_IDX_L2_FORWARDING] = {
  942. .packing = sja1105_l2_forwarding_entry_packing,
  943. .unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_entry),
  944. .packed_entry_size = SJA1105_SIZE_L2_FORWARDING_ENTRY,
  945. .max_entry_count = SJA1105_MAX_L2_FORWARDING_COUNT,
  946. },
  947. [BLK_IDX_MAC_CONFIG] = {
  948. .packing = sja1105et_mac_config_entry_packing,
  949. .unpacked_entry_size = sizeof(struct sja1105_mac_config_entry),
  950. .packed_entry_size = SJA1105ET_SIZE_MAC_CONFIG_ENTRY,
  951. .max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT,
  952. },
  953. [BLK_IDX_L2_FORWARDING_PARAMS] = {
  954. .packing = sja1105_l2_forwarding_params_entry_packing,
  955. .unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_params_entry),
  956. .packed_entry_size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY,
  957. .max_entry_count = SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT,
  958. },
  959. [BLK_IDX_GENERAL_PARAMS] = {
  960. .packing = sja1105et_general_params_entry_packing,
  961. .unpacked_entry_size = sizeof(struct sja1105_general_params_entry),
  962. .packed_entry_size = SJA1105ET_SIZE_GENERAL_PARAMS_ENTRY,
  963. .max_entry_count = SJA1105_MAX_GENERAL_PARAMS_COUNT,
  964. },
  965. [BLK_IDX_XMII_PARAMS] = {
  966. .packing = sja1105_xmii_params_entry_packing,
  967. .unpacked_entry_size = sizeof(struct sja1105_xmii_params_entry),
  968. .packed_entry_size = SJA1105_SIZE_XMII_PARAMS_ENTRY,
  969. .max_entry_count = SJA1105_MAX_XMII_PARAMS_COUNT,
  970. },
  971. };
  972. static const struct sja1105_table_ops sja1105pqrs_table_ops[BLK_IDX_MAX] = {
  973. [BLK_IDX_L2_POLICING] = {
  974. .packing = sja1105_l2_policing_entry_packing,
  975. .unpacked_entry_size = sizeof(struct sja1105_l2_policing_entry),
  976. .packed_entry_size = SJA1105_SIZE_L2_POLICING_ENTRY,
  977. .max_entry_count = SJA1105_MAX_L2_POLICING_COUNT,
  978. },
  979. [BLK_IDX_VLAN_LOOKUP] = {
  980. .packing = sja1105_vlan_lookup_entry_packing,
  981. .unpacked_entry_size = sizeof(struct sja1105_vlan_lookup_entry),
  982. .packed_entry_size = SJA1105_SIZE_VLAN_LOOKUP_ENTRY,
  983. .max_entry_count = SJA1105_MAX_VLAN_LOOKUP_COUNT,
  984. },
  985. [BLK_IDX_L2_FORWARDING] = {
  986. .packing = sja1105_l2_forwarding_entry_packing,
  987. .unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_entry),
  988. .packed_entry_size = SJA1105_SIZE_L2_FORWARDING_ENTRY,
  989. .max_entry_count = SJA1105_MAX_L2_FORWARDING_COUNT,
  990. },
  991. [BLK_IDX_MAC_CONFIG] = {
  992. .packing = sja1105pqrs_mac_config_entry_packing,
  993. .unpacked_entry_size = sizeof(struct sja1105_mac_config_entry),
  994. .packed_entry_size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY,
  995. .max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT,
  996. },
  997. [BLK_IDX_L2_FORWARDING_PARAMS] = {
  998. .packing = sja1105_l2_forwarding_params_entry_packing,
  999. .unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_params_entry),
  1000. .packed_entry_size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY,
  1001. .max_entry_count = SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT,
  1002. },
  1003. [BLK_IDX_GENERAL_PARAMS] = {
  1004. .packing = sja1105pqrs_general_params_entry_packing,
  1005. .unpacked_entry_size = sizeof(struct sja1105_general_params_entry),
  1006. .packed_entry_size = SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY,
  1007. .max_entry_count = SJA1105_MAX_GENERAL_PARAMS_COUNT,
  1008. },
  1009. [BLK_IDX_XMII_PARAMS] = {
  1010. .packing = sja1105_xmii_params_entry_packing,
  1011. .unpacked_entry_size = sizeof(struct sja1105_xmii_params_entry),
  1012. .packed_entry_size = SJA1105_SIZE_XMII_PARAMS_ENTRY,
  1013. .max_entry_count = SJA1105_MAX_XMII_PARAMS_COUNT,
  1014. },
  1015. };
  1016. static const struct sja1105_table_ops sja1110_table_ops[BLK_IDX_MAX] = {
  1017. [BLK_IDX_L2_POLICING] = {
  1018. .packing = sja1110_l2_policing_entry_packing,
  1019. .unpacked_entry_size = sizeof(struct sja1105_l2_policing_entry),
  1020. .packed_entry_size = SJA1105_SIZE_L2_POLICING_ENTRY,
  1021. .max_entry_count = SJA1110_MAX_L2_POLICING_COUNT,
  1022. },
  1023. [BLK_IDX_VLAN_LOOKUP] = {
  1024. .packing = sja1110_vlan_lookup_entry_packing,
  1025. .unpacked_entry_size = sizeof(struct sja1105_vlan_lookup_entry),
  1026. .packed_entry_size = SJA1110_SIZE_VLAN_LOOKUP_ENTRY,
  1027. .max_entry_count = SJA1105_MAX_VLAN_LOOKUP_COUNT,
  1028. },
  1029. [BLK_IDX_L2_FORWARDING] = {
  1030. .packing = sja1110_l2_forwarding_entry_packing,
  1031. .unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_entry),
  1032. .packed_entry_size = SJA1105_SIZE_L2_FORWARDING_ENTRY,
  1033. .max_entry_count = SJA1110_MAX_L2_FORWARDING_COUNT,
  1034. },
  1035. [BLK_IDX_MAC_CONFIG] = {
  1036. .packing = sja1110_mac_config_entry_packing,
  1037. .unpacked_entry_size = sizeof(struct sja1105_mac_config_entry),
  1038. .packed_entry_size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY,
  1039. .max_entry_count = SJA1110_MAX_MAC_CONFIG_COUNT,
  1040. },
  1041. [BLK_IDX_L2_FORWARDING_PARAMS] = {
  1042. .packing = sja1110_l2_forwarding_params_entry_packing,
  1043. .unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_params_entry),
  1044. .packed_entry_size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY,
  1045. .max_entry_count = SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT,
  1046. },
  1047. [BLK_IDX_GENERAL_PARAMS] = {
  1048. .packing = sja1110_general_params_entry_packing,
  1049. .unpacked_entry_size = sizeof(struct sja1105_general_params_entry),
  1050. .packed_entry_size = SJA1110_SIZE_GENERAL_PARAMS_ENTRY,
  1051. .max_entry_count = SJA1105_MAX_GENERAL_PARAMS_COUNT,
  1052. },
  1053. [BLK_IDX_XMII_PARAMS] = {
  1054. .packing = sja1110_xmii_params_entry_packing,
  1055. .unpacked_entry_size = sizeof(struct sja1105_xmii_params_entry),
  1056. .packed_entry_size = SJA1110_SIZE_XMII_PARAMS_ENTRY,
  1057. .max_entry_count = SJA1105_MAX_XMII_PARAMS_COUNT,
  1058. },
  1059. };
  1060. static int sja1105_init_mii_settings(struct sja1105_private *priv)
  1061. {
  1062. struct sja1105_table *table;
  1063. table = &priv->static_config.tables[BLK_IDX_XMII_PARAMS];
  1064. table->entries = calloc(SJA1105_MAX_XMII_PARAMS_COUNT,
  1065. table->ops->unpacked_entry_size);
  1066. if (!table->entries)
  1067. return -ENOMEM;
  1068. /* Table will be populated at runtime */
  1069. table->entry_count = SJA1105_MAX_XMII_PARAMS_COUNT;
  1070. return 0;
  1071. }
  1072. static void sja1105_setup_tagging(struct sja1105_private *priv, int port)
  1073. {
  1074. struct dsa_pdata *pdata = dev_get_uclass_plat(priv->dev);
  1075. struct sja1105_vlan_lookup_entry *vlan;
  1076. int cpu = pdata->cpu_port;
  1077. /* The CPU port is implicitly configured by
  1078. * configuring the front-panel ports
  1079. */
  1080. if (port == cpu)
  1081. return;
  1082. vlan = priv->static_config.tables[BLK_IDX_VLAN_LOOKUP].entries;
  1083. priv->pvid[port] = DSA_8021Q_DIR_TX | DSA_8021Q_PORT(port);
  1084. vlan[port].vmemb_port = BIT(port) | BIT(cpu);
  1085. vlan[port].vlan_bc = BIT(port) | BIT(cpu);
  1086. vlan[port].tag_port = BIT(cpu);
  1087. vlan[port].vlanid = priv->pvid[port];
  1088. vlan[port].type_entry = SJA1110_VLAN_D_TAG;
  1089. }
  1090. static int sja1105_init_vlan(struct sja1105_private *priv)
  1091. {
  1092. struct dsa_pdata *pdata = dev_get_uclass_plat(priv->dev);
  1093. struct sja1105_table *table;
  1094. int port;
  1095. table = &priv->static_config.tables[BLK_IDX_VLAN_LOOKUP];
  1096. table->entries = calloc(pdata->num_ports,
  1097. table->ops->unpacked_entry_size);
  1098. if (!table->entries)
  1099. return -ENOMEM;
  1100. table->entry_count = pdata->num_ports;
  1101. for (port = 0; port < pdata->num_ports; port++)
  1102. sja1105_setup_tagging(priv, port);
  1103. return 0;
  1104. }
  1105. static void
  1106. sja1105_port_allow_traffic(struct sja1105_l2_forwarding_entry *l2_fwd,
  1107. int from, int to)
  1108. {
  1109. l2_fwd[from].bc_domain |= BIT(to);
  1110. l2_fwd[from].reach_port |= BIT(to);
  1111. l2_fwd[from].fl_domain |= BIT(to);
  1112. }
  1113. static int sja1105_init_l2_forwarding(struct sja1105_private *priv)
  1114. {
  1115. struct dsa_pdata *pdata = dev_get_uclass_plat(priv->dev);
  1116. struct sja1105_l2_forwarding_entry *l2fwd;
  1117. struct sja1105_table *table;
  1118. int cpu = pdata->cpu_port;
  1119. int i;
  1120. table = &priv->static_config.tables[BLK_IDX_L2_FORWARDING];
  1121. table->entries = calloc(SJA1105_MAX_L2_FORWARDING_COUNT,
  1122. table->ops->unpacked_entry_size);
  1123. if (!table->entries)
  1124. return -ENOMEM;
  1125. table->entry_count = SJA1105_MAX_L2_FORWARDING_COUNT;
  1126. l2fwd = table->entries;
  1127. /* First 5 entries define the forwarding rules */
  1128. for (i = 0; i < pdata->num_ports; i++) {
  1129. if (i == cpu)
  1130. continue;
  1131. sja1105_port_allow_traffic(l2fwd, i, cpu);
  1132. sja1105_port_allow_traffic(l2fwd, cpu, i);
  1133. }
  1134. /* Next 8 entries define VLAN PCP mapping from ingress to egress.
  1135. * Leave them unpopulated (implicitly 0) but present.
  1136. */
  1137. return 0;
  1138. }
  1139. static int sja1105_init_l2_forwarding_params(struct sja1105_private *priv)
  1140. {
  1141. struct sja1105_l2_forwarding_params_entry default_l2fwd_params = {
  1142. /* Use a single memory partition for all ingress queues */
  1143. .part_spc = { SJA1105_MAX_FRAME_MEMORY, 0, 0, 0, 0, 0, 0, 0 },
  1144. };
  1145. struct sja1105_table *table;
  1146. table = &priv->static_config.tables[BLK_IDX_L2_FORWARDING_PARAMS];
  1147. table->entries = calloc(SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT,
  1148. table->ops->unpacked_entry_size);
  1149. if (!table->entries)
  1150. return -ENOMEM;
  1151. table->entry_count = SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT;
  1152. /* This table only has a single entry */
  1153. ((struct sja1105_l2_forwarding_params_entry *)table->entries)[0] =
  1154. default_l2fwd_params;
  1155. return 0;
  1156. }
  1157. static int sja1105_init_general_params(struct sja1105_private *priv)
  1158. {
  1159. struct dsa_pdata *pdata = dev_get_uclass_plat(priv->dev);
  1160. struct sja1105_general_params_entry default_general_params = {
  1161. /* No frame trapping */
  1162. .mac_fltres1 = 0x0,
  1163. .mac_flt1 = 0xffffffffffff,
  1164. .mac_fltres0 = 0x0,
  1165. .mac_flt0 = 0xffffffffffff,
  1166. .host_port = pdata->num_ports,
  1167. /* No mirroring => specify an out-of-range port value */
  1168. .mirr_port = pdata->num_ports,
  1169. /* No link-local trapping => specify an out-of-range port value
  1170. */
  1171. .casc_port = pdata->num_ports,
  1172. /* Force the switch to see all traffic as untagged. */
  1173. .tpid = ETH_P_SJA1105,
  1174. .tpid2 = ETH_P_SJA1105,
  1175. };
  1176. struct sja1105_table *table;
  1177. table = &priv->static_config.tables[BLK_IDX_GENERAL_PARAMS];
  1178. table->entries = calloc(SJA1105_MAX_GENERAL_PARAMS_COUNT,
  1179. table->ops->unpacked_entry_size);
  1180. if (!table->entries)
  1181. return -ENOMEM;
  1182. table->entry_count = SJA1105_MAX_GENERAL_PARAMS_COUNT;
  1183. /* This table only has a single entry */
  1184. ((struct sja1105_general_params_entry *)table->entries)[0] =
  1185. default_general_params;
  1186. return 0;
  1187. }
  1188. static void sja1105_setup_policer(struct sja1105_l2_policing_entry *policing,
  1189. int index, int mtu)
  1190. {
  1191. policing[index].sharindx = index;
  1192. policing[index].smax = 65535; /* Burst size in bytes */
  1193. policing[index].rate = SJA1105_RATE_MBPS(1000);
  1194. policing[index].maxlen = mtu;
  1195. policing[index].partition = 0;
  1196. }
  1197. static int sja1105_init_l2_policing(struct sja1105_private *priv)
  1198. {
  1199. struct dsa_pdata *pdata = dev_get_uclass_plat(priv->dev);
  1200. struct sja1105_l2_policing_entry *policing;
  1201. struct sja1105_table *table;
  1202. int cpu = pdata->cpu_port;
  1203. int i, j, k;
  1204. table = &priv->static_config.tables[BLK_IDX_L2_POLICING];
  1205. table->entries = calloc(SJA1105_MAX_L2_POLICING_COUNT,
  1206. table->ops->unpacked_entry_size);
  1207. if (!table->entries)
  1208. return -ENOMEM;
  1209. table->entry_count = SJA1105_MAX_L2_POLICING_COUNT;
  1210. policing = table->entries;
  1211. /* k sweeps through all unicast policers (0-39).
  1212. * bcast sweeps through policers 40-44.
  1213. */
  1214. for (i = 0, k = 0; i < pdata->num_ports; i++) {
  1215. int bcast = (pdata->num_ports * SJA1105_NUM_TC) + i;
  1216. int mtu = VLAN_ETH_FRAME_LEN + ETH_FCS_LEN;
  1217. if (i == cpu)
  1218. mtu += VLAN_HLEN;
  1219. for (j = 0; j < SJA1105_NUM_TC; j++, k++)
  1220. sja1105_setup_policer(policing, k, mtu);
  1221. /* Set up this port's policer for broadcast traffic */
  1222. sja1105_setup_policer(policing, bcast, mtu);
  1223. }
  1224. return 0;
  1225. }
  1226. static int sja1105_init_mac_settings(struct sja1105_private *priv)
  1227. {
  1228. struct sja1105_mac_config_entry default_mac = {
  1229. /* Enable 1 priority queue on egress. */
  1230. .top = {0x1FF, 0, 0, 0, 0, 0, 0},
  1231. .base = {0x0, 0, 0, 0, 0, 0, 0, 0},
  1232. .enabled = {1, 0, 0, 0, 0, 0, 0, 0},
  1233. /* Will be overridden in sja1105_port_enable. */
  1234. .speed = priv->info->port_speed[SJA1105_SPEED_AUTO],
  1235. .egress = true,
  1236. .ingress = true,
  1237. };
  1238. struct dsa_pdata *pdata = dev_get_uclass_plat(priv->dev);
  1239. struct sja1105_mac_config_entry *mac;
  1240. struct sja1105_table *table;
  1241. int port;
  1242. table = &priv->static_config.tables[BLK_IDX_MAC_CONFIG];
  1243. table->entries = calloc(pdata->num_ports,
  1244. table->ops->unpacked_entry_size);
  1245. if (!table->entries)
  1246. return -ENOMEM;
  1247. table->entry_count = pdata->num_ports;
  1248. mac = table->entries;
  1249. for (port = 0; port < pdata->num_ports; port++) {
  1250. mac[port] = default_mac;
  1251. /* Internal VLAN (pvid) to apply to untagged ingress */
  1252. mac[port].vlanid = priv->pvid[port];
  1253. }
  1254. return 0;
  1255. }
  1256. static int sja1105_static_config_init(struct sja1105_private *priv)
  1257. {
  1258. struct sja1105_static_config *config = &priv->static_config;
  1259. const struct sja1105_table_ops *static_ops = priv->info->static_ops;
  1260. u64 device_id = priv->info->device_id;
  1261. enum sja1105_blk_idx i;
  1262. int rc;
  1263. *config = (struct sja1105_static_config) {0};
  1264. /* Transfer static_ops array from priv into per-table ops
  1265. * for handier access
  1266. */
  1267. for (i = 0; i < BLK_IDX_MAX; i++)
  1268. config->tables[i].ops = &static_ops[i];
  1269. config->device_id = device_id;
  1270. /* Build initial static configuration, to be fixed up during runtime */
  1271. rc = sja1105_init_vlan(priv);
  1272. if (rc < 0)
  1273. return rc;
  1274. rc = sja1105_init_mac_settings(priv);
  1275. if (rc < 0)
  1276. return rc;
  1277. rc = sja1105_init_mii_settings(priv);
  1278. if (rc < 0)
  1279. return rc;
  1280. rc = sja1105_init_l2_forwarding(priv);
  1281. if (rc < 0)
  1282. return rc;
  1283. rc = sja1105_init_l2_forwarding_params(priv);
  1284. if (rc < 0)
  1285. return rc;
  1286. rc = sja1105_init_l2_policing(priv);
  1287. if (rc < 0)
  1288. return rc;
  1289. rc = sja1105_init_general_params(priv);
  1290. if (rc < 0)
  1291. return rc;
  1292. return 0;
  1293. }
  1294. static void sja1105_static_config_free(struct sja1105_static_config *config)
  1295. {
  1296. enum sja1105_blk_idx i;
  1297. for (i = 0; i < BLK_IDX_MAX; i++) {
  1298. if (config->tables[i].entry_count) {
  1299. free(config->tables[i].entries);
  1300. config->tables[i].entry_count = 0;
  1301. }
  1302. }
  1303. }
  1304. static void sja1105_cgu_idiv_packing(void *buf, struct sja1105_cgu_idiv *idiv,
  1305. enum packing_op op)
  1306. {
  1307. const int size = 4;
  1308. sja1105_packing(buf, &idiv->clksrc, 28, 24, size, op);
  1309. sja1105_packing(buf, &idiv->autoblock, 11, 11, size, op);
  1310. sja1105_packing(buf, &idiv->idiv, 5, 2, size, op);
  1311. sja1105_packing(buf, &idiv->pd, 0, 0, size, op);
  1312. }
  1313. static int sja1105_cgu_idiv_config(struct sja1105_private *priv, int port,
  1314. bool enabled, int factor)
  1315. {
  1316. const struct sja1105_regs *regs = priv->info->regs;
  1317. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  1318. struct sja1105_cgu_idiv idiv;
  1319. if (regs->cgu_idiv[port] == SJA1105_RSV_ADDR)
  1320. return 0;
  1321. if (enabled && factor != 1 && factor != 10)
  1322. return -ERANGE;
  1323. /* Payload for packed_buf */
  1324. idiv.clksrc = 0x0A; /* 25MHz */
  1325. idiv.autoblock = 1; /* Block clk automatically */
  1326. idiv.idiv = factor - 1; /* Divide by 1 or 10 */
  1327. idiv.pd = enabled ? 0 : 1; /* Power down? */
  1328. sja1105_cgu_idiv_packing(packed_buf, &idiv, PACK);
  1329. return sja1105_xfer_buf(priv, SPI_WRITE, regs->cgu_idiv[port],
  1330. packed_buf, SJA1105_SIZE_CGU_CMD);
  1331. }
  1332. static void
  1333. sja1105_cgu_mii_control_packing(void *buf, struct sja1105_cgu_mii_ctrl *cmd,
  1334. enum packing_op op)
  1335. {
  1336. const int size = 4;
  1337. sja1105_packing(buf, &cmd->clksrc, 28, 24, size, op);
  1338. sja1105_packing(buf, &cmd->autoblock, 11, 11, size, op);
  1339. sja1105_packing(buf, &cmd->pd, 0, 0, size, op);
  1340. }
  1341. static int sja1105_cgu_mii_tx_clk_config(struct sja1105_private *priv,
  1342. int port, sja1105_mii_role_t role)
  1343. {
  1344. const struct sja1105_regs *regs = priv->info->regs;
  1345. struct sja1105_cgu_mii_ctrl mii_tx_clk;
  1346. const int mac_clk_sources[] = {
  1347. CLKSRC_MII0_TX_CLK,
  1348. CLKSRC_MII1_TX_CLK,
  1349. CLKSRC_MII2_TX_CLK,
  1350. CLKSRC_MII3_TX_CLK,
  1351. CLKSRC_MII4_TX_CLK,
  1352. };
  1353. const int phy_clk_sources[] = {
  1354. CLKSRC_IDIV0,
  1355. CLKSRC_IDIV1,
  1356. CLKSRC_IDIV2,
  1357. CLKSRC_IDIV3,
  1358. CLKSRC_IDIV4,
  1359. };
  1360. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  1361. int clksrc;
  1362. if (regs->mii_tx_clk[port] == SJA1105_RSV_ADDR)
  1363. return 0;
  1364. if (role == XMII_MAC)
  1365. clksrc = mac_clk_sources[port];
  1366. else
  1367. clksrc = phy_clk_sources[port];
  1368. /* Payload for packed_buf */
  1369. mii_tx_clk.clksrc = clksrc;
  1370. mii_tx_clk.autoblock = 1; /* Autoblock clk while changing clksrc */
  1371. mii_tx_clk.pd = 0; /* Power Down off => enabled */
  1372. sja1105_cgu_mii_control_packing(packed_buf, &mii_tx_clk, PACK);
  1373. return sja1105_xfer_buf(priv, SPI_WRITE, regs->mii_tx_clk[port],
  1374. packed_buf, SJA1105_SIZE_CGU_CMD);
  1375. }
  1376. static int
  1377. sja1105_cgu_mii_rx_clk_config(struct sja1105_private *priv, int port)
  1378. {
  1379. const struct sja1105_regs *regs = priv->info->regs;
  1380. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  1381. struct sja1105_cgu_mii_ctrl mii_rx_clk;
  1382. const int clk_sources[] = {
  1383. CLKSRC_MII0_RX_CLK,
  1384. CLKSRC_MII1_RX_CLK,
  1385. CLKSRC_MII2_RX_CLK,
  1386. CLKSRC_MII3_RX_CLK,
  1387. CLKSRC_MII4_RX_CLK,
  1388. };
  1389. if (regs->mii_rx_clk[port] == SJA1105_RSV_ADDR)
  1390. return 0;
  1391. /* Payload for packed_buf */
  1392. mii_rx_clk.clksrc = clk_sources[port];
  1393. mii_rx_clk.autoblock = 1; /* Autoblock clk while changing clksrc */
  1394. mii_rx_clk.pd = 0; /* Power Down off => enabled */
  1395. sja1105_cgu_mii_control_packing(packed_buf, &mii_rx_clk, PACK);
  1396. return sja1105_xfer_buf(priv, SPI_WRITE, regs->mii_rx_clk[port],
  1397. packed_buf, SJA1105_SIZE_CGU_CMD);
  1398. }
  1399. static int
  1400. sja1105_cgu_mii_ext_tx_clk_config(struct sja1105_private *priv, int port)
  1401. {
  1402. const struct sja1105_regs *regs = priv->info->regs;
  1403. struct sja1105_cgu_mii_ctrl mii_ext_tx_clk;
  1404. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  1405. const int clk_sources[] = {
  1406. CLKSRC_IDIV0,
  1407. CLKSRC_IDIV1,
  1408. CLKSRC_IDIV2,
  1409. CLKSRC_IDIV3,
  1410. CLKSRC_IDIV4,
  1411. };
  1412. if (regs->mii_ext_tx_clk[port] == SJA1105_RSV_ADDR)
  1413. return 0;
  1414. /* Payload for packed_buf */
  1415. mii_ext_tx_clk.clksrc = clk_sources[port];
  1416. mii_ext_tx_clk.autoblock = 1; /* Autoblock clk while changing clksrc */
  1417. mii_ext_tx_clk.pd = 0; /* Power Down off => enabled */
  1418. sja1105_cgu_mii_control_packing(packed_buf, &mii_ext_tx_clk, PACK);
  1419. return sja1105_xfer_buf(priv, SPI_WRITE, regs->mii_ext_tx_clk[port],
  1420. packed_buf, SJA1105_SIZE_CGU_CMD);
  1421. }
  1422. static int
  1423. sja1105_cgu_mii_ext_rx_clk_config(struct sja1105_private *priv, int port)
  1424. {
  1425. const struct sja1105_regs *regs = priv->info->regs;
  1426. struct sja1105_cgu_mii_ctrl mii_ext_rx_clk;
  1427. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  1428. const int clk_sources[] = {
  1429. CLKSRC_IDIV0,
  1430. CLKSRC_IDIV1,
  1431. CLKSRC_IDIV2,
  1432. CLKSRC_IDIV3,
  1433. CLKSRC_IDIV4,
  1434. };
  1435. if (regs->mii_ext_rx_clk[port] == SJA1105_RSV_ADDR)
  1436. return 0;
  1437. /* Payload for packed_buf */
  1438. mii_ext_rx_clk.clksrc = clk_sources[port];
  1439. mii_ext_rx_clk.autoblock = 1; /* Autoblock clk while changing clksrc */
  1440. mii_ext_rx_clk.pd = 0; /* Power Down off => enabled */
  1441. sja1105_cgu_mii_control_packing(packed_buf, &mii_ext_rx_clk, PACK);
  1442. return sja1105_xfer_buf(priv, SPI_WRITE, regs->mii_ext_rx_clk[port],
  1443. packed_buf, SJA1105_SIZE_CGU_CMD);
  1444. }
  1445. static int sja1105_mii_clocking_setup(struct sja1105_private *priv, int port,
  1446. sja1105_mii_role_t role)
  1447. {
  1448. int rc;
  1449. rc = sja1105_cgu_idiv_config(priv, port, (role == XMII_PHY), 1);
  1450. if (rc < 0)
  1451. return rc;
  1452. rc = sja1105_cgu_mii_tx_clk_config(priv, port, role);
  1453. if (rc < 0)
  1454. return rc;
  1455. rc = sja1105_cgu_mii_rx_clk_config(priv, port);
  1456. if (rc < 0)
  1457. return rc;
  1458. if (role == XMII_PHY) {
  1459. rc = sja1105_cgu_mii_ext_tx_clk_config(priv, port);
  1460. if (rc < 0)
  1461. return rc;
  1462. rc = sja1105_cgu_mii_ext_rx_clk_config(priv, port);
  1463. if (rc < 0)
  1464. return rc;
  1465. }
  1466. return 0;
  1467. }
  1468. static void
  1469. sja1105_cgu_pll_control_packing(void *buf, struct sja1105_cgu_pll_ctrl *cmd,
  1470. enum packing_op op)
  1471. {
  1472. const int size = 4;
  1473. sja1105_packing(buf, &cmd->pllclksrc, 28, 24, size, op);
  1474. sja1105_packing(buf, &cmd->msel, 23, 16, size, op);
  1475. sja1105_packing(buf, &cmd->autoblock, 11, 11, size, op);
  1476. sja1105_packing(buf, &cmd->psel, 9, 8, size, op);
  1477. sja1105_packing(buf, &cmd->direct, 7, 7, size, op);
  1478. sja1105_packing(buf, &cmd->fbsel, 6, 6, size, op);
  1479. sja1105_packing(buf, &cmd->bypass, 1, 1, size, op);
  1480. sja1105_packing(buf, &cmd->pd, 0, 0, size, op);
  1481. }
  1482. static int sja1105_cgu_rgmii_tx_clk_config(struct sja1105_private *priv,
  1483. int port, u64 speed)
  1484. {
  1485. const struct sja1105_regs *regs = priv->info->regs;
  1486. struct sja1105_cgu_mii_ctrl txc;
  1487. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  1488. int clksrc;
  1489. if (regs->rgmii_tx_clk[port] == SJA1105_RSV_ADDR)
  1490. return 0;
  1491. if (speed == priv->info->port_speed[SJA1105_SPEED_1000MBPS]) {
  1492. clksrc = CLKSRC_PLL0;
  1493. } else {
  1494. int clk_sources[] = {CLKSRC_IDIV0, CLKSRC_IDIV1, CLKSRC_IDIV2,
  1495. CLKSRC_IDIV3, CLKSRC_IDIV4};
  1496. clksrc = clk_sources[port];
  1497. }
  1498. /* RGMII: 125MHz for 1000, 25MHz for 100, 2.5MHz for 10 */
  1499. txc.clksrc = clksrc;
  1500. /* Autoblock clk while changing clksrc */
  1501. txc.autoblock = 1;
  1502. /* Power Down off => enabled */
  1503. txc.pd = 0;
  1504. sja1105_cgu_mii_control_packing(packed_buf, &txc, PACK);
  1505. return sja1105_xfer_buf(priv, SPI_WRITE, regs->rgmii_tx_clk[port],
  1506. packed_buf, SJA1105_SIZE_CGU_CMD);
  1507. }
  1508. /* AGU */
  1509. static void
  1510. sja1105_cfg_pad_mii_packing(void *buf, struct sja1105_cfg_pad_mii *cmd,
  1511. enum packing_op op)
  1512. {
  1513. const int size = 4;
  1514. sja1105_packing(buf, &cmd->d32_os, 28, 27, size, op);
  1515. sja1105_packing(buf, &cmd->d32_ih, 26, 26, size, op);
  1516. sja1105_packing(buf, &cmd->d32_ipud, 25, 24, size, op);
  1517. sja1105_packing(buf, &cmd->d10_os, 20, 19, size, op);
  1518. sja1105_packing(buf, &cmd->d10_ih, 18, 18, size, op);
  1519. sja1105_packing(buf, &cmd->d10_ipud, 17, 16, size, op);
  1520. sja1105_packing(buf, &cmd->ctrl_os, 12, 11, size, op);
  1521. sja1105_packing(buf, &cmd->ctrl_ih, 10, 10, size, op);
  1522. sja1105_packing(buf, &cmd->ctrl_ipud, 9, 8, size, op);
  1523. sja1105_packing(buf, &cmd->clk_os, 4, 3, size, op);
  1524. sja1105_packing(buf, &cmd->clk_ih, 2, 2, size, op);
  1525. sja1105_packing(buf, &cmd->clk_ipud, 1, 0, size, op);
  1526. }
  1527. static void
  1528. sja1110_cfg_pad_mii_id_packing(void *buf, struct sja1105_cfg_pad_mii_id *cmd,
  1529. enum packing_op op)
  1530. {
  1531. const int size = SJA1105_SIZE_CGU_CMD;
  1532. u64 range = 4;
  1533. /* Fields RXC_RANGE and TXC_RANGE select the input frequency range:
  1534. * 0 = 2.5MHz
  1535. * 1 = 25MHz
  1536. * 2 = 50MHz
  1537. * 3 = 125MHz
  1538. * 4 = Automatically determined by port speed.
  1539. * There's no point in defining a structure different than the one for
  1540. * SJA1105, so just hardcode the frequency range to automatic, just as
  1541. * before.
  1542. */
  1543. sja1105_packing(buf, &cmd->rxc_stable_ovr, 26, 26, size, op);
  1544. sja1105_packing(buf, &cmd->rxc_delay, 25, 21, size, op);
  1545. sja1105_packing(buf, &range, 20, 18, size, op);
  1546. sja1105_packing(buf, &cmd->rxc_bypass, 17, 17, size, op);
  1547. sja1105_packing(buf, &cmd->rxc_pd, 16, 16, size, op);
  1548. sja1105_packing(buf, &cmd->txc_stable_ovr, 10, 10, size, op);
  1549. sja1105_packing(buf, &cmd->txc_delay, 9, 5, size, op);
  1550. sja1105_packing(buf, &range, 4, 2, size, op);
  1551. sja1105_packing(buf, &cmd->txc_bypass, 1, 1, size, op);
  1552. sja1105_packing(buf, &cmd->txc_pd, 0, 0, size, op);
  1553. }
  1554. static int sja1105_rgmii_cfg_pad_tx_config(struct sja1105_private *priv,
  1555. int port)
  1556. {
  1557. const struct sja1105_regs *regs = priv->info->regs;
  1558. struct sja1105_cfg_pad_mii pad_mii_tx = {0};
  1559. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  1560. if (regs->pad_mii_tx[port] == SJA1105_RSV_ADDR)
  1561. return 0;
  1562. /* Payload */
  1563. pad_mii_tx.d32_os = 3; /* TXD[3:2] output stage: */
  1564. /* high noise/high speed */
  1565. pad_mii_tx.d10_os = 3; /* TXD[1:0] output stage: */
  1566. /* high noise/high speed */
  1567. pad_mii_tx.d32_ipud = 2; /* TXD[3:2] input stage: */
  1568. /* plain input (default) */
  1569. pad_mii_tx.d10_ipud = 2; /* TXD[1:0] input stage: */
  1570. /* plain input (default) */
  1571. pad_mii_tx.ctrl_os = 3; /* TX_CTL / TX_ER output stage */
  1572. pad_mii_tx.ctrl_ipud = 2; /* TX_CTL / TX_ER input stage (default) */
  1573. pad_mii_tx.clk_os = 3; /* TX_CLK output stage */
  1574. pad_mii_tx.clk_ih = 0; /* TX_CLK input hysteresis (default) */
  1575. pad_mii_tx.clk_ipud = 2; /* TX_CLK input stage (default) */
  1576. sja1105_cfg_pad_mii_packing(packed_buf, &pad_mii_tx, PACK);
  1577. return sja1105_xfer_buf(priv, SPI_WRITE, regs->pad_mii_tx[port],
  1578. packed_buf, SJA1105_SIZE_CGU_CMD);
  1579. }
  1580. static int sja1105_cfg_pad_rx_config(struct sja1105_private *priv, int port)
  1581. {
  1582. const struct sja1105_regs *regs = priv->info->regs;
  1583. struct sja1105_cfg_pad_mii pad_mii_rx = {0};
  1584. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  1585. if (regs->pad_mii_rx[port] == SJA1105_RSV_ADDR)
  1586. return 0;
  1587. /* Payload */
  1588. pad_mii_rx.d32_ih = 0; /* RXD[3:2] input stage hysteresis: */
  1589. /* non-Schmitt (default) */
  1590. pad_mii_rx.d32_ipud = 2; /* RXD[3:2] input weak pull-up/down */
  1591. /* plain input (default) */
  1592. pad_mii_rx.d10_ih = 0; /* RXD[1:0] input stage hysteresis: */
  1593. /* non-Schmitt (default) */
  1594. pad_mii_rx.d10_ipud = 2; /* RXD[1:0] input weak pull-up/down */
  1595. /* plain input (default) */
  1596. pad_mii_rx.ctrl_ih = 0; /* RX_DV/CRS_DV/RX_CTL and RX_ER */
  1597. /* input stage hysteresis: */
  1598. /* non-Schmitt (default) */
  1599. pad_mii_rx.ctrl_ipud = 3; /* RX_DV/CRS_DV/RX_CTL and RX_ER */
  1600. /* input stage weak pull-up/down: */
  1601. /* pull-down */
  1602. pad_mii_rx.clk_os = 2; /* RX_CLK/RXC output stage: */
  1603. /* medium noise/fast speed (default) */
  1604. pad_mii_rx.clk_ih = 0; /* RX_CLK/RXC input hysteresis: */
  1605. /* non-Schmitt (default) */
  1606. pad_mii_rx.clk_ipud = 2; /* RX_CLK/RXC input pull-up/down: */
  1607. /* plain input (default) */
  1608. sja1105_cfg_pad_mii_packing(packed_buf, &pad_mii_rx, PACK);
  1609. return sja1105_xfer_buf(priv, SPI_WRITE, regs->pad_mii_rx[port],
  1610. packed_buf, SJA1105_SIZE_CGU_CMD);
  1611. }
  1612. static void
  1613. sja1105_cfg_pad_mii_id_packing(void *buf, struct sja1105_cfg_pad_mii_id *cmd,
  1614. enum packing_op op)
  1615. {
  1616. const int size = SJA1105_SIZE_CGU_CMD;
  1617. sja1105_packing(buf, &cmd->rxc_stable_ovr, 15, 15, size, op);
  1618. sja1105_packing(buf, &cmd->rxc_delay, 14, 10, size, op);
  1619. sja1105_packing(buf, &cmd->rxc_bypass, 9, 9, size, op);
  1620. sja1105_packing(buf, &cmd->rxc_pd, 8, 8, size, op);
  1621. sja1105_packing(buf, &cmd->txc_stable_ovr, 7, 7, size, op);
  1622. sja1105_packing(buf, &cmd->txc_delay, 6, 2, size, op);
  1623. sja1105_packing(buf, &cmd->txc_bypass, 1, 1, size, op);
  1624. sja1105_packing(buf, &cmd->txc_pd, 0, 0, size, op);
  1625. }
  1626. /* Valid range in degrees is an integer between 73.8 and 101.7 */
  1627. static u64 sja1105_rgmii_delay(u64 phase)
  1628. {
  1629. /* UM11040.pdf: The delay in degree phase is 73.8 + delay_tune * 0.9.
  1630. * To avoid floating point operations we'll multiply by 10
  1631. * and get 1 decimal point precision.
  1632. */
  1633. phase *= 10;
  1634. return (phase - 738) / 9;
  1635. }
  1636. static int sja1105pqrs_setup_rgmii_delay(struct sja1105_private *priv, int port)
  1637. {
  1638. const struct sja1105_regs *regs = priv->info->regs;
  1639. struct sja1105_cfg_pad_mii_id pad_mii_id = {0};
  1640. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  1641. int rc;
  1642. if (priv->rgmii_rx_delay[port])
  1643. pad_mii_id.rxc_delay = sja1105_rgmii_delay(90);
  1644. if (priv->rgmii_tx_delay[port])
  1645. pad_mii_id.txc_delay = sja1105_rgmii_delay(90);
  1646. /* Stage 1: Turn the RGMII delay lines off. */
  1647. pad_mii_id.rxc_bypass = 1;
  1648. pad_mii_id.rxc_pd = 1;
  1649. pad_mii_id.txc_bypass = 1;
  1650. pad_mii_id.txc_pd = 1;
  1651. sja1105_cfg_pad_mii_id_packing(packed_buf, &pad_mii_id, PACK);
  1652. rc = sja1105_xfer_buf(priv, SPI_WRITE, regs->pad_mii_id[port],
  1653. packed_buf, SJA1105_SIZE_CGU_CMD);
  1654. if (rc < 0)
  1655. return rc;
  1656. /* Stage 2: Turn the RGMII delay lines on. */
  1657. if (priv->rgmii_rx_delay[port]) {
  1658. pad_mii_id.rxc_bypass = 0;
  1659. pad_mii_id.rxc_pd = 0;
  1660. }
  1661. if (priv->rgmii_tx_delay[port]) {
  1662. pad_mii_id.txc_bypass = 0;
  1663. pad_mii_id.txc_pd = 0;
  1664. }
  1665. sja1105_cfg_pad_mii_id_packing(packed_buf, &pad_mii_id, PACK);
  1666. return sja1105_xfer_buf(priv, SPI_WRITE, regs->pad_mii_id[port],
  1667. packed_buf, SJA1105_SIZE_CGU_CMD);
  1668. }
  1669. static int sja1110_setup_rgmii_delay(struct sja1105_private *priv, int port)
  1670. {
  1671. const struct sja1105_regs *regs = priv->info->regs;
  1672. struct sja1105_cfg_pad_mii_id pad_mii_id = {0};
  1673. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  1674. pad_mii_id.rxc_pd = 1;
  1675. pad_mii_id.txc_pd = 1;
  1676. if (priv->rgmii_rx_delay[port]) {
  1677. pad_mii_id.rxc_delay = sja1105_rgmii_delay(90);
  1678. /* The "BYPASS" bit in SJA1110 is actually a "don't bypass" */
  1679. pad_mii_id.rxc_bypass = 1;
  1680. pad_mii_id.rxc_pd = 0;
  1681. }
  1682. if (priv->rgmii_tx_delay[port]) {
  1683. pad_mii_id.txc_delay = sja1105_rgmii_delay(90);
  1684. pad_mii_id.txc_bypass = 1;
  1685. pad_mii_id.txc_pd = 0;
  1686. }
  1687. sja1110_cfg_pad_mii_id_packing(packed_buf, &pad_mii_id, PACK);
  1688. return sja1105_xfer_buf(priv, SPI_WRITE, regs->pad_mii_id[port],
  1689. packed_buf, SJA1105_SIZE_CGU_CMD);
  1690. }
  1691. static int sja1105_rgmii_clocking_setup(struct sja1105_private *priv, int port,
  1692. sja1105_mii_role_t role)
  1693. {
  1694. struct sja1105_mac_config_entry *mac;
  1695. struct udevice *dev = priv->dev;
  1696. u64 speed;
  1697. int rc;
  1698. mac = priv->static_config.tables[BLK_IDX_MAC_CONFIG].entries;
  1699. speed = mac[port].speed;
  1700. if (speed == priv->info->port_speed[SJA1105_SPEED_1000MBPS]) {
  1701. /* 1000Mbps, IDIV disabled (125 MHz) */
  1702. rc = sja1105_cgu_idiv_config(priv, port, false, 1);
  1703. } else if (speed == priv->info->port_speed[SJA1105_SPEED_100MBPS]) {
  1704. /* 100Mbps, IDIV enabled, divide by 1 (25 MHz) */
  1705. rc = sja1105_cgu_idiv_config(priv, port, true, 1);
  1706. } else if (speed == priv->info->port_speed[SJA1105_SPEED_10MBPS]) {
  1707. /* 10Mbps, IDIV enabled, divide by 10 (2.5 MHz) */
  1708. rc = sja1105_cgu_idiv_config(priv, port, true, 10);
  1709. } else if (speed == priv->info->port_speed[SJA1105_SPEED_AUTO]) {
  1710. /* Skip CGU configuration if there is no speed available
  1711. * (e.g. link is not established yet)
  1712. */
  1713. dev_dbg(dev, "Speed not available, skipping CGU config\n");
  1714. return 0;
  1715. } else {
  1716. rc = -EINVAL;
  1717. }
  1718. if (rc < 0) {
  1719. dev_err(dev, "Failed to configure idiv\n");
  1720. return rc;
  1721. }
  1722. rc = sja1105_cgu_rgmii_tx_clk_config(priv, port, speed);
  1723. if (rc < 0) {
  1724. dev_err(dev, "Failed to configure RGMII Tx clock\n");
  1725. return rc;
  1726. }
  1727. rc = sja1105_rgmii_cfg_pad_tx_config(priv, port);
  1728. if (rc < 0) {
  1729. dev_err(dev, "Failed to configure Tx pad registers\n");
  1730. return rc;
  1731. }
  1732. if (!priv->info->setup_rgmii_delay)
  1733. return 0;
  1734. return priv->info->setup_rgmii_delay(priv, port);
  1735. }
  1736. static int sja1105_cgu_rmii_ref_clk_config(struct sja1105_private *priv,
  1737. int port)
  1738. {
  1739. const struct sja1105_regs *regs = priv->info->regs;
  1740. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  1741. struct sja1105_cgu_mii_ctrl ref_clk;
  1742. const int clk_sources[] = {
  1743. CLKSRC_MII0_TX_CLK,
  1744. CLKSRC_MII1_TX_CLK,
  1745. CLKSRC_MII2_TX_CLK,
  1746. CLKSRC_MII3_TX_CLK,
  1747. CLKSRC_MII4_TX_CLK,
  1748. };
  1749. if (regs->rmii_ref_clk[port] == SJA1105_RSV_ADDR)
  1750. return 0;
  1751. /* Payload for packed_buf */
  1752. ref_clk.clksrc = clk_sources[port];
  1753. ref_clk.autoblock = 1; /* Autoblock clk while changing clksrc */
  1754. ref_clk.pd = 0; /* Power Down off => enabled */
  1755. sja1105_cgu_mii_control_packing(packed_buf, &ref_clk, PACK);
  1756. return sja1105_xfer_buf(priv, SPI_WRITE, regs->rmii_ref_clk[port],
  1757. packed_buf, SJA1105_SIZE_CGU_CMD);
  1758. }
  1759. static int
  1760. sja1105_cgu_rmii_ext_tx_clk_config(struct sja1105_private *priv, int port)
  1761. {
  1762. const struct sja1105_regs *regs = priv->info->regs;
  1763. struct sja1105_cgu_mii_ctrl ext_tx_clk;
  1764. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  1765. if (regs->rmii_ext_tx_clk[port] == SJA1105_RSV_ADDR)
  1766. return 0;
  1767. /* Payload for packed_buf */
  1768. ext_tx_clk.clksrc = CLKSRC_PLL1;
  1769. ext_tx_clk.autoblock = 1; /* Autoblock clk while changing clksrc */
  1770. ext_tx_clk.pd = 0; /* Power Down off => enabled */
  1771. sja1105_cgu_mii_control_packing(packed_buf, &ext_tx_clk, PACK);
  1772. return sja1105_xfer_buf(priv, SPI_WRITE, regs->rmii_ext_tx_clk[port],
  1773. packed_buf, SJA1105_SIZE_CGU_CMD);
  1774. }
  1775. static int sja1105_cgu_rmii_pll_config(struct sja1105_private *priv)
  1776. {
  1777. const struct sja1105_regs *regs = priv->info->regs;
  1778. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  1779. struct sja1105_cgu_pll_ctrl pll = {0};
  1780. int rc;
  1781. if (regs->rmii_pll1 == SJA1105_RSV_ADDR)
  1782. return 0;
  1783. /* Step 1: PLL1 setup for 50Mhz */
  1784. pll.pllclksrc = 0xA;
  1785. pll.msel = 0x1;
  1786. pll.autoblock = 0x1;
  1787. pll.psel = 0x1;
  1788. pll.direct = 0x0;
  1789. pll.fbsel = 0x1;
  1790. pll.bypass = 0x0;
  1791. pll.pd = 0x1;
  1792. sja1105_cgu_pll_control_packing(packed_buf, &pll, PACK);
  1793. rc = sja1105_xfer_buf(priv, SPI_WRITE, regs->rmii_pll1, packed_buf,
  1794. SJA1105_SIZE_CGU_CMD);
  1795. if (rc < 0)
  1796. return rc;
  1797. /* Step 2: Enable PLL1 */
  1798. pll.pd = 0x0;
  1799. sja1105_cgu_pll_control_packing(packed_buf, &pll, PACK);
  1800. rc = sja1105_xfer_buf(priv, SPI_WRITE, regs->rmii_pll1, packed_buf,
  1801. SJA1105_SIZE_CGU_CMD);
  1802. return rc;
  1803. }
  1804. static int sja1105_rmii_clocking_setup(struct sja1105_private *priv, int port,
  1805. sja1105_mii_role_t role)
  1806. {
  1807. int rc;
  1808. /* AH1601.pdf chapter 2.5.1. Sources */
  1809. if (role == XMII_MAC) {
  1810. /* Configure and enable PLL1 for 50Mhz output */
  1811. rc = sja1105_cgu_rmii_pll_config(priv);
  1812. if (rc < 0)
  1813. return rc;
  1814. }
  1815. /* Disable IDIV for this port */
  1816. rc = sja1105_cgu_idiv_config(priv, port, false, 1);
  1817. if (rc < 0)
  1818. return rc;
  1819. /* Source to sink mappings */
  1820. rc = sja1105_cgu_rmii_ref_clk_config(priv, port);
  1821. if (rc < 0)
  1822. return rc;
  1823. if (role == XMII_MAC) {
  1824. rc = sja1105_cgu_rmii_ext_tx_clk_config(priv, port);
  1825. if (rc < 0)
  1826. return rc;
  1827. }
  1828. return 0;
  1829. }
  1830. static int sja1105_pcs_read(struct sja1105_private *priv, int addr,
  1831. int devad, int regnum)
  1832. {
  1833. return priv->mdio_pcs->read(priv->mdio_pcs, addr, devad, regnum);
  1834. }
  1835. static int sja1105_pcs_write(struct sja1105_private *priv, int addr,
  1836. int devad, int regnum, u16 val)
  1837. {
  1838. return priv->mdio_pcs->write(priv->mdio_pcs, addr, devad, regnum, val);
  1839. }
  1840. /* In NXP SJA1105, the PCS is integrated with a PMA that has the TX lane
  1841. * polarity inverted by default (PLUS is MINUS, MINUS is PLUS). To obtain
  1842. * normal non-inverted behavior, the TX lane polarity must be inverted in the
  1843. * PCS, via the DIGITAL_CONTROL_2 register.
  1844. */
  1845. static int sja1105_pma_config(struct sja1105_private *priv, int port)
  1846. {
  1847. return sja1105_pcs_write(priv, port, MDIO_MMD_VEND2,
  1848. DW_VR_MII_DIG_CTRL2,
  1849. DW_VR_MII_DIG_CTRL2_TX_POL_INV);
  1850. }
  1851. static int sja1110_pma_config(struct sja1105_private *priv, int port)
  1852. {
  1853. u16 txpll_fbdiv = 0x19, txpll_refdiv = 0x1;
  1854. u16 rxpll_fbdiv = 0x19, rxpll_refdiv = 0x1;
  1855. u16 rx_cdr_ctle = 0x212a;
  1856. u16 val;
  1857. int rc;
  1858. /* Program TX PLL feedback divider and reference divider settings for
  1859. * correct oscillation frequency.
  1860. */
  1861. rc = sja1105_pcs_write(priv, port, MDIO_MMD_VEND2, SJA1110_TXPLL_CTRL0,
  1862. SJA1110_TXPLL_FBDIV(txpll_fbdiv));
  1863. if (rc < 0)
  1864. return rc;
  1865. rc = sja1105_pcs_write(priv, port, MDIO_MMD_VEND2, SJA1110_TXPLL_CTRL1,
  1866. SJA1110_TXPLL_REFDIV(txpll_refdiv));
  1867. if (rc < 0)
  1868. return rc;
  1869. /* Program transmitter amplitude and disable amplitude trimming */
  1870. rc = sja1105_pcs_write(priv, port, MDIO_MMD_VEND2,
  1871. SJA1110_LANE_DRIVER1_0, SJA1110_TXDRV(0x5));
  1872. if (rc < 0)
  1873. return rc;
  1874. val = SJA1110_TXDRVTRIM_LSB(0xffffffull);
  1875. rc = sja1105_pcs_write(priv, port, MDIO_MMD_VEND2,
  1876. SJA1110_LANE_DRIVER2_0, val);
  1877. if (rc < 0)
  1878. return rc;
  1879. val = SJA1110_TXDRVTRIM_MSB(0xffffffull) | SJA1110_LANE_DRIVER2_1_RSV;
  1880. rc = sja1105_pcs_write(priv, port, MDIO_MMD_VEND2,
  1881. SJA1110_LANE_DRIVER2_1, val);
  1882. if (rc < 0)
  1883. return rc;
  1884. /* Enable input and output resistor terminations for low BER. */
  1885. val = SJA1110_ACCOUPLE_RXVCM_EN | SJA1110_CDR_GAIN |
  1886. SJA1110_RXRTRIM(4) | SJA1110_RXTEN | SJA1110_TXPLL_BWSEL |
  1887. SJA1110_TXRTRIM(3) | SJA1110_TXTEN;
  1888. rc = sja1105_pcs_write(priv, port, MDIO_MMD_VEND2, SJA1110_LANE_TRIM,
  1889. val);
  1890. if (rc < 0)
  1891. return rc;
  1892. /* Select PCS as transmitter data source. */
  1893. rc = sja1105_pcs_write(priv, port, MDIO_MMD_VEND2,
  1894. SJA1110_LANE_DATAPATH_1, 0);
  1895. if (rc < 0)
  1896. return rc;
  1897. /* Program RX PLL feedback divider and reference divider for correct
  1898. * oscillation frequency.
  1899. */
  1900. rc = sja1105_pcs_write(priv, port, MDIO_MMD_VEND2, SJA1110_RXPLL_CTRL0,
  1901. SJA1110_RXPLL_FBDIV(rxpll_fbdiv));
  1902. if (rc < 0)
  1903. return rc;
  1904. rc = sja1105_pcs_write(priv, port, MDIO_MMD_VEND2, SJA1110_RXPLL_CTRL1,
  1905. SJA1110_RXPLL_REFDIV(rxpll_refdiv));
  1906. if (rc < 0)
  1907. return rc;
  1908. /* Program threshold for receiver signal detector.
  1909. * Enable control of RXPLL by receiver signal detector to disable RXPLL
  1910. * when an input signal is not present.
  1911. */
  1912. rc = sja1105_pcs_write(priv, port, MDIO_MMD_VEND2,
  1913. SJA1110_RX_DATA_DETECT, 0x0005);
  1914. if (rc < 0)
  1915. return rc;
  1916. /* Enable TX and RX PLLs and circuits.
  1917. * Release reset of PMA to enable data flow to/from PCS.
  1918. */
  1919. rc = sja1105_pcs_read(priv, port, MDIO_MMD_VEND2,
  1920. SJA1110_POWERDOWN_ENABLE);
  1921. if (rc < 0)
  1922. return rc;
  1923. val = rc & ~(SJA1110_TXPLL_PD | SJA1110_TXPD | SJA1110_RXCH_PD |
  1924. SJA1110_RXBIAS_PD | SJA1110_RESET_SER_EN |
  1925. SJA1110_RESET_SER | SJA1110_RESET_DES);
  1926. val |= SJA1110_RXPKDETEN | SJA1110_RCVEN;
  1927. rc = sja1105_pcs_write(priv, port, MDIO_MMD_VEND2,
  1928. SJA1110_POWERDOWN_ENABLE, val);
  1929. if (rc < 0)
  1930. return rc;
  1931. /* Program continuous-time linear equalizer (CTLE) settings. */
  1932. rc = sja1105_pcs_write(priv, port, MDIO_MMD_VEND2, SJA1110_RX_CDR_CTLE,
  1933. rx_cdr_ctle);
  1934. if (rc < 0)
  1935. return rc;
  1936. return 0;
  1937. }
  1938. static int sja1105_xpcs_config_aneg_c37_sgmii(struct sja1105_private *priv,
  1939. int port)
  1940. {
  1941. int rc;
  1942. rc = sja1105_pcs_read(priv, port, MDIO_MMD_VEND2, MDIO_CTRL1);
  1943. if (rc < 0)
  1944. return rc;
  1945. rc &= ~MDIO_AN_CTRL1_ENABLE;
  1946. rc = sja1105_pcs_write(priv, port, MDIO_MMD_VEND2, MDIO_CTRL1,
  1947. rc);
  1948. if (rc < 0)
  1949. return rc;
  1950. rc = sja1105_pcs_read(priv, port, MDIO_MMD_VEND2, DW_VR_MII_AN_CTRL);
  1951. if (rc < 0)
  1952. return rc;
  1953. rc &= ~(DW_VR_MII_PCS_MODE_MASK | DW_VR_MII_TX_CONFIG_MASK);
  1954. rc |= (DW_VR_MII_PCS_MODE_C37_SGMII <<
  1955. DW_VR_MII_AN_CTRL_PCS_MODE_SHIFT &
  1956. DW_VR_MII_PCS_MODE_MASK);
  1957. rc |= (DW_VR_MII_TX_CONFIG_MAC_SIDE_SGMII <<
  1958. DW_VR_MII_AN_CTRL_TX_CONFIG_SHIFT &
  1959. DW_VR_MII_TX_CONFIG_MASK);
  1960. rc = sja1105_pcs_write(priv, port, MDIO_MMD_VEND2, DW_VR_MII_AN_CTRL,
  1961. rc);
  1962. if (rc < 0)
  1963. return rc;
  1964. rc = sja1105_pcs_read(priv, port, MDIO_MMD_VEND2, DW_VR_MII_DIG_CTRL1);
  1965. if (rc < 0)
  1966. return rc;
  1967. if (priv->xpcs_cfg[port].inband_an)
  1968. rc |= DW_VR_MII_DIG_CTRL1_MAC_AUTO_SW;
  1969. else
  1970. rc &= ~DW_VR_MII_DIG_CTRL1_MAC_AUTO_SW;
  1971. rc = sja1105_pcs_write(priv, port, MDIO_MMD_VEND2, DW_VR_MII_DIG_CTRL1,
  1972. rc);
  1973. if (rc < 0)
  1974. return rc;
  1975. rc = sja1105_pcs_read(priv, port, MDIO_MMD_VEND2, MDIO_CTRL1);
  1976. if (rc < 0)
  1977. return rc;
  1978. if (priv->xpcs_cfg[port].inband_an)
  1979. rc |= MDIO_AN_CTRL1_ENABLE;
  1980. else
  1981. rc &= ~MDIO_AN_CTRL1_ENABLE;
  1982. return sja1105_pcs_write(priv, port, MDIO_MMD_VEND2, MDIO_CTRL1, rc);
  1983. }
  1984. static int sja1105_xpcs_link_up_sgmii(struct sja1105_private *priv, int port)
  1985. {
  1986. int val = BMCR_FULLDPLX;
  1987. if (priv->xpcs_cfg[port].inband_an)
  1988. return 0;
  1989. switch (priv->xpcs_cfg[port].speed) {
  1990. case SPEED_1000:
  1991. val = BMCR_SPEED1000;
  1992. break;
  1993. case SPEED_100:
  1994. val = BMCR_SPEED100;
  1995. break;
  1996. case SPEED_10:
  1997. val = BMCR_SPEED10;
  1998. break;
  1999. default:
  2000. dev_err(priv->dev, "Invalid PCS speed %d\n",
  2001. priv->xpcs_cfg[port].speed);
  2002. return -EINVAL;
  2003. }
  2004. return sja1105_pcs_write(priv, port, MDIO_MMD_VEND2, MDIO_CTRL1, val);
  2005. }
  2006. static int sja1105_sgmii_setup(struct sja1105_private *priv, int port)
  2007. {
  2008. int rc;
  2009. rc = sja1105_xpcs_config_aneg_c37_sgmii(priv, port);
  2010. if (rc)
  2011. return rc;
  2012. rc = sja1105_xpcs_link_up_sgmii(priv, port);
  2013. if (rc)
  2014. return rc;
  2015. return priv->info->pma_config(priv, port);
  2016. }
  2017. static int sja1105_clocking_setup_port(struct sja1105_private *priv, int port)
  2018. {
  2019. struct sja1105_xmii_params_entry *mii;
  2020. sja1105_phy_interface_t phy_mode;
  2021. sja1105_mii_role_t role;
  2022. int rc;
  2023. mii = priv->static_config.tables[BLK_IDX_XMII_PARAMS].entries;
  2024. /* RGMII etc */
  2025. phy_mode = mii->xmii_mode[port];
  2026. /* MAC or PHY, for applicable types (not RGMII) */
  2027. role = mii->phy_mac[port];
  2028. switch (phy_mode) {
  2029. case XMII_MODE_MII:
  2030. rc = sja1105_mii_clocking_setup(priv, port, role);
  2031. break;
  2032. case XMII_MODE_RMII:
  2033. rc = sja1105_rmii_clocking_setup(priv, port, role);
  2034. break;
  2035. case XMII_MODE_RGMII:
  2036. rc = sja1105_rgmii_clocking_setup(priv, port, role);
  2037. break;
  2038. case XMII_MODE_SGMII:
  2039. rc = sja1105_sgmii_setup(priv, port);
  2040. break;
  2041. default:
  2042. return -EINVAL;
  2043. }
  2044. if (rc)
  2045. return rc;
  2046. /* Internally pull down the RX_DV/CRS_DV/RX_CTL and RX_ER inputs */
  2047. return sja1105_cfg_pad_rx_config(priv, port);
  2048. }
  2049. static int sja1105_clocking_setup(struct sja1105_private *priv)
  2050. {
  2051. struct dsa_pdata *pdata = dev_get_uclass_plat(priv->dev);
  2052. int port, rc;
  2053. for (port = 0; port < pdata->num_ports; port++) {
  2054. rc = sja1105_clocking_setup_port(priv, port);
  2055. if (rc < 0)
  2056. return rc;
  2057. }
  2058. return 0;
  2059. }
  2060. static int sja1105_pcs_mdio_read(struct mii_dev *bus, int phy, int mmd, int reg)
  2061. {
  2062. u8 packed_buf[SJA1105_SIZE_MDIO_CMD] = {0};
  2063. struct sja1105_private *priv = bus->priv;
  2064. const int size = SJA1105_SIZE_MDIO_CMD;
  2065. u64 addr, tmp;
  2066. int rc;
  2067. if (mmd == MDIO_DEVAD_NONE)
  2068. return -ENODEV;
  2069. if (!priv->info->supports_sgmii[phy])
  2070. return -ENODEV;
  2071. addr = (mmd << 16) | (reg & GENMASK(15, 0));
  2072. if (mmd != MDIO_MMD_VEND1 && mmd != MDIO_MMD_VEND2)
  2073. return 0xffff;
  2074. rc = sja1105_xfer_buf(priv, SPI_READ, addr, packed_buf, size);
  2075. if (rc < 0)
  2076. return rc;
  2077. sja1105_packing(packed_buf, &tmp, 31, 0, size, UNPACK);
  2078. return tmp & 0xffff;
  2079. }
  2080. static int sja1105_pcs_mdio_write(struct mii_dev *bus, int phy, int mmd,
  2081. int reg, u16 val)
  2082. {
  2083. u8 packed_buf[SJA1105_SIZE_MDIO_CMD] = {0};
  2084. struct sja1105_private *priv = bus->priv;
  2085. const int size = SJA1105_SIZE_MDIO_CMD;
  2086. u64 addr, tmp;
  2087. if (mmd == MDIO_DEVAD_NONE)
  2088. return -ENODEV;
  2089. if (!priv->info->supports_sgmii[phy])
  2090. return -ENODEV;
  2091. addr = (mmd << 16) | (reg & GENMASK(15, 0));
  2092. tmp = val;
  2093. if (mmd != MDIO_MMD_VEND1 && mmd != MDIO_MMD_VEND2)
  2094. return -ENODEV;
  2095. sja1105_packing(packed_buf, &tmp, 31, 0, size, PACK);
  2096. return sja1105_xfer_buf(priv, SPI_WRITE, addr, packed_buf, size);
  2097. }
  2098. static int sja1110_pcs_mdio_read(struct mii_dev *bus, int phy, int mmd, int reg)
  2099. {
  2100. struct sja1105_private *priv = bus->priv;
  2101. const struct sja1105_regs *regs = priv->info->regs;
  2102. u8 packed_buf[SJA1105_SIZE_MDIO_CMD] = {0};
  2103. const int size = SJA1105_SIZE_MDIO_CMD;
  2104. int offset, bank;
  2105. u64 addr, tmp;
  2106. int rc;
  2107. if (mmd == MDIO_DEVAD_NONE)
  2108. return -ENODEV;
  2109. if (regs->pcs_base[phy] == SJA1105_RSV_ADDR)
  2110. return -ENODEV;
  2111. addr = (mmd << 16) | (reg & GENMASK(15, 0));
  2112. bank = addr >> 8;
  2113. offset = addr & GENMASK(7, 0);
  2114. /* This addressing scheme reserves register 0xff for the bank address
  2115. * register, so that can never be addressed.
  2116. */
  2117. if (offset == 0xff)
  2118. return -ENODEV;
  2119. tmp = bank;
  2120. sja1105_packing(packed_buf, &tmp, 31, 0, size, PACK);
  2121. rc = sja1105_xfer_buf(priv, SPI_WRITE,
  2122. regs->pcs_base[phy] + SJA1110_PCS_BANK_REG,
  2123. packed_buf, size);
  2124. if (rc < 0)
  2125. return rc;
  2126. rc = sja1105_xfer_buf(priv, SPI_READ, regs->pcs_base[phy] + offset,
  2127. packed_buf, size);
  2128. if (rc < 0)
  2129. return rc;
  2130. sja1105_packing(packed_buf, &tmp, 31, 0, size, UNPACK);
  2131. return tmp & 0xffff;
  2132. }
  2133. static int sja1110_pcs_mdio_write(struct mii_dev *bus, int phy, int mmd,
  2134. int reg, u16 val)
  2135. {
  2136. struct sja1105_private *priv = bus->priv;
  2137. const struct sja1105_regs *regs = priv->info->regs;
  2138. u8 packed_buf[SJA1105_SIZE_MDIO_CMD] = {0};
  2139. const int size = SJA1105_SIZE_MDIO_CMD;
  2140. int offset, bank;
  2141. u64 addr, tmp;
  2142. int rc;
  2143. if (mmd == MDIO_DEVAD_NONE)
  2144. return -ENODEV;
  2145. if (regs->pcs_base[phy] == SJA1105_RSV_ADDR)
  2146. return -ENODEV;
  2147. addr = (mmd << 16) | (reg & GENMASK(15, 0));
  2148. bank = addr >> 8;
  2149. offset = addr & GENMASK(7, 0);
  2150. /* This addressing scheme reserves register 0xff for the bank address
  2151. * register, so that can never be addressed.
  2152. */
  2153. if (offset == 0xff)
  2154. return -ENODEV;
  2155. tmp = bank;
  2156. sja1105_packing(packed_buf, &tmp, 31, 0, size, PACK);
  2157. rc = sja1105_xfer_buf(priv, SPI_WRITE,
  2158. regs->pcs_base[phy] + SJA1110_PCS_BANK_REG,
  2159. packed_buf, size);
  2160. if (rc < 0)
  2161. return rc;
  2162. tmp = val;
  2163. sja1105_packing(packed_buf, &tmp, 31, 0, size, PACK);
  2164. return sja1105_xfer_buf(priv, SPI_WRITE, regs->pcs_base[phy] + offset,
  2165. packed_buf, size);
  2166. }
  2167. static int sja1105_mdiobus_register(struct sja1105_private *priv)
  2168. {
  2169. struct udevice *dev = priv->dev;
  2170. struct mii_dev *bus;
  2171. int rc;
  2172. if (!priv->info->pcs_mdio_read || !priv->info->pcs_mdio_write)
  2173. return 0;
  2174. bus = mdio_alloc();
  2175. if (!bus)
  2176. return -ENOMEM;
  2177. snprintf(bus->name, MDIO_NAME_LEN, "%s-pcs", dev->name);
  2178. bus->read = priv->info->pcs_mdio_read;
  2179. bus->write = priv->info->pcs_mdio_write;
  2180. bus->priv = priv;
  2181. rc = mdio_register(bus);
  2182. if (rc) {
  2183. mdio_free(bus);
  2184. return rc;
  2185. }
  2186. priv->mdio_pcs = bus;
  2187. return 0;
  2188. }
  2189. static void sja1105_mdiobus_unregister(struct sja1105_private *priv)
  2190. {
  2191. if (!priv->mdio_pcs)
  2192. return;
  2193. mdio_unregister(priv->mdio_pcs);
  2194. mdio_free(priv->mdio_pcs);
  2195. }
  2196. static const struct sja1105_regs sja1105et_regs = {
  2197. .device_id = 0x0,
  2198. .prod_id = 0x100BC3,
  2199. .status = 0x1,
  2200. .port_control = 0x11,
  2201. .config = 0x020000,
  2202. .rgu = 0x100440,
  2203. /* UM10944.pdf, Table 86, ACU Register overview */
  2204. .pad_mii_tx = {0x100800, 0x100802, 0x100804, 0x100806, 0x100808},
  2205. .pad_mii_rx = {0x100801, 0x100803, 0x100805, 0x100807, 0x100809},
  2206. .rmii_pll1 = 0x10000A,
  2207. .cgu_idiv = {0x10000B, 0x10000C, 0x10000D, 0x10000E, 0x10000F},
  2208. /* UM10944.pdf, Table 78, CGU Register overview */
  2209. .mii_tx_clk = {0x100013, 0x10001A, 0x100021, 0x100028, 0x10002F},
  2210. .mii_rx_clk = {0x100014, 0x10001B, 0x100022, 0x100029, 0x100030},
  2211. .mii_ext_tx_clk = {0x100018, 0x10001F, 0x100026, 0x10002D, 0x100034},
  2212. .mii_ext_rx_clk = {0x100019, 0x100020, 0x100027, 0x10002E, 0x100035},
  2213. .rgmii_tx_clk = {0x100016, 0x10001D, 0x100024, 0x10002B, 0x100032},
  2214. .rmii_ref_clk = {0x100015, 0x10001C, 0x100023, 0x10002A, 0x100031},
  2215. .rmii_ext_tx_clk = {0x100018, 0x10001F, 0x100026, 0x10002D, 0x100034},
  2216. };
  2217. static const struct sja1105_regs sja1105pqrs_regs = {
  2218. .device_id = 0x0,
  2219. .prod_id = 0x100BC3,
  2220. .status = 0x1,
  2221. .port_control = 0x12,
  2222. .config = 0x020000,
  2223. .rgu = 0x100440,
  2224. /* UM10944.pdf, Table 86, ACU Register overview */
  2225. .pad_mii_tx = {0x100800, 0x100802, 0x100804, 0x100806, 0x100808},
  2226. .pad_mii_rx = {0x100801, 0x100803, 0x100805, 0x100807, 0x100809},
  2227. .pad_mii_id = {0x100810, 0x100811, 0x100812, 0x100813, 0x100814},
  2228. .rmii_pll1 = 0x10000A,
  2229. .cgu_idiv = {0x10000B, 0x10000C, 0x10000D, 0x10000E, 0x10000F},
  2230. /* UM11040.pdf, Table 114 */
  2231. .mii_tx_clk = {0x100013, 0x100019, 0x10001F, 0x100025, 0x10002B},
  2232. .mii_rx_clk = {0x100014, 0x10001A, 0x100020, 0x100026, 0x10002C},
  2233. .mii_ext_tx_clk = {0x100017, 0x10001D, 0x100023, 0x100029, 0x10002F},
  2234. .mii_ext_rx_clk = {0x100018, 0x10001E, 0x100024, 0x10002A, 0x100030},
  2235. .rgmii_tx_clk = {0x100016, 0x10001C, 0x100022, 0x100028, 0x10002E},
  2236. .rmii_ref_clk = {0x100015, 0x10001B, 0x100021, 0x100027, 0x10002D},
  2237. .rmii_ext_tx_clk = {0x100017, 0x10001D, 0x100023, 0x100029, 0x10002F},
  2238. };
  2239. static const struct sja1105_regs sja1110_regs = {
  2240. .device_id = SJA1110_SPI_ADDR(0x0),
  2241. .prod_id = SJA1110_ACU_ADDR(0xf00),
  2242. .status = SJA1110_SPI_ADDR(0x4),
  2243. .port_control = SJA1110_SPI_ADDR(0x50), /* actually INHIB_TX */
  2244. .config = 0x020000,
  2245. .rgu = SJA1110_RGU_ADDR(0x100), /* Reset Control Register 0 */
  2246. /* Ports 2 and 3 are capable of xMII, but there isn't anything to
  2247. * configure in the CGU/ACU for them.
  2248. */
  2249. .pad_mii_tx = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2250. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2251. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2252. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2253. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2254. SJA1105_RSV_ADDR},
  2255. .pad_mii_rx = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2256. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2257. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2258. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2259. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2260. SJA1105_RSV_ADDR},
  2261. .pad_mii_id = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2262. SJA1110_ACU_ADDR(0x18), SJA1110_ACU_ADDR(0x28),
  2263. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2264. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2265. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2266. SJA1105_RSV_ADDR},
  2267. .rmii_pll1 = SJA1105_RSV_ADDR,
  2268. .cgu_idiv = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2269. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2270. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2271. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR},
  2272. .mii_tx_clk = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2273. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2274. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2275. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR},
  2276. .mii_rx_clk = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2277. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2278. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2279. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR},
  2280. .mii_ext_tx_clk = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2281. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2282. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2283. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR},
  2284. .mii_ext_rx_clk = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2285. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2286. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2287. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR},
  2288. .rgmii_tx_clk = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2289. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2290. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2291. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR},
  2292. .rmii_ref_clk = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2293. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2294. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2295. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR},
  2296. .rmii_ext_tx_clk = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2297. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2298. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2299. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2300. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2301. SJA1105_RSV_ADDR},
  2302. .pcs_base = {SJA1105_RSV_ADDR, 0x1c1400, 0x1c1800, 0x1c1c00, 0x1c2000,
  2303. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  2304. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR},
  2305. };
  2306. enum sja1105_switch_id {
  2307. SJA1105E = 0,
  2308. SJA1105T,
  2309. SJA1105P,
  2310. SJA1105Q,
  2311. SJA1105R,
  2312. SJA1105S,
  2313. SJA1110A,
  2314. SJA1110B,
  2315. SJA1110C,
  2316. SJA1110D,
  2317. SJA1105_MAX_SWITCH_ID,
  2318. };
  2319. static const struct sja1105_info sja1105_info[] = {
  2320. [SJA1105E] = {
  2321. .device_id = SJA1105E_DEVICE_ID,
  2322. .part_no = SJA1105ET_PART_NO,
  2323. .static_ops = sja1105et_table_ops,
  2324. .reset_cmd = sja1105et_reset_cmd,
  2325. .regs = &sja1105et_regs,
  2326. .port_speed = {
  2327. [SJA1105_SPEED_AUTO] = 0,
  2328. [SJA1105_SPEED_10MBPS] = 3,
  2329. [SJA1105_SPEED_100MBPS] = 2,
  2330. [SJA1105_SPEED_1000MBPS] = 1,
  2331. },
  2332. .supports_mii = {true, true, true, true, true},
  2333. .supports_rmii = {true, true, true, true, true},
  2334. .supports_rgmii = {true, true, true, true, true},
  2335. .name = "SJA1105E",
  2336. },
  2337. [SJA1105T] = {
  2338. .device_id = SJA1105T_DEVICE_ID,
  2339. .part_no = SJA1105ET_PART_NO,
  2340. .static_ops = sja1105et_table_ops,
  2341. .reset_cmd = sja1105et_reset_cmd,
  2342. .regs = &sja1105et_regs,
  2343. .port_speed = {
  2344. [SJA1105_SPEED_AUTO] = 0,
  2345. [SJA1105_SPEED_10MBPS] = 3,
  2346. [SJA1105_SPEED_100MBPS] = 2,
  2347. [SJA1105_SPEED_1000MBPS] = 1,
  2348. },
  2349. .supports_mii = {true, true, true, true, true},
  2350. .supports_rmii = {true, true, true, true, true},
  2351. .supports_rgmii = {true, true, true, true, true},
  2352. .name = "SJA1105T",
  2353. },
  2354. [SJA1105P] = {
  2355. .device_id = SJA1105PR_DEVICE_ID,
  2356. .part_no = SJA1105P_PART_NO,
  2357. .static_ops = sja1105pqrs_table_ops,
  2358. .setup_rgmii_delay = sja1105pqrs_setup_rgmii_delay,
  2359. .reset_cmd = sja1105pqrs_reset_cmd,
  2360. .regs = &sja1105pqrs_regs,
  2361. .port_speed = {
  2362. [SJA1105_SPEED_AUTO] = 0,
  2363. [SJA1105_SPEED_10MBPS] = 3,
  2364. [SJA1105_SPEED_100MBPS] = 2,
  2365. [SJA1105_SPEED_1000MBPS] = 1,
  2366. },
  2367. .supports_mii = {true, true, true, true, true},
  2368. .supports_rmii = {true, true, true, true, true},
  2369. .supports_rgmii = {true, true, true, true, true},
  2370. .name = "SJA1105P",
  2371. },
  2372. [SJA1105Q] = {
  2373. .device_id = SJA1105QS_DEVICE_ID,
  2374. .part_no = SJA1105Q_PART_NO,
  2375. .static_ops = sja1105pqrs_table_ops,
  2376. .setup_rgmii_delay = sja1105pqrs_setup_rgmii_delay,
  2377. .reset_cmd = sja1105pqrs_reset_cmd,
  2378. .regs = &sja1105pqrs_regs,
  2379. .port_speed = {
  2380. [SJA1105_SPEED_AUTO] = 0,
  2381. [SJA1105_SPEED_10MBPS] = 3,
  2382. [SJA1105_SPEED_100MBPS] = 2,
  2383. [SJA1105_SPEED_1000MBPS] = 1,
  2384. },
  2385. .supports_mii = {true, true, true, true, true},
  2386. .supports_rmii = {true, true, true, true, true},
  2387. .supports_rgmii = {true, true, true, true, true},
  2388. .name = "SJA1105Q",
  2389. },
  2390. [SJA1105R] = {
  2391. .device_id = SJA1105PR_DEVICE_ID,
  2392. .part_no = SJA1105R_PART_NO,
  2393. .static_ops = sja1105pqrs_table_ops,
  2394. .setup_rgmii_delay = sja1105pqrs_setup_rgmii_delay,
  2395. .reset_cmd = sja1105pqrs_reset_cmd,
  2396. .regs = &sja1105pqrs_regs,
  2397. .pcs_mdio_read = sja1105_pcs_mdio_read,
  2398. .pcs_mdio_write = sja1105_pcs_mdio_write,
  2399. .pma_config = sja1105_pma_config,
  2400. .port_speed = {
  2401. [SJA1105_SPEED_AUTO] = 0,
  2402. [SJA1105_SPEED_10MBPS] = 3,
  2403. [SJA1105_SPEED_100MBPS] = 2,
  2404. [SJA1105_SPEED_1000MBPS] = 1,
  2405. },
  2406. .supports_mii = {true, true, true, true, true},
  2407. .supports_rmii = {true, true, true, true, true},
  2408. .supports_rgmii = {true, true, true, true, true},
  2409. .supports_sgmii = {false, false, false, false, true},
  2410. .name = "SJA1105R",
  2411. },
  2412. [SJA1105S] = {
  2413. .device_id = SJA1105QS_DEVICE_ID,
  2414. .part_no = SJA1105S_PART_NO,
  2415. .static_ops = sja1105pqrs_table_ops,
  2416. .setup_rgmii_delay = sja1105pqrs_setup_rgmii_delay,
  2417. .reset_cmd = sja1105pqrs_reset_cmd,
  2418. .regs = &sja1105pqrs_regs,
  2419. .pcs_mdio_read = sja1105_pcs_mdio_read,
  2420. .pcs_mdio_write = sja1105_pcs_mdio_write,
  2421. .pma_config = sja1105_pma_config,
  2422. .port_speed = {
  2423. [SJA1105_SPEED_AUTO] = 0,
  2424. [SJA1105_SPEED_10MBPS] = 3,
  2425. [SJA1105_SPEED_100MBPS] = 2,
  2426. [SJA1105_SPEED_1000MBPS] = 1,
  2427. },
  2428. .supports_mii = {true, true, true, true, true},
  2429. .supports_rmii = {true, true, true, true, true},
  2430. .supports_rgmii = {true, true, true, true, true},
  2431. .supports_sgmii = {false, false, false, false, true},
  2432. .name = "SJA1105S",
  2433. },
  2434. [SJA1110A] = {
  2435. .device_id = SJA1110_DEVICE_ID,
  2436. .part_no = SJA1110A_PART_NO,
  2437. .static_ops = sja1110_table_ops,
  2438. .setup_rgmii_delay = sja1110_setup_rgmii_delay,
  2439. .reset_cmd = sja1110_reset_cmd,
  2440. .regs = &sja1110_regs,
  2441. .pcs_mdio_read = sja1110_pcs_mdio_read,
  2442. .pcs_mdio_write = sja1110_pcs_mdio_write,
  2443. .pma_config = sja1110_pma_config,
  2444. .port_speed = {
  2445. [SJA1105_SPEED_AUTO] = 0,
  2446. [SJA1105_SPEED_10MBPS] = 4,
  2447. [SJA1105_SPEED_100MBPS] = 3,
  2448. [SJA1105_SPEED_1000MBPS] = 2,
  2449. },
  2450. .supports_mii = {true, true, true, true, false,
  2451. true, true, true, true, true, true},
  2452. .supports_rmii = {false, false, true, true, false,
  2453. false, false, false, false, false, false},
  2454. .supports_rgmii = {false, false, true, true, false,
  2455. false, false, false, false, false, false},
  2456. .supports_sgmii = {false, true, true, true, true,
  2457. false, false, false, false, false, false},
  2458. .name = "SJA1110A",
  2459. },
  2460. [SJA1110B] = {
  2461. .device_id = SJA1110_DEVICE_ID,
  2462. .part_no = SJA1110B_PART_NO,
  2463. .static_ops = sja1110_table_ops,
  2464. .setup_rgmii_delay = sja1110_setup_rgmii_delay,
  2465. .reset_cmd = sja1110_reset_cmd,
  2466. .regs = &sja1110_regs,
  2467. .pcs_mdio_read = sja1110_pcs_mdio_read,
  2468. .pcs_mdio_write = sja1110_pcs_mdio_write,
  2469. .pma_config = sja1110_pma_config,
  2470. .port_speed = {
  2471. [SJA1105_SPEED_AUTO] = 0,
  2472. [SJA1105_SPEED_10MBPS] = 4,
  2473. [SJA1105_SPEED_100MBPS] = 3,
  2474. [SJA1105_SPEED_1000MBPS] = 2,
  2475. },
  2476. .supports_mii = {true, true, true, true, false,
  2477. true, true, true, true, true, false},
  2478. .supports_rmii = {false, false, true, true, false,
  2479. false, false, false, false, false, false},
  2480. .supports_rgmii = {false, false, true, true, false,
  2481. false, false, false, false, false, false},
  2482. .supports_sgmii = {false, false, false, true, true,
  2483. false, false, false, false, false, false},
  2484. .name = "SJA1110B",
  2485. },
  2486. [SJA1110C] = {
  2487. .device_id = SJA1110_DEVICE_ID,
  2488. .part_no = SJA1110C_PART_NO,
  2489. .static_ops = sja1110_table_ops,
  2490. .setup_rgmii_delay = sja1110_setup_rgmii_delay,
  2491. .reset_cmd = sja1110_reset_cmd,
  2492. .regs = &sja1110_regs,
  2493. .pcs_mdio_read = sja1110_pcs_mdio_read,
  2494. .pcs_mdio_write = sja1110_pcs_mdio_write,
  2495. .pma_config = sja1110_pma_config,
  2496. .port_speed = {
  2497. [SJA1105_SPEED_AUTO] = 0,
  2498. [SJA1105_SPEED_10MBPS] = 4,
  2499. [SJA1105_SPEED_100MBPS] = 3,
  2500. [SJA1105_SPEED_1000MBPS] = 2,
  2501. },
  2502. .supports_mii = {true, true, true, true, false,
  2503. true, true, true, false, false, false},
  2504. .supports_rmii = {false, false, true, true, false,
  2505. false, false, false, false, false, false},
  2506. .supports_rgmii = {false, false, true, true, false,
  2507. false, false, false, false, false, false},
  2508. .supports_sgmii = {false, false, false, false, true,
  2509. false, false, false, false, false, false},
  2510. .name = "SJA1110C",
  2511. },
  2512. [SJA1110D] = {
  2513. .device_id = SJA1110_DEVICE_ID,
  2514. .part_no = SJA1110D_PART_NO,
  2515. .static_ops = sja1110_table_ops,
  2516. .setup_rgmii_delay = sja1110_setup_rgmii_delay,
  2517. .reset_cmd = sja1110_reset_cmd,
  2518. .regs = &sja1110_regs,
  2519. .pcs_mdio_read = sja1110_pcs_mdio_read,
  2520. .pcs_mdio_write = sja1110_pcs_mdio_write,
  2521. .pma_config = sja1110_pma_config,
  2522. .port_speed = {
  2523. [SJA1105_SPEED_AUTO] = 0,
  2524. [SJA1105_SPEED_10MBPS] = 4,
  2525. [SJA1105_SPEED_100MBPS] = 3,
  2526. [SJA1105_SPEED_1000MBPS] = 2,
  2527. },
  2528. .supports_mii = {true, false, true, false, false,
  2529. true, true, true, false, false, false},
  2530. .supports_rmii = {false, false, true, false, false,
  2531. false, false, false, false, false, false},
  2532. .supports_rgmii = {false, false, true, false, false,
  2533. false, false, false, false, false, false},
  2534. .supports_sgmii = {false, true, true, true, true,
  2535. false, false, false, false, false, false},
  2536. .name = "SJA1110D",
  2537. },
  2538. };
  2539. struct sja1105_status {
  2540. u64 configs;
  2541. u64 crcchkl;
  2542. u64 ids;
  2543. u64 crcchkg;
  2544. };
  2545. static void sja1105_status_unpack(void *buf, struct sja1105_status *status)
  2546. {
  2547. sja1105_packing(buf, &status->configs, 31, 31, 4, UNPACK);
  2548. sja1105_packing(buf, &status->crcchkl, 30, 30, 4, UNPACK);
  2549. sja1105_packing(buf, &status->ids, 29, 29, 4, UNPACK);
  2550. sja1105_packing(buf, &status->crcchkg, 28, 28, 4, UNPACK);
  2551. }
  2552. static int sja1105_status_get(struct sja1105_private *priv,
  2553. struct sja1105_status *status)
  2554. {
  2555. const struct sja1105_regs *regs = priv->info->regs;
  2556. u8 packed_buf[4];
  2557. int rc;
  2558. rc = sja1105_xfer_buf(priv, SPI_READ, regs->status, packed_buf, 4);
  2559. if (rc < 0)
  2560. return rc;
  2561. sja1105_status_unpack(packed_buf, status);
  2562. return 0;
  2563. }
  2564. /* Not const because unpacking priv->static_config into buffers and preparing
  2565. * for upload requires the recalculation of table CRCs and updating the
  2566. * structures with these.
  2567. */
  2568. static int
  2569. static_config_buf_prepare_for_upload(struct sja1105_private *priv,
  2570. void *config_buf, int buf_len)
  2571. {
  2572. struct sja1105_static_config *config = &priv->static_config;
  2573. struct sja1105_table_header final_header;
  2574. char *final_header_ptr;
  2575. int crc_len;
  2576. /* Write Device ID and config tables to config_buf */
  2577. sja1105_static_config_pack(config_buf, config);
  2578. /* Recalculate CRC of the last header (right now 0xDEADBEEF).
  2579. * Don't include the CRC field itself.
  2580. */
  2581. crc_len = buf_len - 4;
  2582. /* Read the whole table header */
  2583. final_header_ptr = config_buf + buf_len - SJA1105_SIZE_TABLE_HEADER;
  2584. sja1105_table_header_packing(final_header_ptr, &final_header, UNPACK);
  2585. /* Modify */
  2586. final_header.crc = sja1105_crc32(config_buf, crc_len);
  2587. /* Rewrite */
  2588. sja1105_table_header_packing(final_header_ptr, &final_header, PACK);
  2589. return 0;
  2590. }
  2591. static int sja1105_static_config_upload(struct sja1105_private *priv)
  2592. {
  2593. struct sja1105_static_config *config = &priv->static_config;
  2594. const struct sja1105_regs *regs = priv->info->regs;
  2595. struct sja1105_status status;
  2596. u8 *config_buf;
  2597. int buf_len;
  2598. int rc;
  2599. buf_len = sja1105_static_config_get_length(config);
  2600. config_buf = calloc(buf_len, sizeof(char));
  2601. if (!config_buf)
  2602. return -ENOMEM;
  2603. rc = static_config_buf_prepare_for_upload(priv, config_buf, buf_len);
  2604. if (rc < 0) {
  2605. printf("Invalid config, cannot upload\n");
  2606. rc = -EINVAL;
  2607. goto out;
  2608. }
  2609. /* Put the SJA1105 in programming mode */
  2610. rc = priv->info->reset_cmd(priv);
  2611. if (rc < 0) {
  2612. printf("Failed to reset switch\n");
  2613. goto out;
  2614. }
  2615. /* Wait for the switch to come out of reset */
  2616. udelay(1000);
  2617. /* Upload the static config to the device */
  2618. rc = sja1105_xfer_buf(priv, SPI_WRITE, regs->config,
  2619. config_buf, buf_len);
  2620. if (rc < 0) {
  2621. printf("Failed to upload config\n");
  2622. goto out;
  2623. }
  2624. /* Check that SJA1105 responded well to the config upload */
  2625. rc = sja1105_status_get(priv, &status);
  2626. if (rc < 0)
  2627. goto out;
  2628. if (status.ids == 1) {
  2629. printf("Mismatch between hardware and static config device id. "
  2630. "Wrote 0x%llx, wants 0x%llx\n",
  2631. config->device_id, priv->info->device_id);
  2632. rc = -EIO;
  2633. goto out;
  2634. }
  2635. if (status.crcchkl == 1 || status.crcchkg == 1) {
  2636. printf("Switch reported invalid CRC on static config\n");
  2637. rc = -EIO;
  2638. goto out;
  2639. }
  2640. if (status.configs == 0) {
  2641. printf("Switch reported that config is invalid\n");
  2642. rc = -EIO;
  2643. goto out;
  2644. }
  2645. out:
  2646. free(config_buf);
  2647. return rc;
  2648. }
  2649. static int sja1105_static_config_reload(struct sja1105_private *priv)
  2650. {
  2651. int rc;
  2652. rc = sja1105_static_config_upload(priv);
  2653. if (rc < 0) {
  2654. printf("Failed to load static config: %d\n", rc);
  2655. return rc;
  2656. }
  2657. /* Configure the CGU (PHY link modes and speeds) */
  2658. rc = sja1105_clocking_setup(priv);
  2659. if (rc < 0) {
  2660. printf("Failed to configure MII clocking: %d\n", rc);
  2661. return rc;
  2662. }
  2663. return 0;
  2664. }
  2665. static int sja1105_port_probe(struct udevice *dev, int port,
  2666. struct phy_device *phy)
  2667. {
  2668. struct sja1105_private *priv = dev_get_priv(dev);
  2669. ofnode node = dsa_port_get_ofnode(dev, port);
  2670. phy_interface_t phy_mode = phy->interface;
  2671. priv->xpcs_cfg[port].inband_an = ofnode_eth_uses_inband_aneg(node);
  2672. if (phy_mode == PHY_INTERFACE_MODE_MII ||
  2673. phy_mode == PHY_INTERFACE_MODE_RMII) {
  2674. phy->supported &= PHY_BASIC_FEATURES;
  2675. phy->advertising &= PHY_BASIC_FEATURES;
  2676. } else {
  2677. phy->supported &= PHY_GBIT_FEATURES;
  2678. phy->advertising &= PHY_GBIT_FEATURES;
  2679. }
  2680. return phy_config(phy);
  2681. }
  2682. static int sja1105_port_enable(struct udevice *dev, int port,
  2683. struct phy_device *phy)
  2684. {
  2685. struct sja1105_private *priv = dev_get_priv(dev);
  2686. phy_interface_t phy_mode = phy->interface;
  2687. struct sja1105_xmii_params_entry *mii;
  2688. struct sja1105_mac_config_entry *mac;
  2689. int rc;
  2690. rc = phy_startup(phy);
  2691. if (rc)
  2692. return rc;
  2693. mii = priv->static_config.tables[BLK_IDX_XMII_PARAMS].entries;
  2694. mac = priv->static_config.tables[BLK_IDX_MAC_CONFIG].entries;
  2695. switch (phy_mode) {
  2696. case PHY_INTERFACE_MODE_MII:
  2697. if (!priv->info->supports_mii[port])
  2698. goto unsupported;
  2699. mii->xmii_mode[port] = XMII_MODE_MII;
  2700. break;
  2701. case PHY_INTERFACE_MODE_RMII:
  2702. if (!priv->info->supports_rmii[port])
  2703. goto unsupported;
  2704. mii->xmii_mode[port] = XMII_MODE_RMII;
  2705. break;
  2706. case PHY_INTERFACE_MODE_RGMII:
  2707. case PHY_INTERFACE_MODE_RGMII_ID:
  2708. case PHY_INTERFACE_MODE_RGMII_RXID:
  2709. case PHY_INTERFACE_MODE_RGMII_TXID:
  2710. if (!priv->info->supports_rgmii[port])
  2711. goto unsupported;
  2712. mii->xmii_mode[port] = XMII_MODE_RGMII;
  2713. break;
  2714. case PHY_INTERFACE_MODE_SGMII:
  2715. if (!priv->info->supports_sgmii[port])
  2716. goto unsupported;
  2717. mii->xmii_mode[port] = XMII_MODE_SGMII;
  2718. mii->special[port] = true;
  2719. break;
  2720. unsupported:
  2721. default:
  2722. dev_err(dev, "Unsupported PHY mode %d on port %d!\n",
  2723. phy_mode, port);
  2724. return -EINVAL;
  2725. }
  2726. /* RevMII, RevRMII not supported */
  2727. mii->phy_mac[port] = XMII_MAC;
  2728. /* Let the PHY handle the RGMII delays, if present. */
  2729. if (phy->phy_id == PHY_FIXED_ID) {
  2730. if (phy_mode == PHY_INTERFACE_MODE_RGMII_RXID ||
  2731. phy_mode == PHY_INTERFACE_MODE_RGMII_ID)
  2732. priv->rgmii_rx_delay[port] = true;
  2733. if (phy_mode == PHY_INTERFACE_MODE_RGMII_TXID ||
  2734. phy_mode == PHY_INTERFACE_MODE_RGMII_ID)
  2735. priv->rgmii_tx_delay[port] = true;
  2736. if ((priv->rgmii_rx_delay[port] ||
  2737. priv->rgmii_tx_delay[port]) &&
  2738. !priv->info->setup_rgmii_delay) {
  2739. printf("Chip does not support internal RGMII delays\n");
  2740. return -EINVAL;
  2741. }
  2742. }
  2743. if (mii->xmii_mode[port] == XMII_MODE_SGMII) {
  2744. mac[port].speed = priv->info->port_speed[SJA1105_SPEED_1000MBPS];
  2745. priv->xpcs_cfg[port].speed = phy->speed;
  2746. } else if (phy->speed == SPEED_1000) {
  2747. mac[port].speed = priv->info->port_speed[SJA1105_SPEED_1000MBPS];
  2748. } else if (phy->speed == SPEED_100) {
  2749. mac[port].speed = priv->info->port_speed[SJA1105_SPEED_100MBPS];
  2750. } else if (phy->speed == SPEED_10) {
  2751. mac[port].speed = priv->info->port_speed[SJA1105_SPEED_10MBPS];
  2752. } else {
  2753. printf("Invalid PHY speed %d on port %d\n", phy->speed, port);
  2754. return -EINVAL;
  2755. }
  2756. return sja1105_static_config_reload(priv);
  2757. }
  2758. static void sja1105_port_disable(struct udevice *dev, int port,
  2759. struct phy_device *phy)
  2760. {
  2761. phy_shutdown(phy);
  2762. }
  2763. static int sja1105_xmit(struct udevice *dev, int port, void *packet, int length)
  2764. {
  2765. struct sja1105_private *priv = dev_get_priv(dev);
  2766. u8 *from = (u8 *)packet + VLAN_HLEN;
  2767. struct vlan_ethhdr *hdr = packet;
  2768. u8 *dest = (u8 *)packet;
  2769. memmove(dest, from, 2 * ETH_ALEN);
  2770. hdr->h_vlan_proto = htons(ETH_P_SJA1105);
  2771. hdr->h_vlan_TCI = htons(priv->pvid[port]);
  2772. return 0;
  2773. }
  2774. static int sja1105_rcv(struct udevice *dev, int *port, void *packet, int length)
  2775. {
  2776. struct vlan_ethhdr *hdr = packet;
  2777. u8 *dest = packet + VLAN_HLEN;
  2778. u8 *from = packet;
  2779. if (ntohs(hdr->h_vlan_proto) != ETH_P_SJA1105)
  2780. return -EINVAL;
  2781. *port = ntohs(hdr->h_vlan_TCI) & DSA_8021Q_PORT_MASK;
  2782. memmove(dest, from, 2 * ETH_ALEN);
  2783. return 0;
  2784. }
  2785. static const struct dsa_ops sja1105_dsa_ops = {
  2786. .port_probe = sja1105_port_probe,
  2787. .port_enable = sja1105_port_enable,
  2788. .port_disable = sja1105_port_disable,
  2789. .xmit = sja1105_xmit,
  2790. .rcv = sja1105_rcv,
  2791. };
  2792. static int sja1105_init(struct sja1105_private *priv)
  2793. {
  2794. int rc;
  2795. rc = sja1105_static_config_init(priv);
  2796. if (rc) {
  2797. printf("Failed to initialize static config: %d\n", rc);
  2798. return rc;
  2799. }
  2800. rc = sja1105_mdiobus_register(priv);
  2801. if (rc) {
  2802. printf("Failed to register MDIO bus: %d\n", rc);
  2803. goto err_mdiobus_register;
  2804. }
  2805. return 0;
  2806. err_mdiobus_register:
  2807. sja1105_static_config_free(&priv->static_config);
  2808. return rc;
  2809. }
  2810. static int sja1105_check_device_id(struct sja1105_private *priv)
  2811. {
  2812. const struct sja1105_regs *regs = priv->info->regs;
  2813. u8 packed_buf[SJA1105_SIZE_DEVICE_ID] = {0};
  2814. enum sja1105_switch_id id;
  2815. u64 device_id;
  2816. u64 part_no;
  2817. int rc;
  2818. rc = sja1105_xfer_buf(priv, SPI_READ, regs->device_id, packed_buf,
  2819. SJA1105_SIZE_DEVICE_ID);
  2820. if (rc < 0)
  2821. return rc;
  2822. sja1105_packing(packed_buf, &device_id, 31, 0, SJA1105_SIZE_DEVICE_ID,
  2823. UNPACK);
  2824. rc = sja1105_xfer_buf(priv, SPI_READ, regs->prod_id, packed_buf,
  2825. SJA1105_SIZE_DEVICE_ID);
  2826. if (rc < 0)
  2827. return rc;
  2828. sja1105_packing(packed_buf, &part_no, 19, 4, SJA1105_SIZE_DEVICE_ID,
  2829. UNPACK);
  2830. for (id = 0; id < SJA1105_MAX_SWITCH_ID; id++) {
  2831. const struct sja1105_info *info = &sja1105_info[id];
  2832. /* Is what's been probed in our match table at all? */
  2833. if (info->device_id != device_id || info->part_no != part_no)
  2834. continue;
  2835. /* But is it what's in the device tree? */
  2836. if (priv->info->device_id != device_id ||
  2837. priv->info->part_no != part_no) {
  2838. printf("Device tree specifies chip %s but found %s, please fix it!\n",
  2839. priv->info->name, info->name);
  2840. /* It isn't. No problem, pick that up. */
  2841. priv->info = info;
  2842. }
  2843. return 0;
  2844. }
  2845. printf("Unexpected {device ID, part number}: 0x%llx 0x%llx\n",
  2846. device_id, part_no);
  2847. return -ENODEV;
  2848. }
  2849. static int sja1105_probe(struct udevice *dev)
  2850. {
  2851. enum sja1105_switch_id id = dev_get_driver_data(dev);
  2852. struct sja1105_private *priv = dev_get_priv(dev);
  2853. int rc;
  2854. if (ofnode_valid(dev_ofnode(dev)) &&
  2855. !ofnode_is_enabled(dev_ofnode(dev))) {
  2856. dev_dbg(dev, "switch disabled\n");
  2857. return -ENODEV;
  2858. }
  2859. priv->info = &sja1105_info[id];
  2860. priv->dev = dev;
  2861. rc = sja1105_check_device_id(priv);
  2862. if (rc < 0) {
  2863. dev_err(dev, "Device ID check failed: %d\n", rc);
  2864. return rc;
  2865. }
  2866. dsa_set_tagging(dev, VLAN_HLEN, 0);
  2867. return sja1105_init(priv);
  2868. }
  2869. static int sja1105_remove(struct udevice *dev)
  2870. {
  2871. struct sja1105_private *priv = dev_get_priv(dev);
  2872. sja1105_mdiobus_unregister(priv);
  2873. sja1105_static_config_free(&priv->static_config);
  2874. return 0;
  2875. }
  2876. static const struct udevice_id sja1105_ids[] = {
  2877. { .compatible = "nxp,sja1105e", .data = SJA1105E },
  2878. { .compatible = "nxp,sja1105t", .data = SJA1105T },
  2879. { .compatible = "nxp,sja1105p", .data = SJA1105P },
  2880. { .compatible = "nxp,sja1105q", .data = SJA1105Q },
  2881. { .compatible = "nxp,sja1105r", .data = SJA1105R },
  2882. { .compatible = "nxp,sja1105s", .data = SJA1105S },
  2883. { .compatible = "nxp,sja1110a", .data = SJA1110A },
  2884. { .compatible = "nxp,sja1110b", .data = SJA1110B },
  2885. { .compatible = "nxp,sja1110c", .data = SJA1110C },
  2886. { .compatible = "nxp,sja1110d", .data = SJA1110D },
  2887. { }
  2888. };
  2889. U_BOOT_DRIVER(sja1105) = {
  2890. .name = "sja1105",
  2891. .id = UCLASS_DSA,
  2892. .of_match = sja1105_ids,
  2893. .probe = sja1105_probe,
  2894. .remove = sja1105_remove,
  2895. .ops = &sja1105_dsa_ops,
  2896. .priv_auto = sizeof(struct sja1105_private),
  2897. };