keystone_rio.c 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483
  1. /*
  2. * Texas Instruments Keystone RapidIO driver
  3. * Authors: Aurelien Jacquiot <a-jacquiot@ti.com>
  4. * WingMan Kwok <w-kwok2@ti.com>
  5. *
  6. * This is the Rapidio driver for Keystone devices. This is
  7. * required to support RapidIO functionality on K2HK devices.
  8. *
  9. * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
  10. *
  11. * Redistribution and use in source and binary forms, with or without
  12. * modification, are permitted provided that the following conditions
  13. * are met:
  14. *
  15. * Redistributions of source code must retain the above copyright
  16. * notice, this list of conditions and the following disclaimer.
  17. *
  18. * Redistributions in binary form must reproduce the above copyright
  19. * notice, this list of conditions and the following disclaimer in the
  20. * documentation and/or other materials provided with the
  21. * distribution.
  22. *
  23. * Neither the name of Texas Instruments Incorporated nor the names of
  24. * its contributors may be used to endorse or promote products derived
  25. * from this software without specific prior written permission.
  26. *
  27. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  28. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  29. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  30. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  31. * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  32. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  33. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  34. * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  35. * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  36. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  37. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  38. */
  39. #include <common.h>
  40. #include <command.h>
  41. #include <malloc.h>
  42. #include <asm/dma-mapping.h>
  43. #include <asm/io.h>
  44. #include <asm/arch/psc_defs.h>
  45. #include <linux/compat.h>
  46. #include <rio.h>
  47. #include "keystone_rio.h"
  48. #define DRIVER_VER "v2.0"
  49. #ifdef CONFIG_SOC_K2HK
  50. #define KEYSTONE_RIO_IS_K2 1
  51. #else
  52. #define KEYSTONE_RIO_IS_K2 0
  53. #endif
  54. #define K2_SERDES(p) ((p)->board_rio_cfg.keystone2_serdes)
  55. static unsigned int rio_dbg;
  56. #define debug_rio(fmt, args...) if (rio_dbg) printf(fmt, ##args)
  57. /*
  58. * Main KeyStone RapidIO driver data
  59. */
  60. struct keystone_rio_data {
  61. struct udevice *dev;
  62. int riohdid;
  63. u32 rio_pe_feat;
  64. u32 ports_registering;
  65. u32 port_chk_cnt;
  66. u8 lsu_start;
  67. u8 lsu_end;
  68. u8 lsu_free;
  69. u8 lsu_maint;
  70. u32 *jtagid_reg;
  71. u32 *serdes_sts_reg;
  72. struct keystone_srio_serdes_regs *serdes_regs;
  73. struct keystone_rio_regs *regs;
  74. struct keystone_rio_car_csr_regs *car_csr_regs;
  75. struct keystone_rio_serial_port_regs *serial_port_regs;
  76. struct keystone_rio_err_mgmt_regs *err_mgmt_regs;
  77. struct keystone_rio_phy_layer_regs *phy_regs;
  78. struct keystone_rio_transport_layer_regs *transport_regs;
  79. struct keystone_rio_pkt_buf_regs *pkt_buf_regs;
  80. struct keystone_rio_evt_mgmt_regs *evt_mgmt_regs;
  81. struct keystone_rio_port_write_regs *port_write_regs;
  82. struct keystone_rio_link_layer_regs *link_regs;
  83. struct keystone_rio_fabric_regs *fabric_regs;
  84. u32 car_csr_regs_base;
  85. };
  86. DECLARE_GLOBAL_DATA_PTR;
  87. #define krio_write_reg(r, v) writel(reg_val, reg)
  88. #define krio_read_reg(r) readl(reg)
  89. #define krio_read(k, r) readl(&k->regs->r)
  90. #define krio_write(k, r, v) writel((v), &k->regs->r)
  91. #define krio_car_csr_read(k, r) readl(&k->car_csr_regs->r)
  92. #define krio_car_csr_write(k, r, v) writel((v), &k->car_csr_regs->r)
  93. #define krio_car_csr_read_ofs(k, ofs) \
  94. readl((void *)k->car_csr_regs_base + ofs)
  95. #define krio_car_csr_write_ofs(k, ofs, v) \
  96. writel((v), (void *)(k->car_csr_regs_base + ofs))
  97. #define krio_sp_read(k, r) readl(&k->serial_port_regs->r)
  98. #define krio_sp_write(k, r, v) writel((v), &k->serial_port_regs->r)
  99. #define krio_err_read(k, r) readl(&k->err_mgmt_regs->r)
  100. #define krio_err_write(k, r, v) writel((v), &k->err_mgmt_regs->r)
  101. #define krio_phy_read(k, r) readl(&k->phy_regs->r)
  102. #define krio_phy_write(k, r, v) writel((v), &k->phy_regs->r)
  103. #define krio_tp_read(k, r) readl(&k->transport_regs->r)
  104. #define krio_tp_write(k, r, v) writel((v), &k->transport_regs->r)
  105. #define krio_pb_read(k, r) readl(&k->pkt_buf_regs->r)
  106. #define krio_pb_write(k, r, v) writel((v), &k->pkt_buf_regs->r)
  107. #define krio_ev_read(k, r) readl(&k->evt_mgmt_regs->r)
  108. #define krio_ev_write(k, r, v) writel((v), &k->evt_mgmt_regs->r)
  109. #define krio_pw_read(k, r) readl(&k->port_write_regs->r)
  110. #define krio_pw_write(k, r, v) writel((v), &k->port_write_regs->r)
  111. #define krio_lnk_read(k, r) readl(&k->link_regs->r)
  112. #define krio_lnk_write(k, r, v) writel((v), &k->link_regs->r)
  113. #define krio_fab_read(k, r) readl(&k->fabric_regs->r)
  114. #define krio_fab_write(k, r, v) writel((v), &k->fabric_regs->r)
  115. #define krio_sd_read(k, r) readl(&k->serdes_regs->r)
  116. #define krio_sd_write(k, r, v) writel((v), &k->serdes_regs->r)
  117. /*--------------------- Maintenance Request Management ---------------------*/
  118. static u32 keystone_rio_dio_get_lsu_cc(u32 lsu_id, u8 ltid, u8 *lcb,
  119. struct keystone_rio_data *krio_priv)
  120. {
  121. u32 idx;
  122. u32 shift;
  123. u32 value;
  124. u32 cc;
  125. /* lSU shadow register status mapping */
  126. u32 lsu_index[8] = { 0, 9, 15, 20, 24, 33, 39, 44 };
  127. /* Compute LSU stat index from LSU id and LTID */
  128. idx = (lsu_index[lsu_id] + ltid) >> 3;
  129. shift = ((lsu_index[lsu_id] + ltid) & 0x7) << 2;
  130. /* Get completion code and context */
  131. value = krio_read(krio_priv, lsu_stat_reg[idx]);
  132. cc = (value >> (shift + 1)) & 0x7;
  133. *lcb = (value >> shift) & 0x1;
  134. return cc;
  135. }
  136. /**
  137. * maint_request - Perform a maintenance request
  138. * @port_id: output port ID of transaction
  139. * @dest_id: destination ID of target device
  140. * @hopcount: hopcount for this request
  141. * @offset: offset in the RapidIO configuration space
  142. * @buff: dma address of the data on the host
  143. * @buff_len: length of the data
  144. * @size: 1 for 16bit, 0 for 8bit ID size
  145. * @type: packet type
  146. *
  147. * Returns %0 on success or %-1 on failure.
  148. */
  149. static inline int keystone_rio_maint_request(
  150. int port_id,
  151. u32 dest_id,
  152. u8 hopcount,
  153. u32 offset,
  154. dma_addr_t buff,
  155. int buff_len,
  156. u16 size,
  157. u16 type,
  158. struct keystone_rio_data *krio_priv)
  159. {
  160. unsigned int count;
  161. unsigned int status = 0;
  162. unsigned int res = 0;
  163. u8 context;
  164. u8 ltid;
  165. /* Check is there is space in the LSU shadow reg and that it is free */
  166. count = 0;
  167. while (1) {
  168. status = krio_read(krio_priv, lsu_reg[0].busy_full);
  169. if (((status & KEYSTONE_RIO_LSU_FULL_MASK) == 0x0) &&
  170. ((status & KEYSTONE_RIO_LSU_BUSY_MASK) == 0x0))
  171. break;
  172. count++;
  173. if (count >= KEYSTONE_RIO_TIMEOUT_CNT) {
  174. debug_rio("RIO: no LSU available, status = 0x%x\n",
  175. status);
  176. res = -1;
  177. goto out;
  178. }
  179. udelay(1);
  180. }
  181. /* Get LCB and LTID, LSU reg 6 is already read */
  182. context = (status >> 4) & 0x1;
  183. ltid = status & 0xf;
  184. /* LSU Reg 0 - MSB of RapidIO address */
  185. krio_write(krio_priv, lsu_reg[0].addr_msb, 0);
  186. /* LSU Reg 1 - LSB of destination */
  187. krio_write(krio_priv, lsu_reg[0].addr_lsb_cfg_ofs, offset);
  188. /* LSU Reg 2 - source address */
  189. krio_write(krio_priv, lsu_reg[0].dsp_addr, buff);
  190. /* LSU Reg 3 - byte count */
  191. krio_write(krio_priv, lsu_reg[0].dbell_val_byte_cnt, buff_len);
  192. /* LSU Reg 4 - */
  193. krio_write(krio_priv, lsu_reg[0].destid,
  194. ((port_id << 8)
  195. | (KEYSTONE_RIO_LSU_PRIO << 4)
  196. | (size ? BIT(10) : 0)
  197. | ((u32)dest_id << 16)));
  198. /* LSU Reg 5 */
  199. krio_write(krio_priv, lsu_reg[0].dbell_info_fttype,
  200. ((hopcount & 0xff) << 8) | (type & 0xff));
  201. /* Retrieve our completion code */
  202. count = 0;
  203. res = 0;
  204. while (1) {
  205. u8 lcb;
  206. status = keystone_rio_dio_get_lsu_cc(0, ltid, &lcb, krio_priv);
  207. if (lcb == context)
  208. break;
  209. count++;
  210. if (count >= KEYSTONE_RIO_TIMEOUT_CNT) {
  211. debug_rio(
  212. "RIO: timeout %d, ltid = %d, context = %d, lcb = %d, cc = %d\n",
  213. count, ltid, context, lcb, status);
  214. res = -2;
  215. break;
  216. }
  217. udelay(1);
  218. }
  219. out:
  220. if (res)
  221. return res;
  222. if (status)
  223. debug_rio("RIO: transfer error = 0x%x\n", status);
  224. switch (status) {
  225. case KEYSTONE_RIO_LSU_CC_TIMEOUT:
  226. case KEYSTONE_RIO_LSU_CC_XOFF:
  227. case KEYSTONE_RIO_LSU_CC_ERROR:
  228. case KEYSTONE_RIO_LSU_CC_INVALID:
  229. case KEYSTONE_RIO_LSU_CC_DMA:
  230. return -3;
  231. case KEYSTONE_RIO_LSU_CC_RETRY:
  232. return -4;
  233. case KEYSTONE_RIO_LSU_CC_CANCELED:
  234. return -5;
  235. default:
  236. break;
  237. }
  238. return 0;
  239. }
  240. /*------------------------- RapidIO hw controller setup ---------------------*/
  241. struct keystone_lane_config {
  242. int start; /* lane start number of the port */
  243. int end; /* lane end number of the port */
  244. };
  245. /*
  246. * Table with the various lanes per port configuration modes:
  247. * path mode 0: 4 ports in 1x
  248. * path mode 1: 3 ports in 2x/1x
  249. * path mode 2: 3 ports in 1x/2x
  250. * path mode 3: 2 ports in 2x
  251. * path mode 4: 1 ports in 4x
  252. */
  253. static struct keystone_lane_config keystone_lane_configs[5][4] = {
  254. { {0, 1}, {1, 2}, {2, 3}, {3, 4} },
  255. { {0, 2}, {-1, -1}, {2, 3}, {3, 4} },
  256. { {0, 1}, {1, 2}, {2, 4}, {-1, -1} },
  257. { {0, 2}, {-1, -1}, {2, 4}, {-1, -1} },
  258. { {0, 4}, {-1, -1}, {-1, -1}, {-1, -1} },
  259. };
  260. /* Retrieve the corresponding lanes bitmask from ports bitmask and path_mode */
  261. static int keystone_rio_get_lane_config(u32 ports, u32 path_mode)
  262. {
  263. u32 lanes = 0;
  264. while (ports) {
  265. u32 lane;
  266. u32 port = ffs(ports) - 1;
  267. ports &= ~BIT(port);
  268. if (keystone_lane_configs[path_mode][port].start == -1)
  269. return -1;
  270. for (lane = keystone_lane_configs[path_mode][port].start;
  271. lane < keystone_lane_configs[path_mode][port].end;
  272. lane++) {
  273. lanes |= BIT(lane);
  274. }
  275. }
  276. return (int)lanes;
  277. }
  278. /* Serdes Config Begin */
  279. #define reg_fmkr(msb, lsb, val) \
  280. (((val) & ((BIT((msb) - (lsb) + 1)) - 1)) << (lsb))
  281. #define reg_finsr(addr, msb, lsb, val) \
  282. writel(((readl(addr) \
  283. & ~(((BIT((msb) - (lsb) + 1)) - 1) << (lsb))) \
  284. | reg_fmkr(msb, lsb, val)), (addr))
  285. static void k2_rio_serdes_init_3g(u32 lanes,
  286. struct keystone_rio_data *krio_priv)
  287. {
  288. void __iomem *reg = (void __iomem *)krio_priv->serdes_regs;
  289. reg_finsr((reg + 0x0000), 31, 24, 0x00);
  290. reg_finsr((reg + 0x0014), 7, 0, 0x82);
  291. reg_finsr((reg + 0x0014), 15, 8, 0x82);
  292. reg_finsr((reg + 0x0060), 7, 0, 0x48);
  293. reg_finsr((reg + 0x0060), 15, 8, 0x2c);
  294. reg_finsr((reg + 0x0060), 23, 16, 0x13);
  295. reg_finsr((reg + 0x0064), 15, 8, 0xc7);
  296. reg_finsr((reg + 0x0064), 23, 16, 0xc3);
  297. reg_finsr((reg + 0x0078), 15, 8, 0xc0);
  298. reg_finsr((reg + 0x0204), 7, 0, 0x80);
  299. reg_finsr((reg + 0x0204), 31, 24, 0x78);
  300. reg_finsr((reg + 0x0208), 7, 0, 0x24);
  301. reg_finsr((reg + 0x0208), 23, 16, 0x01);
  302. reg_finsr((reg + 0x020c), 31, 24, 0x02);
  303. reg_finsr((reg + 0x0210), 31, 24, 0x1b);
  304. reg_finsr((reg + 0x0214), 7, 0, 0x7c);
  305. reg_finsr((reg + 0x0214), 15, 8, 0x6e);
  306. reg_finsr((reg + 0x0218), 7, 0, 0xe4);
  307. reg_finsr((reg + 0x0218), 23, 16, 0x80);
  308. reg_finsr((reg + 0x0218), 31, 24, 0x7a);
  309. reg_finsr((reg + 0x022c), 15, 8, 0x08);
  310. reg_finsr((reg + 0x022c), 23, 16, 0x30);
  311. reg_finsr((reg + 0x0280), 7, 0, 0x70);
  312. reg_finsr((reg + 0x0280), 23, 16, 0x70);
  313. reg_finsr((reg + 0x0284), 7, 0, 0x85);
  314. reg_finsr((reg + 0x0284), 23, 16, 0x0f);
  315. reg_finsr((reg + 0x0284), 31, 24, 0x1d);
  316. reg_finsr((reg + 0x028c), 15, 8, 0x3b);
  317. reg_finsr((reg + 0x0404), 7, 0, 0x80);
  318. reg_finsr((reg + 0x0404), 31, 24, 0x78);
  319. reg_finsr((reg + 0x0408), 7, 0, 0x24);
  320. reg_finsr((reg + 0x0408), 23, 16, 0x01);
  321. reg_finsr((reg + 0x040c), 31, 24, 0x02);
  322. reg_finsr((reg + 0x0410), 31, 24, 0x1b);
  323. reg_finsr((reg + 0x0414), 7, 0, 0x7c);
  324. reg_finsr((reg + 0x0414), 15, 8, 0x6e);
  325. reg_finsr((reg + 0x0418), 7, 0, 0xe4);
  326. reg_finsr((reg + 0x0418), 23, 16, 0x80);
  327. reg_finsr((reg + 0x0418), 31, 24, 0x7a);
  328. reg_finsr((reg + 0x042c), 15, 8, 0x08);
  329. reg_finsr((reg + 0x042c), 23, 16, 0x30);
  330. reg_finsr((reg + 0x0480), 7, 0, 0x70);
  331. reg_finsr((reg + 0x0480), 23, 16, 0x70);
  332. reg_finsr((reg + 0x0484), 7, 0, 0x85);
  333. reg_finsr((reg + 0x0484), 23, 16, 0x0f);
  334. reg_finsr((reg + 0x0484), 31, 24, 0x1d);
  335. reg_finsr((reg + 0x048c), 15, 8, 0x3b);
  336. reg_finsr((reg + 0x0604), 7, 0, 0x80);
  337. reg_finsr((reg + 0x0604), 31, 24, 0x78);
  338. reg_finsr((reg + 0x0608), 7, 0, 0x24);
  339. reg_finsr((reg + 0x0608), 23, 16, 0x01);
  340. reg_finsr((reg + 0x060c), 31, 24, 0x02);
  341. reg_finsr((reg + 0x0610), 31, 24, 0x1b);
  342. reg_finsr((reg + 0x0614), 7, 0, 0x7c);
  343. reg_finsr((reg + 0x0614), 15, 8, 0x6e);
  344. reg_finsr((reg + 0x0618), 7, 0, 0xe4);
  345. reg_finsr((reg + 0x0618), 23, 16, 0x80);
  346. reg_finsr((reg + 0x0618), 31, 24, 0x7a);
  347. reg_finsr((reg + 0x062c), 15, 8, 0x08);
  348. reg_finsr((reg + 0x062c), 23, 16, 0x30);
  349. reg_finsr((reg + 0x0680), 7, 0, 0x70);
  350. reg_finsr((reg + 0x0680), 23, 16, 0x70);
  351. reg_finsr((reg + 0x0684), 7, 0, 0x85);
  352. reg_finsr((reg + 0x0684), 23, 16, 0x0f);
  353. reg_finsr((reg + 0x0684), 31, 24, 0x1d);
  354. reg_finsr((reg + 0x068c), 15, 8, 0x3b);
  355. reg_finsr((reg + 0x0804), 7, 0, 0x80);
  356. reg_finsr((reg + 0x0804), 31, 24, 0x78);
  357. reg_finsr((reg + 0x0808), 7, 0, 0x24);
  358. reg_finsr((reg + 0x0808), 23, 16, 0x01);
  359. reg_finsr((reg + 0x080c), 31, 24, 0x02);
  360. reg_finsr((reg + 0x0810), 31, 24, 0x1b);
  361. reg_finsr((reg + 0x0814), 7, 0, 0x7c);
  362. reg_finsr((reg + 0x0814), 15, 8, 0x6e);
  363. reg_finsr((reg + 0x0818), 7, 0, 0xe4);
  364. reg_finsr((reg + 0x0818), 23, 16, 0x80);
  365. reg_finsr((reg + 0x0818), 31, 24, 0x7a);
  366. reg_finsr((reg + 0x082c), 15, 8, 0x08);
  367. reg_finsr((reg + 0x082c), 23, 16, 0x30);
  368. reg_finsr((reg + 0x0880), 7, 0, 0x70);
  369. reg_finsr((reg + 0x0880), 23, 16, 0x70);
  370. reg_finsr((reg + 0x0884), 7, 0, 0x85);
  371. reg_finsr((reg + 0x0884), 23, 16, 0x0f);
  372. reg_finsr((reg + 0x0884), 31, 24, 0x1d);
  373. reg_finsr((reg + 0x088c), 15, 8, 0x3b);
  374. reg_finsr((reg + 0x0a00), 15, 8, 0x08);
  375. reg_finsr((reg + 0x0a08), 23, 16, 0x72);
  376. reg_finsr((reg + 0x0a08), 31, 24, 0x37);
  377. reg_finsr((reg + 0x0a30), 15, 8, 0x77);
  378. reg_finsr((reg + 0x0a30), 23, 16, 0x77);
  379. reg_finsr((reg + 0x0a84), 15, 8, 0x07);
  380. reg_finsr((reg + 0x0a94), 31, 24, 0x10);
  381. reg_finsr((reg + 0x0aa0), 31, 24, 0x81);
  382. reg_finsr((reg + 0x0abc), 31, 24, 0xff);
  383. reg_finsr((reg + 0x0ac0), 7, 0, 0x8b);
  384. reg_finsr((reg + 0x0a48), 15, 8, 0x8c);
  385. reg_finsr((reg + 0x0a48), 23, 16, 0xfd);
  386. reg_finsr((reg + 0x0a54), 7, 0, 0x72);
  387. reg_finsr((reg + 0x0a54), 15, 8, 0xec);
  388. reg_finsr((reg + 0x0a54), 23, 16, 0x2f);
  389. reg_finsr((reg + 0x0a58), 15, 8, 0x21);
  390. reg_finsr((reg + 0x0a58), 23, 16, 0xf9);
  391. reg_finsr((reg + 0x0a58), 31, 24, 0x00);
  392. reg_finsr((reg + 0x0a5c), 7, 0, 0x60);
  393. reg_finsr((reg + 0x0a5c), 15, 8, 0x00);
  394. reg_finsr((reg + 0x0a5c), 23, 16, 0x04);
  395. reg_finsr((reg + 0x0a5c), 31, 24, 0x00);
  396. reg_finsr((reg + 0x0a60), 7, 0, 0x00);
  397. reg_finsr((reg + 0x0a60), 15, 8, 0x80);
  398. reg_finsr((reg + 0x0a60), 23, 16, 0x00);
  399. reg_finsr((reg + 0x0a60), 31, 24, 0x00);
  400. reg_finsr((reg + 0x0a64), 7, 0, 0x20);
  401. reg_finsr((reg + 0x0a64), 15, 8, 0x12);
  402. reg_finsr((reg + 0x0a64), 23, 16, 0x58);
  403. reg_finsr((reg + 0x0a64), 31, 24, 0x0c);
  404. reg_finsr((reg + 0x0a68), 7, 0, 0x02);
  405. reg_finsr((reg + 0x0a68), 15, 8, 0x06);
  406. reg_finsr((reg + 0x0a68), 23, 16, 0x3b);
  407. reg_finsr((reg + 0x0a68), 31, 24, 0xe1);
  408. reg_finsr((reg + 0x0a6c), 7, 0, 0xc1);
  409. reg_finsr((reg + 0x0a6c), 15, 8, 0x4c);
  410. reg_finsr((reg + 0x0a6c), 23, 16, 0x07);
  411. reg_finsr((reg + 0x0a6c), 31, 24, 0xb8);
  412. reg_finsr((reg + 0x0a70), 7, 0, 0x89);
  413. reg_finsr((reg + 0x0a70), 15, 8, 0xe9);
  414. reg_finsr((reg + 0x0a70), 23, 16, 0x02);
  415. reg_finsr((reg + 0x0a70), 31, 24, 0x3f);
  416. reg_finsr((reg + 0x0a74), 7, 0, 0x01);
  417. reg_finsr((reg + 0x0b20), 23, 16, 0x37);
  418. reg_finsr((reg + 0x0b1c), 31, 24, 0x37);
  419. reg_finsr((reg + 0x0b20), 7, 0, 0x5d);
  420. reg_finsr((reg + 0x0000), 7, 0, 0x03);
  421. reg_finsr((reg + 0x0a00), 7, 0, 0x5f);
  422. }
  423. static void k2_rio_serdes_init_5g(u32 lanes,
  424. struct keystone_rio_data *krio_priv)
  425. {
  426. void __iomem *reg = (void __iomem *)krio_priv->serdes_regs;
  427. reg_finsr((reg + 0x0000), 31, 24, 0x00);
  428. reg_finsr((reg + 0x0014), 7, 0, 0x82);
  429. reg_finsr((reg + 0x0014), 15, 8, 0x82);
  430. reg_finsr((reg + 0x0060), 7, 0, 0x38);
  431. reg_finsr((reg + 0x0060), 15, 8, 0x24);
  432. reg_finsr((reg + 0x0060), 23, 16, 0x14);
  433. reg_finsr((reg + 0x0064), 15, 8, 0xc7);
  434. reg_finsr((reg + 0x0064), 23, 16, 0xc3);
  435. reg_finsr((reg + 0x0078), 15, 8, 0xc0);
  436. reg_finsr((reg + 0x0204), 7, 0, 0x80);
  437. reg_finsr((reg + 0x0204), 31, 24, 0x78);
  438. reg_finsr((reg + 0x0208), 7, 0, 0x26);
  439. reg_finsr((reg + 0x0208), 23, 16, 0x01);
  440. reg_finsr((reg + 0x020c), 31, 24, 0x02);
  441. reg_finsr((reg + 0x0214), 7, 0, 0x38);
  442. reg_finsr((reg + 0x0214), 15, 8, 0x6f);
  443. reg_finsr((reg + 0x0218), 7, 0, 0xe4);
  444. reg_finsr((reg + 0x0218), 23, 16, 0x80);
  445. reg_finsr((reg + 0x0218), 31, 24, 0x7a);
  446. reg_finsr((reg + 0x022c), 15, 8, 0x08);
  447. reg_finsr((reg + 0x022c), 23, 16, 0x30);
  448. reg_finsr((reg + 0x0280), 7, 0, 0x86);
  449. reg_finsr((reg + 0x0280), 23, 16, 0x86);
  450. reg_finsr((reg + 0x0284), 7, 0, 0x85);
  451. reg_finsr((reg + 0x0284), 23, 16, 0x0f);
  452. reg_finsr((reg + 0x0284), 31, 24, 0x1d);
  453. reg_finsr((reg + 0x028c), 15, 8, 0x2c);
  454. reg_finsr((reg + 0x0404), 7, 0, 0x80);
  455. reg_finsr((reg + 0x0404), 31, 24, 0x78);
  456. reg_finsr((reg + 0x0408), 7, 0, 0x26);
  457. reg_finsr((reg + 0x0408), 23, 16, 0x01);
  458. reg_finsr((reg + 0x040c), 31, 24, 0x02);
  459. reg_finsr((reg + 0x0414), 7, 0, 0x38);
  460. reg_finsr((reg + 0x0414), 15, 8, 0x6f);
  461. reg_finsr((reg + 0x0418), 7, 0, 0xe4);
  462. reg_finsr((reg + 0x0418), 23, 16, 0x80);
  463. reg_finsr((reg + 0x0418), 31, 24, 0x7a);
  464. reg_finsr((reg + 0x042c), 15, 8, 0x08);
  465. reg_finsr((reg + 0x042c), 23, 16, 0x30);
  466. reg_finsr((reg + 0x0480), 7, 0, 0x86);
  467. reg_finsr((reg + 0x0480), 23, 16, 0x86);
  468. reg_finsr((reg + 0x0484), 7, 0, 0x85);
  469. reg_finsr((reg + 0x0484), 23, 16, 0x0f);
  470. reg_finsr((reg + 0x0484), 31, 24, 0x1d);
  471. reg_finsr((reg + 0x048c), 15, 8, 0x2c);
  472. reg_finsr((reg + 0x0604), 7, 0, 0x80);
  473. reg_finsr((reg + 0x0604), 31, 24, 0x78);
  474. reg_finsr((reg + 0x0608), 7, 0, 0x26);
  475. reg_finsr((reg + 0x0608), 23, 16, 0x01);
  476. reg_finsr((reg + 0x060c), 31, 24, 0x02);
  477. reg_finsr((reg + 0x0614), 7, 0, 0x38);
  478. reg_finsr((reg + 0x0614), 15, 8, 0x6f);
  479. reg_finsr((reg + 0x0618), 7, 0, 0xe4);
  480. reg_finsr((reg + 0x0618), 23, 16, 0x80);
  481. reg_finsr((reg + 0x0618), 31, 24, 0x7a);
  482. reg_finsr((reg + 0x062c), 15, 8, 0x08);
  483. reg_finsr((reg + 0x062c), 23, 16, 0x30);
  484. reg_finsr((reg + 0x0680), 7, 0, 0x86);
  485. reg_finsr((reg + 0x0680), 23, 16, 0x86);
  486. reg_finsr((reg + 0x0684), 7, 0, 0x85);
  487. reg_finsr((reg + 0x0684), 23, 16, 0x0f);
  488. reg_finsr((reg + 0x0684), 31, 24, 0x1d);
  489. reg_finsr((reg + 0x068c), 15, 8, 0x2c);
  490. reg_finsr((reg + 0x0804), 7, 0, 0x80);
  491. reg_finsr((reg + 0x0804), 31, 24, 0x78);
  492. reg_finsr((reg + 0x0808), 7, 0, 0x26);
  493. reg_finsr((reg + 0x0808), 23, 16, 0x01);
  494. reg_finsr((reg + 0x080c), 31, 24, 0x02);
  495. reg_finsr((reg + 0x0814), 7, 0, 0x38);
  496. reg_finsr((reg + 0x0814), 15, 8, 0x6f);
  497. reg_finsr((reg + 0x0818), 7, 0, 0xe4);
  498. reg_finsr((reg + 0x0818), 23, 16, 0x80);
  499. reg_finsr((reg + 0x0818), 31, 24, 0x7a);
  500. reg_finsr((reg + 0x082c), 15, 8, 0x08);
  501. reg_finsr((reg + 0x082c), 23, 16, 0x30);
  502. reg_finsr((reg + 0x0880), 7, 0, 0x86);
  503. reg_finsr((reg + 0x0880), 23, 16, 0x86);
  504. reg_finsr((reg + 0x0884), 7, 0, 0x85);
  505. reg_finsr((reg + 0x0884), 23, 16, 0x0f);
  506. reg_finsr((reg + 0x0884), 31, 24, 0x1d);
  507. reg_finsr((reg + 0x088c), 15, 8, 0x2c);
  508. reg_finsr((reg + 0x0a00), 15, 8, 0x80);
  509. reg_finsr((reg + 0x0a08), 23, 16, 0xd2);
  510. reg_finsr((reg + 0x0a08), 31, 24, 0x38);
  511. reg_finsr((reg + 0x0a30), 15, 8, 0x8d);
  512. reg_finsr((reg + 0x0a30), 23, 16, 0x8d);
  513. reg_finsr((reg + 0x0a84), 15, 8, 0x07);
  514. reg_finsr((reg + 0x0a94), 31, 24, 0x10);
  515. reg_finsr((reg + 0x0aa0), 31, 24, 0x81);
  516. reg_finsr((reg + 0x0abc), 31, 24, 0xff);
  517. reg_finsr((reg + 0x0ac0), 7, 0, 0x8b);
  518. reg_finsr((reg + 0x0a48), 15, 8, 0x8c);
  519. reg_finsr((reg + 0x0a48), 23, 16, 0xfd);
  520. reg_finsr((reg + 0x0a54), 7, 0, 0x72);
  521. reg_finsr((reg + 0x0a54), 15, 8, 0xec);
  522. reg_finsr((reg + 0x0a54), 23, 16, 0x2f);
  523. reg_finsr((reg + 0x0a58), 15, 8, 0x21);
  524. reg_finsr((reg + 0x0a58), 23, 16, 0xf9);
  525. reg_finsr((reg + 0x0a58), 31, 24, 0x00);
  526. reg_finsr((reg + 0x0a5c), 7, 0, 0x60);
  527. reg_finsr((reg + 0x0a5c), 15, 8, 0x00);
  528. reg_finsr((reg + 0x0a5c), 23, 16, 0x04);
  529. reg_finsr((reg + 0x0a5c), 31, 24, 0x00);
  530. reg_finsr((reg + 0x0a60), 7, 0, 0x00);
  531. reg_finsr((reg + 0x0a60), 15, 8, 0x80);
  532. reg_finsr((reg + 0x0a60), 23, 16, 0x00);
  533. reg_finsr((reg + 0x0a60), 31, 24, 0x00);
  534. reg_finsr((reg + 0x0a64), 7, 0, 0x20);
  535. reg_finsr((reg + 0x0a64), 15, 8, 0x12);
  536. reg_finsr((reg + 0x0a64), 23, 16, 0x58);
  537. reg_finsr((reg + 0x0a64), 31, 24, 0x0c);
  538. reg_finsr((reg + 0x0a68), 7, 0, 0x02);
  539. reg_finsr((reg + 0x0a68), 15, 8, 0x06);
  540. reg_finsr((reg + 0x0a68), 23, 16, 0x3b);
  541. reg_finsr((reg + 0x0a68), 31, 24, 0xe1);
  542. reg_finsr((reg + 0x0a6c), 7, 0, 0xc1);
  543. reg_finsr((reg + 0x0a6c), 15, 8, 0x4c);
  544. reg_finsr((reg + 0x0a6c), 23, 16, 0x07);
  545. reg_finsr((reg + 0x0a6c), 31, 24, 0xb8);
  546. reg_finsr((reg + 0x0a70), 7, 0, 0x89);
  547. reg_finsr((reg + 0x0a70), 15, 8, 0xe9);
  548. reg_finsr((reg + 0x0a70), 23, 16, 0x02);
  549. reg_finsr((reg + 0x0a70), 31, 24, 0x3f);
  550. reg_finsr((reg + 0x0a74), 7, 0, 0x01);
  551. reg_finsr((reg + 0x0b20), 23, 16, 0x37);
  552. reg_finsr((reg + 0x0b1c), 31, 24, 0x37);
  553. reg_finsr((reg + 0x0b20), 7, 0, 0x5d);
  554. reg_finsr((reg + 0x0000), 7, 0, 0x03);
  555. reg_finsr((reg + 0x0a00), 7, 0, 0x5f);
  556. }
  557. static void k2_rio_serdes_lane_enable(u32 lane, u32 rate,
  558. struct keystone_rio_data *krio_priv)
  559. {
  560. void *regs = (void *)krio_priv->serdes_regs;
  561. u32 val;
  562. val = readl(regs + 0x200 * (lane + 1) + 0x28);
  563. val &= ~BIT(29);
  564. writel(val, regs + 0x200 * (lane + 1) + 0x28);
  565. switch (rate) {
  566. case KEYSTONE_RIO_FULL_RATE:
  567. writel(0xF0C0F0F0, regs + 0x1fe0 + 4 * lane);
  568. break;
  569. case KEYSTONE_RIO_HALF_RATE:
  570. writel(0xF4C0F4F0, regs + 0x1fe0 + 4 * lane);
  571. break;
  572. case KEYSTONE_RIO_QUARTER_RATE:
  573. writel(0xF8C0F8F0, regs + 0x1fe0 + 4 * lane);
  574. break;
  575. default:
  576. return;
  577. }
  578. }
  579. static int k2_rio_serdes_config(u32 lanes, u32 baud,
  580. struct keystone_rio_data *krio_priv)
  581. {
  582. void *regs = (void *)krio_priv->serdes_regs;
  583. u32 rate;
  584. u32 val;
  585. writel(0x00000000, regs + 0x1ff4);
  586. switch (baud) {
  587. case KEYSTONE_RIO_BAUD_1_250:
  588. rate = KEYSTONE_RIO_QUARTER_RATE;
  589. k2_rio_serdes_init_5g(lanes, krio_priv);
  590. break;
  591. case KEYSTONE_RIO_BAUD_2_500:
  592. rate = KEYSTONE_RIO_HALF_RATE;
  593. k2_rio_serdes_init_5g(lanes, krio_priv);
  594. break;
  595. case KEYSTONE_RIO_BAUD_5_000:
  596. rate = KEYSTONE_RIO_FULL_RATE;
  597. k2_rio_serdes_init_5g(lanes, krio_priv);
  598. break;
  599. case KEYSTONE_RIO_BAUD_3_125:
  600. rate = KEYSTONE_RIO_HALF_RATE;
  601. k2_rio_serdes_init_3g(lanes, krio_priv);
  602. break;
  603. default:
  604. printf("RIO: unsupported baud rate %d\n", baud);
  605. return -1;
  606. }
  607. while (lanes) {
  608. u32 lane = ffs(lanes) - 1;
  609. lanes &= ~BIT(lane);
  610. if (lane >= KEYSTONE_RIO_MAX_PORT)
  611. return -1;
  612. k2_rio_serdes_lane_enable(lane, rate, krio_priv);
  613. }
  614. writel(0xe0000000, regs + 0x1ff4);
  615. do {
  616. val = readl(regs + 0xbf8);
  617. } while (!(val & BIT(16)));
  618. return 0;
  619. }
  620. static int k2_rio_serdes_wait_lock(struct keystone_rio_data *krio_priv,
  621. u32 lanes)
  622. {
  623. u32 loop;
  624. u32 val;
  625. u32 val_mask;
  626. void *regs = (void *)krio_priv->serdes_regs;
  627. val_mask = lanes | (lanes << 8);
  628. for (loop = 0; loop < 100000; loop++) {
  629. val = readl(regs + 0x1ff4);
  630. if ((val & val_mask) == val_mask)
  631. break;
  632. udelay(10);
  633. }
  634. if (loop == 100000)
  635. return -1;
  636. return 0;
  637. }
  638. /* Serdes Config End */
  639. /**
  640. * keystone_rio_hw_init - Configure a RapidIO controller
  641. * @mode: serdes configuration
  642. * @hostid: device id of the host
  643. */
  644. static void keystone_rio_hw_init(u32 mode, u32 baud,
  645. struct keystone_rio_data *krio_priv)
  646. {
  647. struct keystone_rio_pdata *pdata = dev_get_platdata(krio_priv->dev);
  648. struct keystone_serdes_config *serdes_config = &pdata->serdes_config;
  649. u32 val;
  650. u32 block;
  651. /* Set sRIO out of reset */
  652. krio_write(krio_priv, pcr, 0x00000011);
  653. /* Clear BOOT_COMPLETE bit (allowing write) */
  654. krio_write(krio_priv, per_set_cntl, 0x00000000);
  655. /* Enable blocks */
  656. krio_write(krio_priv, gbl_en, 1);
  657. for (block = 0; block <= KEYSTONE_RIO_BLK_NUM; block++)
  658. krio_write(krio_priv, blk[block].enable, 1);
  659. /* Set control register 1 configuration */
  660. krio_write(krio_priv, per_set_cntl1, 0x00000000);
  661. /* Set Control register */
  662. krio_write(krio_priv, per_set_cntl, serdes_config->cfg_cntl);
  663. if (pdata->keystone2_serdes) {
  664. u32 path_mode = pdata->path_mode;
  665. u32 ports = pdata->ports;
  666. int res;
  667. res = keystone_rio_get_lane_config(ports, path_mode);
  668. if (res > 0) {
  669. u32 lanes = (u32)res;
  670. res = k2_rio_serdes_config(lanes, baud, krio_priv);
  671. }
  672. } else {
  673. u32 port;
  674. krio_sd_write(krio_priv, pll, serdes_config->serdes_cfg_pll);
  675. for (port = 0; port < KEYSTONE_RIO_MAX_PORT; port++) {
  676. krio_sd_write(krio_priv, channel[port].rx,
  677. serdes_config->rx_chan_config[port]);
  678. krio_sd_write(krio_priv, channel[port].tx,
  679. serdes_config->tx_chan_config[port]);
  680. }
  681. do {
  682. val = readl(krio_priv->serdes_sts_reg);
  683. } while ((val & 0x1) != 0x1);
  684. }
  685. /* Set prescalar for ip_clk */
  686. krio_lnk_write(krio_priv, prescalar_srv_clk,
  687. serdes_config->prescalar_srv_clk);
  688. /* Peripheral-specific configuration and capabilities */
  689. krio_car_csr_write(krio_priv, dev_id, KEYSTONE_RIO_DEV_ID_VAL);
  690. krio_car_csr_write(krio_priv, dev_info, KEYSTONE_RIO_DEV_INFO_VAL);
  691. krio_car_csr_write(krio_priv, assembly_id, KEYSTONE_RIO_ID_TI);
  692. krio_car_csr_write(krio_priv, assembly_info, KEYSTONE_RIO_EXT_FEAT_PTR);
  693. /* Set host device id */
  694. krio_car_csr_write(krio_priv, base_dev_id,
  695. (krio_priv->riohdid & 0xffff)
  696. | ((krio_priv->riohdid & 0xff) << 16));
  697. krio_priv->rio_pe_feat = RIO_PEF_PROCESSOR
  698. | RIO_PEF_CTLS
  699. | KEYSTONE_RIO_PEF_FLOW_CONTROL
  700. | RIO_PEF_EXT_FEATURES
  701. | RIO_PEF_ADDR_34
  702. | RIO_PEF_STD_RT
  703. | RIO_PEF_INB_DOORBELL
  704. | RIO_PEF_INB_MBOX;
  705. krio_car_csr_write(krio_priv, pe_feature, krio_priv->rio_pe_feat);
  706. krio_car_csr_write(krio_priv, sw_port, KEYSTONE_RIO_MAX_PORT << 8);
  707. krio_car_csr_write(krio_priv, src_op,
  708. (RIO_SRC_OPS_READ
  709. | RIO_SRC_OPS_WRITE
  710. | RIO_SRC_OPS_STREAM_WRITE
  711. | RIO_SRC_OPS_WRITE_RESPONSE
  712. | RIO_SRC_OPS_DATA_MSG
  713. | RIO_SRC_OPS_DOORBELL
  714. | RIO_SRC_OPS_ATOMIC_TST_SWP
  715. | RIO_SRC_OPS_ATOMIC_INC
  716. | RIO_SRC_OPS_ATOMIC_DEC
  717. | RIO_SRC_OPS_ATOMIC_SET
  718. | RIO_SRC_OPS_ATOMIC_CLR
  719. | RIO_SRC_OPS_PORT_WRITE));
  720. krio_car_csr_write(krio_priv, dest_op,
  721. (RIO_DST_OPS_READ
  722. | RIO_DST_OPS_WRITE
  723. | RIO_DST_OPS_STREAM_WRITE
  724. | RIO_DST_OPS_WRITE_RESPONSE
  725. | RIO_DST_OPS_DATA_MSG
  726. | RIO_DST_OPS_DOORBELL
  727. | RIO_DST_OPS_PORT_WRITE));
  728. krio_car_csr_write(krio_priv, pe_logical_ctl, RIO_PELL_ADDR_34);
  729. val = (((KEYSTONE_RIO_SP_HDR_NEXT_BLK_PTR & 0xffff) << 16) |
  730. KEYSTONE_RIO_SP_HDR_EP_REC_ID);
  731. krio_sp_write(krio_priv, sp_maint_blk_hdr, val);
  732. /* clear high bits of local config space base addr */
  733. krio_car_csr_write(krio_priv, local_cfg_hbar, 0x00000000);
  734. /* set local config space base addr */
  735. krio_car_csr_write(krio_priv, local_cfg_bar, 0x00520000);
  736. /* Enable HOST & MASTER_ENABLE bits */
  737. krio_sp_write(krio_priv, sp_gen_ctl, 0xe0000000);
  738. /* set link timeout value */
  739. krio_sp_write(krio_priv, sp_link_timeout_ctl, 0x000FFF00);
  740. /* set response timeout value */
  741. krio_sp_write(krio_priv, sp_rsp_timeout_ctl, 0x000FFF00);
  742. /* allows SELF_RESET and PWDN_PORT resets to clear sticky reg bits */
  743. krio_lnk_write(krio_priv, reg_rst_ctl, 0x00000001);
  744. /* Set error detection mode */
  745. /* clear all errors */
  746. krio_err_write(krio_priv, err_det, 0x00000000);
  747. /* enable all error detection */
  748. krio_err_write(krio_priv, err_en, 0x00000000);
  749. /* set err det block header */
  750. val = (((KEYSTONE_RIO_ERR_HDR_NEXT_BLK_PTR & 0xffff) << 16) |
  751. KEYSTONE_RIO_ERR_EXT_FEAT_ID);
  752. krio_err_write(krio_priv, err_report_blk_hdr, val);
  753. /* clear msb of err catptured addr reg */
  754. krio_err_write(krio_priv, h_addr_capt, 0x00000000);
  755. /* clear lsb of err catptured addr reg */
  756. krio_err_write(krio_priv, addr_capt, 0x00000000);
  757. /* clear err catptured source and dest devID reg */
  758. krio_err_write(krio_priv, id_capt, 0x00000000);
  759. /* clear err catptured packet info */
  760. krio_err_write(krio_priv, ctrl_capt, 0x00000000);
  761. /* Force all writes to finish */
  762. val = krio_err_read(krio_priv, ctrl_capt);
  763. }
  764. /**
  765. * keystone_rio_start - Start RapidIO controller
  766. */
  767. static void keystone_rio_start(struct keystone_rio_data *krio_priv)
  768. {
  769. u32 val;
  770. /* set PEREN bit to enable logical layer data flow */
  771. val = (KEYSTONE_RIO_PER_EN | KEYSTONE_RIO_PER_FREE);
  772. krio_write(krio_priv, pcr, val);
  773. /* set BOOT_COMPLETE bit */
  774. val = krio_read(krio_priv, per_set_cntl);
  775. krio_write(krio_priv, per_set_cntl, val | KEYSTONE_RIO_BOOT_COMPLETE);
  776. }
  777. /**
  778. * keystone_rio_port_status - Return if the port is OK or not
  779. * @port: index of the port
  780. *
  781. * Return %0 if the port is ready or %-EIO on failure.
  782. */
  783. static int keystone_rio_port_status(int port,
  784. struct keystone_rio_data *krio_priv)
  785. {
  786. unsigned int count, value;
  787. int solid_ok = 0;
  788. if (port >= KEYSTONE_RIO_MAX_PORT)
  789. return -1;
  790. /* Check port status */
  791. for (count = 0; count < 300; count++) {
  792. value = krio_sp_read(krio_priv, sp[port].err_stat);
  793. if (value & RIO_PORT_N_ERR_STS_PORT_OK) {
  794. solid_ok++;
  795. if (solid_ok == 100)
  796. break;
  797. } else {
  798. if (solid_ok) {
  799. debug_rio(
  800. "RIO: unstable port %d (solid_ok = %d)\n",
  801. port, solid_ok);
  802. return -2;
  803. }
  804. solid_ok = 0;
  805. }
  806. udelay(20);
  807. }
  808. return 0;
  809. }
  810. /**
  811. * keystone_rio_port_disable - Disable a RapidIO port
  812. * @port: index of the port to configure
  813. */
  814. static void keystone_rio_port_disable(u32 port,
  815. struct keystone_rio_data *krio_priv)
  816. {
  817. /* Disable port */
  818. krio_sp_write(krio_priv, sp[port].ctl, 0x800000);
  819. }
  820. /**
  821. * keystone_rio_port_init - Configure a RapidIO port
  822. * @port: index of the port to configure
  823. * @mode: serdes configuration
  824. */
  825. static int keystone_rio_port_init(u32 port, u32 path_mode,
  826. struct keystone_rio_data *krio_priv)
  827. {
  828. if (port >= KEYSTONE_RIO_MAX_PORT)
  829. return -1;
  830. /* Disable packet forwarding */
  831. krio_write(krio_priv, pkt_fwd_cntl[port].pf_16b, 0xffffffff);
  832. krio_write(krio_priv, pkt_fwd_cntl[port].pf_8b, 0x0003ffff);
  833. /* Silence and discovery timers */
  834. if ((port == 0) || (port == 2)) {
  835. krio_phy_write(krio_priv, phy_sp[port].silence_timer,
  836. 0x20000000);
  837. krio_phy_write(krio_priv, phy_sp[port].discovery_timer,
  838. 0x20000000);
  839. }
  840. /* Enable port in input and output */
  841. krio_sp_write(krio_priv, sp[port].ctl, 0x600000);
  842. /* Program channel allocation to ports (1x, 2x or 4x) */
  843. krio_phy_write(krio_priv, phy_sp[port].path_ctl, path_mode);
  844. return 0;
  845. }
  846. /**
  847. * keystone_rio_port_activate - Start using a RapidIO port
  848. * @port: index of the port to configure
  849. */
  850. static int keystone_rio_port_activate(u32 port,
  851. struct keystone_rio_data *krio_priv)
  852. {
  853. /* Cleanup port error status */
  854. krio_sp_write(krio_priv, sp[port].err_stat,
  855. KEYSTONE_RIO_PORT_ERROR_MASK);
  856. krio_err_write(krio_priv, sp_err[port].det, 0);
  857. /* Enable promiscuous */
  858. krio_tp_write(krio_priv, transport_sp[port].control, 0x00309000);
  859. return 0;
  860. }
  861. /*------------------------ Main driver functions -----------------------*/
  862. /**
  863. * keystone_rio_config_read - Generate a RIO read maintenance transaction
  864. * @portid: Output port ID of transaction
  865. * @destid: Destination ID of transaction
  866. * @hopcount: Number of hops to target device
  867. * @offset: Offset into configuration space
  868. * @len: Length (in bytes) of the maintenance transaction
  869. * @val: Location to be read into
  870. *
  871. * Returns %0 on success or %-1 on failure.
  872. */
  873. int keystone_rio_config_read(struct udevice *dev, int portid, u16 destid,
  874. u8 hopcount, u32 offset, int len, u32 *val)
  875. {
  876. struct keystone_rio_data *krio_priv = dev_get_priv(dev);
  877. struct keystone_rio_pdata *pdata = dev_get_platdata(dev);
  878. dma_addr_t dma;
  879. u32 *tbuf;
  880. int res;
  881. tbuf = malloc(len);
  882. if (!tbuf)
  883. return -1;
  884. memset(tbuf, 0, len);
  885. dma = dma_map_single(tbuf, len, DMA_FROM_DEVICE);
  886. res = keystone_rio_maint_request(portid, destid, hopcount, offset, dma,
  887. len, pdata->size,
  888. KEYSTONE_RIO_PACKET_TYPE_MAINT_R,
  889. krio_priv);
  890. dma_unmap_single((void *)tbuf, len, dma);
  891. /* Taking care of byteswap */
  892. switch (len) {
  893. case 1:
  894. *val = *((u8 *)tbuf);
  895. break;
  896. case 2:
  897. *val = ntohs(*((u16 *)tbuf));
  898. break;
  899. default:
  900. *val = ntohl(*((u32 *)tbuf));
  901. break;
  902. }
  903. free(tbuf);
  904. debug_rio("RIO: %s portid %d destid %d hopcount %d offset 0x%x len %d val 0x%x res %d\n",
  905. __func__, portid, destid, hopcount, offset, len, *val,
  906. res);
  907. return res;
  908. }
  909. /**
  910. * keystone_rio_config_write - Generate a RIO write maintenance transaction
  911. * @portid: Output port ID of transaction
  912. * @destid: Destination ID of transaction
  913. * @hopcount: Number of hops to target device
  914. * @offset: Offset into configuration space
  915. * @len: Length (in bytes) of the maintenance transaction
  916. * @val: Value to be written
  917. *
  918. * Returns %0 on success or %-1 on failure.
  919. */
  920. int keystone_rio_config_write(struct udevice *dev, int portid, u16 destid,
  921. u8 hopcount, u32 offset, int len, u32 val)
  922. {
  923. struct keystone_rio_data *krio_priv = dev_get_priv(dev);
  924. struct keystone_rio_pdata *pdata = dev_get_platdata(dev);
  925. u32 *tbuf;
  926. int res;
  927. dma_addr_t dma;
  928. tbuf = malloc(len);
  929. if (!tbuf)
  930. return -1;
  931. memset(tbuf, 0, len);
  932. /* Taking care of byteswap */
  933. switch (len) {
  934. case 1:
  935. *tbuf = ((u8)val);
  936. break;
  937. case 2:
  938. *tbuf = htons((u16)val);
  939. break;
  940. default:
  941. *tbuf = htonl((u32)val);
  942. break;
  943. }
  944. dma = dma_map_single(tbuf, len, DMA_TO_DEVICE);
  945. res = keystone_rio_maint_request(portid, destid, hopcount, offset, dma,
  946. len, pdata->size,
  947. KEYSTONE_RIO_PACKET_TYPE_MAINT_W,
  948. krio_priv);
  949. dma_unmap_single((void *)tbuf, len, dma);
  950. debug_rio("RIO: %s portid %d destid %d hopcount %d offset 0x%x len %d val 0x%x res %d\n",
  951. __func__, portid, destid, hopcount, offset, len, val, res);
  952. free(tbuf);
  953. return res;
  954. }
  955. /**
  956. * keystone_rio_local_config_read - RIO local config space read
  957. * @offset: Offset into configuration space
  958. * @len: Length (in bytes) of the maintenance transaction
  959. * @data: Value to be read into
  960. *
  961. * Returns %0 on success or %-1 on failure.
  962. */
  963. int keystone_rio_local_config_read(struct udevice *dev, u32 offset,
  964. int len, u32 *data)
  965. {
  966. struct keystone_rio_data *krio_priv = dev_get_priv(dev);
  967. *data = krio_car_csr_read_ofs(krio_priv, offset);
  968. debug_rio("RIO: %s offset 0x%x data 0x%x\n",
  969. __func__, offset, *data);
  970. return 0;
  971. }
  972. /**
  973. * keystone_rio_local_config_write - RIO local config space write
  974. * @offset: Offset into configuration space
  975. * @len: Length (in bytes) of the maintenance transaction
  976. * @data: Value to be written
  977. *
  978. * Returns %0 on success or %-1 on failure.
  979. */
  980. int keystone_rio_local_config_write(struct udevice *dev, u32 offset,
  981. int len, u32 data)
  982. {
  983. struct keystone_rio_data *krio_priv = dev_get_priv(dev);
  984. debug_rio("RIO: %s offset 0x%x data 0x%x\n",
  985. __func__, offset, data);
  986. krio_car_csr_write_ofs(krio_priv, offset, data);
  987. return 0;
  988. }
  989. /**
  990. * keystone_rio_doorbell_rx - Blocking wait to receive doorbell info
  991. * @info: doorbell info to wait on
  992. *
  993. * Returns %0 on success or %-1 on failure.
  994. */
  995. int keystone_rio_doorbell_rx(struct udevice *dev, u16 info)
  996. {
  997. struct keystone_rio_data *krio_priv = dev_get_priv(dev);
  998. u32 pending_dbell;
  999. u16 db_bit_mask, start_db, end_db;
  1000. unsigned int i, received = 0;
  1001. if (info == KEYSTONE_RIO_DBELL_INFO_ANY) {
  1002. start_db = 0;
  1003. end_db = KEYSTONE_RIO_DBELL_NUMBER - 1;
  1004. db_bit_mask = 0xf;
  1005. printf("%s: waiting for dbell any ...\n", __func__);
  1006. } else {
  1007. start_db = (info >> 4) & 0x3;
  1008. end_db = start_db;
  1009. db_bit_mask = BIT(info & 0xf);
  1010. if (start_db >= KEYSTONE_RIO_DBELL_NUMBER) {
  1011. printf("Error: doorbell out of range. Invalid info: 0x%04x\n",
  1012. info);
  1013. return -1;
  1014. }
  1015. printf("%s: waiting for dbell %u bit %u ...\n",
  1016. __func__, start_db, info & 0xf);
  1017. }
  1018. while (1) {
  1019. for (i = start_db; i < end_db + 1; i++) {
  1020. pending_dbell = krio_read(krio_priv,
  1021. doorbell_int[i].status);
  1022. if (pending_dbell) {
  1023. if (pending_dbell & db_bit_mask) {
  1024. received = 1;
  1025. printf("received dbell[%d] status: 0x%08x\n",
  1026. i, pending_dbell);
  1027. }
  1028. /* Acknowledge the interrupts for
  1029. * these doorbells
  1030. */
  1031. krio_write(krio_priv, doorbell_int[i].clear,
  1032. pending_dbell);
  1033. }
  1034. }
  1035. if (received)
  1036. return 0;
  1037. mdelay(10);
  1038. }
  1039. }
  1040. /*
  1041. * Platform configuration setup
  1042. */
  1043. static int keystone_rio_setup_controller(struct keystone_rio_data *krio_priv)
  1044. {
  1045. struct keystone_rio_pdata *pdata = dev_get_platdata(krio_priv->dev);
  1046. u32 ports;
  1047. u32 p;
  1048. u32 mode;
  1049. u32 baud;
  1050. u32 path_mode;
  1051. u32 size = 0;
  1052. int res = 0;
  1053. char str[8];
  1054. size = pdata->size;
  1055. ports = pdata->ports;
  1056. baud = pdata->serdes_baudrate;
  1057. path_mode = pdata->path_mode;
  1058. debug_rio(
  1059. "RIO: size = %d, ports = 0x%x, baud = %d, path_mode = %d\n",
  1060. size, ports, baud, path_mode);
  1061. if (baud > KEYSTONE_RIO_BAUD_5_000) {
  1062. baud = KEYSTONE_RIO_BAUD_5_000;
  1063. printf("RIO: invalid baud rate, forcing it to 5Gbps\n");
  1064. }
  1065. switch (baud) {
  1066. case KEYSTONE_RIO_BAUD_1_250:
  1067. snprintf(str, sizeof(str), "1.25");
  1068. break;
  1069. case KEYSTONE_RIO_BAUD_2_500:
  1070. snprintf(str, sizeof(str), "2.50");
  1071. break;
  1072. case KEYSTONE_RIO_BAUD_3_125:
  1073. snprintf(str, sizeof(str), "3.125");
  1074. break;
  1075. case KEYSTONE_RIO_BAUD_5_000:
  1076. snprintf(str, sizeof(str), "5.00");
  1077. break;
  1078. default:
  1079. return -1;
  1080. }
  1081. debug_rio("RIO: initializing %s Gbps interface with port config %d\n",
  1082. str, path_mode);
  1083. /* Hardware set up of the controller */
  1084. keystone_rio_hw_init(mode, baud, krio_priv);
  1085. /* Disable all ports */
  1086. for (p = 0; p < KEYSTONE_RIO_MAX_PORT; p++)
  1087. keystone_rio_port_disable(p, krio_priv);
  1088. /* Start the controller */
  1089. keystone_rio_start(krio_priv);
  1090. /* Try to lock K2 SerDes*/
  1091. if (pdata->keystone2_serdes) {
  1092. int lanes = keystone_rio_get_lane_config(ports, path_mode);
  1093. if (lanes > 0) {
  1094. res = k2_rio_serdes_wait_lock(krio_priv, (u32)lanes);
  1095. if (res < 0)
  1096. debug_rio("SerDes for lane mask 0x%x on %s Gbps not locked\n",
  1097. lanes, str);
  1098. }
  1099. }
  1100. /* Use and check ports status (but only the requested ones) */
  1101. krio_priv->ports_registering = ports;
  1102. while (ports) {
  1103. int status;
  1104. u32 port = ffs(ports) - 1;
  1105. if (port > 32)
  1106. return 0;
  1107. ports &= ~BIT(port);
  1108. res = keystone_rio_port_init(port, path_mode, krio_priv);
  1109. if (res < 0) {
  1110. printf("RIO: initialization of port %d failed\n", p);
  1111. return res;
  1112. }
  1113. /* Start the port */
  1114. keystone_rio_port_activate(port, krio_priv);
  1115. /* Check the port status */
  1116. status = keystone_rio_port_status(port, krio_priv);
  1117. if (status == 0) {
  1118. krio_priv->ports_registering &= ~BIT(port);
  1119. debug_rio("RIO: port RIO%d ready\n", port);
  1120. } else {
  1121. printf("RIO: port %d not ready (status %d)\n",
  1122. port, status);
  1123. }
  1124. }
  1125. if (krio_priv->ports_registering != 0)
  1126. return -1;
  1127. return res;
  1128. }
  1129. static int keystone_rio_probe(struct udevice *dev)
  1130. {
  1131. struct keystone_rio_data *krio_priv = dev_get_priv(dev);
  1132. struct keystone_rio_pdata *pdata = dev_get_platdata(dev);
  1133. void *regs;
  1134. krio_priv->dev = dev;
  1135. regs = (void *)pdata->boot_cfg_regs_base;
  1136. krio_priv->jtagid_reg = regs + 0x0018;
  1137. krio_priv->serdes_sts_reg = regs + 0x0154;
  1138. regs = (void *)pdata->serdes_cfg_regs_base;
  1139. krio_priv->serdes_regs = regs;
  1140. regs = (void *)pdata->rio_regs_base;
  1141. krio_priv->regs = regs;
  1142. krio_priv->car_csr_regs = regs + 0x0b000;
  1143. krio_priv->serial_port_regs = regs + 0x0b100;
  1144. krio_priv->err_mgmt_regs = regs + 0x0c000;
  1145. krio_priv->phy_regs = regs + 0x1b000;
  1146. krio_priv->transport_regs = regs + 0x1b300;
  1147. krio_priv->pkt_buf_regs = regs + 0x1b600;
  1148. krio_priv->evt_mgmt_regs = regs + 0x1b900;
  1149. krio_priv->port_write_regs = regs + 0x1ba00;
  1150. krio_priv->link_regs = regs + 0x1bd00;
  1151. krio_priv->fabric_regs = regs + 0x1be00;
  1152. krio_priv->car_csr_regs_base = (u32)regs + 0xb000;
  1153. krio_priv->riohdid = pdata->riohdid;
  1154. krio_priv->lsu_start = 0;
  1155. krio_priv->lsu_end = 0;
  1156. /* Enable srio clock */
  1157. psc_enable_module(KS2_LPSC_SRIO);
  1158. debug_rio("KeyStone RapidIO driver %s, hdid=%d\n",
  1159. DRIVER_VER, krio_priv->riohdid);
  1160. /* Setup the sRIO controller */
  1161. return keystone_rio_setup_controller(krio_priv);
  1162. }
  1163. /**
  1164. * keystone_rio_remove - Shutdown RapidIO subsystem
  1165. */
  1166. static int keystone_rio_remove(struct udevice *dev)
  1167. {
  1168. /* Power off */
  1169. psc_disable_module(KS2_LPSC_SRIO);
  1170. return 0;
  1171. }
  1172. static const struct rio_ops keystone_rio_ops = {
  1173. .config_read = keystone_rio_config_read,
  1174. .config_write = keystone_rio_config_write,
  1175. .local_config_read = keystone_rio_local_config_read,
  1176. .local_config_write = keystone_rio_local_config_write,
  1177. .doorbell_rx = keystone_rio_doorbell_rx,
  1178. };
  1179. static int keystone_rio_ofdata_to_platdata(struct udevice *dev)
  1180. {
  1181. struct keystone_rio_pdata *pdata = dev_get_platdata(dev);
  1182. const void *fdt = gd->fdt_blob;
  1183. fdt_addr_t addr;
  1184. int i, node = dev->of_offset;
  1185. addr = dev_get_addr_name(dev, "rio");
  1186. if (addr == FDT_ADDR_T_NONE) {
  1187. debug_rio("Can't get the RIO register base address\n");
  1188. return -ENXIO;
  1189. }
  1190. pdata->rio_regs_base = (u32)addr;
  1191. addr = dev_get_addr_name(dev, "boot_config");
  1192. if (addr == FDT_ADDR_T_NONE) {
  1193. debug_rio("Can't get the Boot Conig register base address\n");
  1194. return -ENXIO;
  1195. }
  1196. pdata->boot_cfg_regs_base = (u32)addr;
  1197. addr = dev_get_addr_name(dev, "serdes");
  1198. if (addr == FDT_ADDR_T_NONE) {
  1199. debug_rio("Can't get the Serdes register base address\n");
  1200. return -ENXIO;
  1201. }
  1202. pdata->serdes_cfg_regs_base = (u32)addr;
  1203. if (fdt_get_property(fdt, node, "keystone2-serdes", NULL))
  1204. pdata->keystone2_serdes = KEYSTONE_RIO_IS_K2;
  1205. pdata->riohdid = fdtdec_get_int(fdt, node, "host-id", -1);
  1206. /* defaults to small system size if not specified */
  1207. pdata->size = (u16)fdtdec_get_uint(fdt, node, "dev-id-size", 0);
  1208. /* port(s) to probe defaults to 0x1 if not specified */
  1209. pdata->ports = (u16)fdtdec_get_uint(fdt, node, "ports", 1);
  1210. /* defaults to 5 Gbps if not specified */
  1211. pdata->serdes_baudrate = fdtdec_get_uint(fdt, node, "baudrate",
  1212. KEYSTONE_RIO_BAUD_5_000);
  1213. /* defaults to 1-4x port if not specified */
  1214. pdata->path_mode = fdtdec_get_uint(fdt, node, "path-mode",
  1215. KEYSTONE_RIO_MAX_PORTS_PATH_MODE_4);
  1216. if (pdata->keystone2_serdes) {
  1217. /*
  1218. * K2 sRIO config 0
  1219. */
  1220. pdata->serdes_config.prescalar_srv_clk = 0x001f;
  1221. } else {
  1222. /*
  1223. * K1 sRIO config 0: MPY = 5x, div rate = half,
  1224. * link rate = 3.125 Gbps, mode 1x
  1225. */
  1226. /* setting control register config */
  1227. pdata->serdes_config.cfg_cntl = 0x0c053860;
  1228. /* SerDes PLL configuration */
  1229. pdata->serdes_config.serdes_cfg_pll = 0x0229;
  1230. /* prescalar_srv_clk */
  1231. pdata->serdes_config.prescalar_srv_clk = 0x001e;
  1232. /* serdes rx_chan_config */
  1233. for (i = 0; i < KEYSTONE_RIO_MAX_PORT; i++)
  1234. pdata->serdes_config.rx_chan_config[i] = 0x00440495;
  1235. /* serdes tx_chan_config */
  1236. for (i = 0; i < KEYSTONE_RIO_MAX_PORT; i++)
  1237. pdata->serdes_config.tx_chan_config[i] = 0x00180795;
  1238. }
  1239. return 0;
  1240. }
  1241. static const struct udevice_id keystone_rio_ids[] = {
  1242. { .compatible = "ti,keystone-rapidio" },
  1243. { }
  1244. };
  1245. U_BOOT_DRIVER(rio_keystone) = {
  1246. .name = "rio_keystone",
  1247. .id = UCLASS_RIO,
  1248. .of_match = keystone_rio_ids,
  1249. .ofdata_to_platdata = keystone_rio_ofdata_to_platdata,
  1250. .ops = &keystone_rio_ops,
  1251. .probe = keystone_rio_probe,
  1252. .remove = keystone_rio_remove,
  1253. .priv_auto_alloc_size = sizeof(struct keystone_rio_data),
  1254. .platdata_auto_alloc_size = sizeof(struct keystone_rio_pdata),
  1255. };