fman_keygen.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757
  1. // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0-or-later
  2. /*
  3. * Copyright 2017 NXP
  4. */
  5. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  6. #include <linux/slab.h>
  7. #include "fman_keygen.h"
  8. /* Maximum number of HW Ports */
  9. #define FMAN_MAX_NUM_OF_HW_PORTS 64
  10. /* Maximum number of KeyGen Schemes */
  11. #define FM_KG_MAX_NUM_OF_SCHEMES 32
  12. /* Number of generic KeyGen Generic Extract Command Registers */
  13. #define FM_KG_NUM_OF_GENERIC_REGS 8
  14. /* Dummy port ID */
  15. #define DUMMY_PORT_ID 0
  16. /* Select Scheme Value Register */
  17. #define KG_SCH_DEF_USE_KGSE_DV_0 2
  18. #define KG_SCH_DEF_USE_KGSE_DV_1 3
  19. /* Registers Shifting values */
  20. #define FM_KG_KGAR_NUM_SHIFT 16
  21. #define KG_SCH_DEF_L4_PORT_SHIFT 8
  22. #define KG_SCH_DEF_IP_ADDR_SHIFT 18
  23. #define KG_SCH_HASH_CONFIG_SHIFT_SHIFT 24
  24. /* KeyGen Registers bit field masks: */
  25. /* Enable bit field mask for KeyGen General Configuration Register */
  26. #define FM_KG_KGGCR_EN 0x80000000
  27. /* KeyGen Global Registers bit field masks */
  28. #define FM_KG_KGAR_GO 0x80000000
  29. #define FM_KG_KGAR_READ 0x40000000
  30. #define FM_KG_KGAR_WRITE 0x00000000
  31. #define FM_KG_KGAR_SEL_SCHEME_ENTRY 0x00000000
  32. #define FM_KG_KGAR_SCM_WSEL_UPDATE_CNT 0x00008000
  33. #define FM_KG_KGAR_ERR 0x20000000
  34. #define FM_KG_KGAR_SEL_CLS_PLAN_ENTRY 0x01000000
  35. #define FM_KG_KGAR_SEL_PORT_ENTRY 0x02000000
  36. #define FM_KG_KGAR_SEL_PORT_WSEL_SP 0x00008000
  37. #define FM_KG_KGAR_SEL_PORT_WSEL_CPP 0x00004000
  38. /* Error events exceptions */
  39. #define FM_EX_KG_DOUBLE_ECC 0x80000000
  40. #define FM_EX_KG_KEYSIZE_OVERFLOW 0x40000000
  41. /* Scheme Registers bit field masks */
  42. #define KG_SCH_MODE_EN 0x80000000
  43. #define KG_SCH_VSP_NO_KSP_EN 0x80000000
  44. #define KG_SCH_HASH_CONFIG_SYM 0x40000000
  45. /* Known Protocol field codes */
  46. #define KG_SCH_KN_PORT_ID 0x80000000
  47. #define KG_SCH_KN_MACDST 0x40000000
  48. #define KG_SCH_KN_MACSRC 0x20000000
  49. #define KG_SCH_KN_TCI1 0x10000000
  50. #define KG_SCH_KN_TCI2 0x08000000
  51. #define KG_SCH_KN_ETYPE 0x04000000
  52. #define KG_SCH_KN_PPPSID 0x02000000
  53. #define KG_SCH_KN_PPPID 0x01000000
  54. #define KG_SCH_KN_MPLS1 0x00800000
  55. #define KG_SCH_KN_MPLS2 0x00400000
  56. #define KG_SCH_KN_MPLS_LAST 0x00200000
  57. #define KG_SCH_KN_IPSRC1 0x00100000
  58. #define KG_SCH_KN_IPDST1 0x00080000
  59. #define KG_SCH_KN_PTYPE1 0x00040000
  60. #define KG_SCH_KN_IPTOS_TC1 0x00020000
  61. #define KG_SCH_KN_IPV6FL1 0x00010000
  62. #define KG_SCH_KN_IPSRC2 0x00008000
  63. #define KG_SCH_KN_IPDST2 0x00004000
  64. #define KG_SCH_KN_PTYPE2 0x00002000
  65. #define KG_SCH_KN_IPTOS_TC2 0x00001000
  66. #define KG_SCH_KN_IPV6FL2 0x00000800
  67. #define KG_SCH_KN_GREPTYPE 0x00000400
  68. #define KG_SCH_KN_IPSEC_SPI 0x00000200
  69. #define KG_SCH_KN_IPSEC_NH 0x00000100
  70. #define KG_SCH_KN_IPPID 0x00000080
  71. #define KG_SCH_KN_L4PSRC 0x00000004
  72. #define KG_SCH_KN_L4PDST 0x00000002
  73. #define KG_SCH_KN_TFLG 0x00000001
  74. /* NIA values */
  75. #define NIA_ENG_BMI 0x00500000
  76. #define NIA_BMI_AC_ENQ_FRAME 0x00000002
  77. #define ENQUEUE_KG_DFLT_NIA (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME)
  78. /* Hard-coded configuration:
  79. * These values are used as hard-coded values for KeyGen configuration
  80. * and they replace user selections for this hard-coded version
  81. */
  82. /* Hash distribution shift */
  83. #define DEFAULT_HASH_DIST_FQID_SHIFT 0
  84. /* Hash shift */
  85. #define DEFAULT_HASH_SHIFT 0
  86. /* Symmetric hash usage:
  87. * Warning:
  88. * - the value for symmetric hash usage must be in accordance with hash
  89. * key defined below
  90. * - according to tests performed, spreading is not working if symmetric
  91. * hash is set on true
  92. * So ultimately symmetric hash functionality should be always disabled:
  93. */
  94. #define DEFAULT_SYMMETRIC_HASH false
  95. /* Hash Key extraction fields: */
  96. #define DEFAULT_HASH_KEY_EXTRACT_FIELDS \
  97. (KG_SCH_KN_IPSRC1 | KG_SCH_KN_IPDST1 | \
  98. KG_SCH_KN_L4PSRC | KG_SCH_KN_L4PDST | \
  99. KG_SCH_KN_IPSEC_SPI)
  100. /* Default values to be used as hash key in case IPv4 or L4 (TCP, UDP)
  101. * don't exist in the frame
  102. */
  103. /* Default IPv4 address */
  104. #define DEFAULT_HASH_KEY_IPv4_ADDR 0x0A0A0A0A
  105. /* Default L4 port */
  106. #define DEFAULT_HASH_KEY_L4_PORT 0x0B0B0B0B
  107. /* KeyGen Memory Mapped Registers: */
  108. /* Scheme Configuration RAM Registers */
  109. struct fman_kg_scheme_regs {
  110. u32 kgse_mode; /* 0x100: MODE */
  111. u32 kgse_ekfc; /* 0x104: Extract Known Fields Command */
  112. u32 kgse_ekdv; /* 0x108: Extract Known Default Value */
  113. u32 kgse_bmch; /* 0x10C: Bit Mask Command High */
  114. u32 kgse_bmcl; /* 0x110: Bit Mask Command Low */
  115. u32 kgse_fqb; /* 0x114: Frame Queue Base */
  116. u32 kgse_hc; /* 0x118: Hash Command */
  117. u32 kgse_ppc; /* 0x11C: Policer Profile Command */
  118. u32 kgse_gec[FM_KG_NUM_OF_GENERIC_REGS];
  119. /* 0x120: Generic Extract Command */
  120. u32 kgse_spc;
  121. /* 0x140: KeyGen Scheme Entry Statistic Packet Counter */
  122. u32 kgse_dv0; /* 0x144: KeyGen Scheme Entry Default Value 0 */
  123. u32 kgse_dv1; /* 0x148: KeyGen Scheme Entry Default Value 1 */
  124. u32 kgse_ccbs;
  125. /* 0x14C: KeyGen Scheme Entry Coarse Classification Bit*/
  126. u32 kgse_mv; /* 0x150: KeyGen Scheme Entry Match vector */
  127. u32 kgse_om; /* 0x154: KeyGen Scheme Entry Operation Mode bits */
  128. u32 kgse_vsp;
  129. /* 0x158: KeyGen Scheme Entry Virtual Storage Profile */
  130. };
  131. /* Port Partition Configuration Registers */
  132. struct fman_kg_pe_regs {
  133. u32 fmkg_pe_sp; /* 0x100: KeyGen Port entry Scheme Partition */
  134. u32 fmkg_pe_cpp;
  135. /* 0x104: KeyGen Port Entry Classification Plan Partition */
  136. };
  137. /* General Configuration and Status Registers
  138. * Global Statistic Counters
  139. * KeyGen Global Registers
  140. */
  141. struct fman_kg_regs {
  142. u32 fmkg_gcr; /* 0x000: KeyGen General Configuration Register */
  143. u32 res004; /* 0x004: Reserved */
  144. u32 res008; /* 0x008: Reserved */
  145. u32 fmkg_eer; /* 0x00C: KeyGen Error Event Register */
  146. u32 fmkg_eeer; /* 0x010: KeyGen Error Event Enable Register */
  147. u32 res014; /* 0x014: Reserved */
  148. u32 res018; /* 0x018: Reserved */
  149. u32 fmkg_seer; /* 0x01C: KeyGen Scheme Error Event Register */
  150. u32 fmkg_seeer; /* 0x020: KeyGen Scheme Error Event Enable Register */
  151. u32 fmkg_gsr; /* 0x024: KeyGen Global Status Register */
  152. u32 fmkg_tpc; /* 0x028: Total Packet Counter Register */
  153. u32 fmkg_serc; /* 0x02C: Soft Error Capture Register */
  154. u32 res030[4]; /* 0x030: Reserved */
  155. u32 fmkg_fdor; /* 0x034: Frame Data Offset Register */
  156. u32 fmkg_gdv0r; /* 0x038: Global Default Value Register 0 */
  157. u32 fmkg_gdv1r; /* 0x03C: Global Default Value Register 1 */
  158. u32 res04c[6]; /* 0x040: Reserved */
  159. u32 fmkg_feer; /* 0x044: Force Error Event Register */
  160. u32 res068[38]; /* 0x048: Reserved */
  161. union {
  162. u32 fmkg_indirect[63]; /* 0x100: Indirect Access Registers */
  163. struct fman_kg_scheme_regs fmkg_sch; /* Scheme Registers */
  164. struct fman_kg_pe_regs fmkg_pe; /* Port Partition Registers */
  165. };
  166. u32 fmkg_ar; /* 0x1FC: KeyGen Action Register */
  167. };
  168. /* KeyGen Scheme data */
  169. struct keygen_scheme {
  170. bool used; /* Specifies if this scheme is used */
  171. u8 hw_port_id;
  172. /* Hardware port ID
  173. * schemes sharing between multiple ports is not
  174. * currently supported
  175. * so we have only one port id bound to a scheme
  176. */
  177. u32 base_fqid;
  178. /* Base FQID:
  179. * Must be between 1 and 2^24-1
  180. * If hash is used and an even distribution is
  181. * expected according to hash_fqid_count,
  182. * base_fqid must be aligned to hash_fqid_count
  183. */
  184. u32 hash_fqid_count;
  185. /* FQ range for hash distribution:
  186. * Must be a power of 2
  187. * Represents the range of queues for spreading
  188. */
  189. bool use_hashing; /* Usage of Hashing and spreading over FQ */
  190. bool symmetric_hash; /* Symmetric Hash option usage */
  191. u8 hashShift;
  192. /* Hash result right shift.
  193. * Select the 24 bits out of the 64 hash result.
  194. * 0 means using the 24 LSB's, otherwise
  195. * use the 24 LSB's after shifting right
  196. */
  197. u32 match_vector; /* Match Vector */
  198. };
  199. /* KeyGen driver data */
  200. struct fman_keygen {
  201. struct keygen_scheme schemes[FM_KG_MAX_NUM_OF_SCHEMES];
  202. /* Array of schemes */
  203. struct fman_kg_regs __iomem *keygen_regs; /* KeyGen registers */
  204. };
  205. /* keygen_write_ar_wait
  206. *
  207. * Write Action Register with specified value, wait for GO bit field to be
  208. * idle and then read the error
  209. *
  210. * regs: KeyGen registers
  211. * fmkg_ar: Action Register value
  212. *
  213. * Return: Zero for success or error code in case of failure
  214. */
  215. static int keygen_write_ar_wait(struct fman_kg_regs __iomem *regs, u32 fmkg_ar)
  216. {
  217. iowrite32be(fmkg_ar, &regs->fmkg_ar);
  218. /* Wait for GO bit field to be idle */
  219. while (fmkg_ar & FM_KG_KGAR_GO)
  220. fmkg_ar = ioread32be(&regs->fmkg_ar);
  221. if (fmkg_ar & FM_KG_KGAR_ERR)
  222. return -EINVAL;
  223. return 0;
  224. }
  225. /* build_ar_scheme
  226. *
  227. * Build Action Register value for scheme settings
  228. *
  229. * scheme_id: Scheme ID
  230. * update_counter: update scheme counter
  231. * write: true for action to write the scheme or false for read action
  232. *
  233. * Return: AR value
  234. */
  235. static u32 build_ar_scheme(u8 scheme_id, bool update_counter, bool write)
  236. {
  237. u32 rw = (u32)(write ? FM_KG_KGAR_WRITE : FM_KG_KGAR_READ);
  238. return (u32)(FM_KG_KGAR_GO |
  239. rw |
  240. FM_KG_KGAR_SEL_SCHEME_ENTRY |
  241. DUMMY_PORT_ID |
  242. ((u32)scheme_id << FM_KG_KGAR_NUM_SHIFT) |
  243. (update_counter ? FM_KG_KGAR_SCM_WSEL_UPDATE_CNT : 0));
  244. }
  245. /* build_ar_bind_scheme
  246. *
  247. * Build Action Register value for port binding to schemes
  248. *
  249. * hwport_id: HW Port ID
  250. * write: true for action to write the bind or false for read action
  251. *
  252. * Return: AR value
  253. */
  254. static u32 build_ar_bind_scheme(u8 hwport_id, bool write)
  255. {
  256. u32 rw = write ? (u32)FM_KG_KGAR_WRITE : (u32)FM_KG_KGAR_READ;
  257. return (u32)(FM_KG_KGAR_GO |
  258. rw |
  259. FM_KG_KGAR_SEL_PORT_ENTRY |
  260. hwport_id |
  261. FM_KG_KGAR_SEL_PORT_WSEL_SP);
  262. }
  263. /* keygen_write_sp
  264. *
  265. * Write Scheme Partition Register with specified value
  266. *
  267. * regs: KeyGen Registers
  268. * sp: Scheme Partition register value
  269. * add: true to add a scheme partition or false to clear
  270. *
  271. * Return: none
  272. */
  273. static void keygen_write_sp(struct fman_kg_regs __iomem *regs, u32 sp, bool add)
  274. {
  275. u32 tmp;
  276. tmp = ioread32be(&regs->fmkg_pe.fmkg_pe_sp);
  277. if (add)
  278. tmp |= sp;
  279. else
  280. tmp &= ~sp;
  281. iowrite32be(tmp, &regs->fmkg_pe.fmkg_pe_sp);
  282. }
  283. /* build_ar_bind_cls_plan
  284. *
  285. * Build Action Register value for Classification Plan
  286. *
  287. * hwport_id: HW Port ID
  288. * write: true for action to write the CP or false for read action
  289. *
  290. * Return: AR value
  291. */
  292. static u32 build_ar_bind_cls_plan(u8 hwport_id, bool write)
  293. {
  294. u32 rw = write ? (u32)FM_KG_KGAR_WRITE : (u32)FM_KG_KGAR_READ;
  295. return (u32)(FM_KG_KGAR_GO |
  296. rw |
  297. FM_KG_KGAR_SEL_PORT_ENTRY |
  298. hwport_id |
  299. FM_KG_KGAR_SEL_PORT_WSEL_CPP);
  300. }
  301. /* keygen_write_cpp
  302. *
  303. * Write Classification Plan Partition Register with specified value
  304. *
  305. * regs: KeyGen Registers
  306. * cpp: CPP register value
  307. *
  308. * Return: none
  309. */
  310. static void keygen_write_cpp(struct fman_kg_regs __iomem *regs, u32 cpp)
  311. {
  312. iowrite32be(cpp, &regs->fmkg_pe.fmkg_pe_cpp);
  313. }
  314. /* keygen_write_scheme
  315. *
  316. * Write all Schemes Registers with specified values
  317. *
  318. * regs: KeyGen Registers
  319. * scheme_id: Scheme ID
  320. * scheme_regs: Scheme registers values desired to be written
  321. * update_counter: update scheme counter
  322. *
  323. * Return: Zero for success or error code in case of failure
  324. */
  325. static int keygen_write_scheme(struct fman_kg_regs __iomem *regs, u8 scheme_id,
  326. struct fman_kg_scheme_regs *scheme_regs,
  327. bool update_counter)
  328. {
  329. u32 ar_reg;
  330. int err, i;
  331. /* Write indirect scheme registers */
  332. iowrite32be(scheme_regs->kgse_mode, &regs->fmkg_sch.kgse_mode);
  333. iowrite32be(scheme_regs->kgse_ekfc, &regs->fmkg_sch.kgse_ekfc);
  334. iowrite32be(scheme_regs->kgse_ekdv, &regs->fmkg_sch.kgse_ekdv);
  335. iowrite32be(scheme_regs->kgse_bmch, &regs->fmkg_sch.kgse_bmch);
  336. iowrite32be(scheme_regs->kgse_bmcl, &regs->fmkg_sch.kgse_bmcl);
  337. iowrite32be(scheme_regs->kgse_fqb, &regs->fmkg_sch.kgse_fqb);
  338. iowrite32be(scheme_regs->kgse_hc, &regs->fmkg_sch.kgse_hc);
  339. iowrite32be(scheme_regs->kgse_ppc, &regs->fmkg_sch.kgse_ppc);
  340. iowrite32be(scheme_regs->kgse_spc, &regs->fmkg_sch.kgse_spc);
  341. iowrite32be(scheme_regs->kgse_dv0, &regs->fmkg_sch.kgse_dv0);
  342. iowrite32be(scheme_regs->kgse_dv1, &regs->fmkg_sch.kgse_dv1);
  343. iowrite32be(scheme_regs->kgse_ccbs, &regs->fmkg_sch.kgse_ccbs);
  344. iowrite32be(scheme_regs->kgse_mv, &regs->fmkg_sch.kgse_mv);
  345. iowrite32be(scheme_regs->kgse_om, &regs->fmkg_sch.kgse_om);
  346. iowrite32be(scheme_regs->kgse_vsp, &regs->fmkg_sch.kgse_vsp);
  347. for (i = 0 ; i < FM_KG_NUM_OF_GENERIC_REGS ; i++)
  348. iowrite32be(scheme_regs->kgse_gec[i],
  349. &regs->fmkg_sch.kgse_gec[i]);
  350. /* Write AR (Action register) */
  351. ar_reg = build_ar_scheme(scheme_id, update_counter, true);
  352. err = keygen_write_ar_wait(regs, ar_reg);
  353. if (err != 0) {
  354. pr_err("Writing Action Register failed\n");
  355. return err;
  356. }
  357. return err;
  358. }
  359. /* get_free_scheme_id
  360. *
  361. * Find the first free scheme available to be used
  362. *
  363. * keygen: KeyGen handle
  364. * scheme_id: pointer to scheme id
  365. *
  366. * Return: 0 on success, -EINVAL when the are no available free schemes
  367. */
  368. static int get_free_scheme_id(struct fman_keygen *keygen, u8 *scheme_id)
  369. {
  370. u8 i;
  371. for (i = 0; i < FM_KG_MAX_NUM_OF_SCHEMES; i++)
  372. if (!keygen->schemes[i].used) {
  373. *scheme_id = i;
  374. return 0;
  375. }
  376. return -EINVAL;
  377. }
  378. /* get_scheme
  379. *
  380. * Provides the scheme for specified ID
  381. *
  382. * keygen: KeyGen handle
  383. * scheme_id: Scheme ID
  384. *
  385. * Return: handle to required scheme
  386. */
  387. static struct keygen_scheme *get_scheme(struct fman_keygen *keygen,
  388. u8 scheme_id)
  389. {
  390. if (scheme_id >= FM_KG_MAX_NUM_OF_SCHEMES)
  391. return NULL;
  392. return &keygen->schemes[scheme_id];
  393. }
  394. /* keygen_bind_port_to_schemes
  395. *
  396. * Bind the port to schemes
  397. *
  398. * keygen: KeyGen handle
  399. * scheme_id: id of the scheme to bind to
  400. * bind: true to bind the port or false to unbind it
  401. *
  402. * Return: Zero for success or error code in case of failure
  403. */
  404. static int keygen_bind_port_to_schemes(struct fman_keygen *keygen,
  405. u8 scheme_id,
  406. bool bind)
  407. {
  408. struct fman_kg_regs __iomem *keygen_regs = keygen->keygen_regs;
  409. struct keygen_scheme *scheme;
  410. u32 ar_reg;
  411. u32 schemes_vector = 0;
  412. int err;
  413. scheme = get_scheme(keygen, scheme_id);
  414. if (!scheme) {
  415. pr_err("Requested Scheme does not exist\n");
  416. return -EINVAL;
  417. }
  418. if (!scheme->used) {
  419. pr_err("Cannot bind port to an invalid scheme\n");
  420. return -EINVAL;
  421. }
  422. schemes_vector |= 1 << (31 - scheme_id);
  423. ar_reg = build_ar_bind_scheme(scheme->hw_port_id, false);
  424. err = keygen_write_ar_wait(keygen_regs, ar_reg);
  425. if (err != 0) {
  426. pr_err("Reading Action Register failed\n");
  427. return err;
  428. }
  429. keygen_write_sp(keygen_regs, schemes_vector, bind);
  430. ar_reg = build_ar_bind_scheme(scheme->hw_port_id, true);
  431. err = keygen_write_ar_wait(keygen_regs, ar_reg);
  432. if (err != 0) {
  433. pr_err("Writing Action Register failed\n");
  434. return err;
  435. }
  436. return 0;
  437. }
  438. /* keygen_scheme_setup
  439. *
  440. * Setup the scheme according to required configuration
  441. *
  442. * keygen: KeyGen handle
  443. * scheme_id: scheme ID
  444. * enable: true to enable scheme or false to disable it
  445. *
  446. * Return: Zero for success or error code in case of failure
  447. */
  448. static int keygen_scheme_setup(struct fman_keygen *keygen, u8 scheme_id,
  449. bool enable)
  450. {
  451. struct fman_kg_regs __iomem *keygen_regs = keygen->keygen_regs;
  452. struct fman_kg_scheme_regs scheme_regs;
  453. struct keygen_scheme *scheme;
  454. u32 tmp_reg;
  455. int err;
  456. scheme = get_scheme(keygen, scheme_id);
  457. if (!scheme) {
  458. pr_err("Requested Scheme does not exist\n");
  459. return -EINVAL;
  460. }
  461. if (enable && scheme->used) {
  462. pr_err("The requested Scheme is already used\n");
  463. return -EINVAL;
  464. }
  465. /* Clear scheme registers */
  466. memset(&scheme_regs, 0, sizeof(struct fman_kg_scheme_regs));
  467. /* Setup all scheme registers: */
  468. tmp_reg = 0;
  469. if (enable) {
  470. /* Enable Scheme */
  471. tmp_reg |= KG_SCH_MODE_EN;
  472. /* Enqueue frame NIA */
  473. tmp_reg |= ENQUEUE_KG_DFLT_NIA;
  474. }
  475. scheme_regs.kgse_mode = tmp_reg;
  476. scheme_regs.kgse_mv = scheme->match_vector;
  477. /* Scheme don't override StorageProfile:
  478. * valid only for DPAA_VERSION >= 11
  479. */
  480. scheme_regs.kgse_vsp = KG_SCH_VSP_NO_KSP_EN;
  481. /* Configure Hard-Coded Rx Hashing: */
  482. if (scheme->use_hashing) {
  483. /* configure kgse_ekfc */
  484. scheme_regs.kgse_ekfc = DEFAULT_HASH_KEY_EXTRACT_FIELDS;
  485. /* configure kgse_ekdv */
  486. tmp_reg = 0;
  487. tmp_reg |= (KG_SCH_DEF_USE_KGSE_DV_0 <<
  488. KG_SCH_DEF_IP_ADDR_SHIFT);
  489. tmp_reg |= (KG_SCH_DEF_USE_KGSE_DV_1 <<
  490. KG_SCH_DEF_L4_PORT_SHIFT);
  491. scheme_regs.kgse_ekdv = tmp_reg;
  492. /* configure kgse_dv0 */
  493. scheme_regs.kgse_dv0 = DEFAULT_HASH_KEY_IPv4_ADDR;
  494. /* configure kgse_dv1 */
  495. scheme_regs.kgse_dv1 = DEFAULT_HASH_KEY_L4_PORT;
  496. /* configure kgse_hc */
  497. tmp_reg = 0;
  498. tmp_reg |= ((scheme->hash_fqid_count - 1) <<
  499. DEFAULT_HASH_DIST_FQID_SHIFT);
  500. tmp_reg |= scheme->hashShift << KG_SCH_HASH_CONFIG_SHIFT_SHIFT;
  501. if (scheme->symmetric_hash) {
  502. /* Normally extraction key should be verified if
  503. * complies with symmetric hash
  504. * But because extraction is hard-coded, we are sure
  505. * the key is symmetric
  506. */
  507. tmp_reg |= KG_SCH_HASH_CONFIG_SYM;
  508. }
  509. scheme_regs.kgse_hc = tmp_reg;
  510. } else {
  511. scheme_regs.kgse_ekfc = 0;
  512. scheme_regs.kgse_hc = 0;
  513. scheme_regs.kgse_ekdv = 0;
  514. scheme_regs.kgse_dv0 = 0;
  515. scheme_regs.kgse_dv1 = 0;
  516. }
  517. /* configure kgse_fqb: Scheme FQID base */
  518. tmp_reg = 0;
  519. tmp_reg |= scheme->base_fqid;
  520. scheme_regs.kgse_fqb = tmp_reg;
  521. /* features not used by hard-coded configuration */
  522. scheme_regs.kgse_bmch = 0;
  523. scheme_regs.kgse_bmcl = 0;
  524. scheme_regs.kgse_spc = 0;
  525. /* Write scheme registers */
  526. err = keygen_write_scheme(keygen_regs, scheme_id, &scheme_regs, true);
  527. if (err != 0) {
  528. pr_err("Writing scheme registers failed\n");
  529. return err;
  530. }
  531. /* Update used field for Scheme */
  532. scheme->used = enable;
  533. return 0;
  534. }
  535. /* keygen_init
  536. *
  537. * KeyGen initialization:
  538. * Initializes and enables KeyGen, allocate driver memory, setup registers,
  539. * clear port bindings, invalidate all schemes
  540. *
  541. * keygen_regs: KeyGen registers base address
  542. *
  543. * Return: Handle to KeyGen driver
  544. */
  545. struct fman_keygen *keygen_init(struct fman_kg_regs __iomem *keygen_regs)
  546. {
  547. struct fman_keygen *keygen;
  548. u32 ar;
  549. int i;
  550. /* Allocate memory for KeyGen driver */
  551. keygen = kzalloc_obj(*keygen);
  552. if (!keygen)
  553. return NULL;
  554. keygen->keygen_regs = keygen_regs;
  555. /* KeyGen initialization (for Master partition):
  556. * Setup KeyGen registers
  557. */
  558. iowrite32be(ENQUEUE_KG_DFLT_NIA, &keygen_regs->fmkg_gcr);
  559. iowrite32be(FM_EX_KG_DOUBLE_ECC | FM_EX_KG_KEYSIZE_OVERFLOW,
  560. &keygen_regs->fmkg_eer);
  561. iowrite32be(0, &keygen_regs->fmkg_fdor);
  562. iowrite32be(0, &keygen_regs->fmkg_gdv0r);
  563. iowrite32be(0, &keygen_regs->fmkg_gdv1r);
  564. /* Clear binding between ports to schemes and classification plans
  565. * so that all ports are not bound to any scheme/classification plan
  566. */
  567. for (i = 0; i < FMAN_MAX_NUM_OF_HW_PORTS; i++) {
  568. /* Clear all pe sp schemes registers */
  569. keygen_write_sp(keygen_regs, 0xffffffff, false);
  570. ar = build_ar_bind_scheme(i, true);
  571. keygen_write_ar_wait(keygen_regs, ar);
  572. /* Clear all pe cpp classification plans registers */
  573. keygen_write_cpp(keygen_regs, 0);
  574. ar = build_ar_bind_cls_plan(i, true);
  575. keygen_write_ar_wait(keygen_regs, ar);
  576. }
  577. /* Enable all scheme interrupts */
  578. iowrite32be(0xFFFFFFFF, &keygen_regs->fmkg_seer);
  579. iowrite32be(0xFFFFFFFF, &keygen_regs->fmkg_seeer);
  580. /* Enable KyeGen */
  581. iowrite32be(ioread32be(&keygen_regs->fmkg_gcr) | FM_KG_KGGCR_EN,
  582. &keygen_regs->fmkg_gcr);
  583. return keygen;
  584. }
  585. EXPORT_SYMBOL(keygen_init);
  586. /* keygen_port_hashing_init
  587. *
  588. * Initializes a port for Rx Hashing with specified configuration parameters
  589. *
  590. * keygen: KeyGen handle
  591. * hw_port_id: HW Port ID
  592. * hash_base_fqid: Hashing Base FQID used for spreading
  593. * hash_size: Hashing size
  594. *
  595. * Return: Zero for success or error code in case of failure
  596. */
  597. int keygen_port_hashing_init(struct fman_keygen *keygen, u8 hw_port_id,
  598. u32 hash_base_fqid, u32 hash_size)
  599. {
  600. struct keygen_scheme *scheme;
  601. u8 scheme_id;
  602. int err;
  603. /* Validate Scheme configuration parameters */
  604. if (hash_base_fqid == 0 || (hash_base_fqid & ~0x00FFFFFF)) {
  605. pr_err("Base FQID must be between 1 and 2^24-1\n");
  606. return -EINVAL;
  607. }
  608. if (hash_size == 0 || (hash_size & (hash_size - 1)) != 0) {
  609. pr_err("Hash size must be power of two\n");
  610. return -EINVAL;
  611. }
  612. /* Find a free scheme */
  613. err = get_free_scheme_id(keygen, &scheme_id);
  614. if (err) {
  615. pr_err("The maximum number of available Schemes has been exceeded\n");
  616. return -EINVAL;
  617. }
  618. /* Create and configure Hard-Coded Scheme: */
  619. scheme = get_scheme(keygen, scheme_id);
  620. if (!scheme) {
  621. pr_err("Requested Scheme does not exist\n");
  622. return -EINVAL;
  623. }
  624. if (scheme->used) {
  625. pr_err("The requested Scheme is already used\n");
  626. return -EINVAL;
  627. }
  628. /* Clear all scheme fields because the scheme may have been
  629. * previously used
  630. */
  631. memset(scheme, 0, sizeof(struct keygen_scheme));
  632. /* Setup scheme: */
  633. scheme->hw_port_id = hw_port_id;
  634. scheme->use_hashing = true;
  635. scheme->base_fqid = hash_base_fqid;
  636. scheme->hash_fqid_count = hash_size;
  637. scheme->symmetric_hash = DEFAULT_SYMMETRIC_HASH;
  638. scheme->hashShift = DEFAULT_HASH_SHIFT;
  639. /* All Schemes in hard-coded configuration
  640. * are Indirect Schemes
  641. */
  642. scheme->match_vector = 0;
  643. err = keygen_scheme_setup(keygen, scheme_id, true);
  644. if (err != 0) {
  645. pr_err("Scheme setup failed\n");
  646. return err;
  647. }
  648. /* Bind Rx port to Scheme */
  649. err = keygen_bind_port_to_schemes(keygen, scheme_id, true);
  650. if (err != 0) {
  651. pr_err("Binding port to schemes failed\n");
  652. return err;
  653. }
  654. return 0;
  655. }
  656. EXPORT_SYMBOL(keygen_port_hashing_init);