nicvf_queues.c 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947
  1. /*
  2. * Copyright (C) 2015 Cavium, Inc.
  3. *
  4. * This program is free software; you can redistribute it and/or modify it
  5. * under the terms of version 2 of the GNU General Public License
  6. * as published by the Free Software Foundation.
  7. */
  8. #include <linux/pci.h>
  9. #include <linux/netdevice.h>
  10. #include <linux/ip.h>
  11. #include <linux/etherdevice.h>
  12. #include <linux/iommu.h>
  13. #include <net/ip.h>
  14. #include <net/tso.h>
  15. #include "nic_reg.h"
  16. #include "nic.h"
  17. #include "q_struct.h"
  18. #include "nicvf_queues.h"
  19. static inline void nicvf_sq_add_gather_subdesc(struct snd_queue *sq, int qentry,
  20. int size, u64 data);
  21. static void nicvf_get_page(struct nicvf *nic)
  22. {
  23. if (!nic->rb_pageref || !nic->rb_page)
  24. return;
  25. page_ref_add(nic->rb_page, nic->rb_pageref);
  26. nic->rb_pageref = 0;
  27. }
  28. /* Poll a register for a specific value */
  29. static int nicvf_poll_reg(struct nicvf *nic, int qidx,
  30. u64 reg, int bit_pos, int bits, int val)
  31. {
  32. u64 bit_mask;
  33. u64 reg_val;
  34. int timeout = 10;
  35. bit_mask = (1ULL << bits) - 1;
  36. bit_mask = (bit_mask << bit_pos);
  37. while (timeout) {
  38. reg_val = nicvf_queue_reg_read(nic, reg, qidx);
  39. if (((reg_val & bit_mask) >> bit_pos) == val)
  40. return 0;
  41. usleep_range(1000, 2000);
  42. timeout--;
  43. }
  44. netdev_err(nic->netdev, "Poll on reg 0x%llx failed\n", reg);
  45. return 1;
  46. }
  47. /* Allocate memory for a queue's descriptors */
  48. static int nicvf_alloc_q_desc_mem(struct nicvf *nic, struct q_desc_mem *dmem,
  49. int q_len, int desc_size, int align_bytes)
  50. {
  51. dmem->q_len = q_len;
  52. dmem->size = (desc_size * q_len) + align_bytes;
  53. /* Save address, need it while freeing */
  54. dmem->unalign_base = dma_zalloc_coherent(&nic->pdev->dev, dmem->size,
  55. &dmem->dma, GFP_KERNEL);
  56. if (!dmem->unalign_base)
  57. return -ENOMEM;
  58. /* Align memory address for 'align_bytes' */
  59. dmem->phys_base = NICVF_ALIGNED_ADDR((u64)dmem->dma, align_bytes);
  60. dmem->base = dmem->unalign_base + (dmem->phys_base - dmem->dma);
  61. return 0;
  62. }
  63. /* Free queue's descriptor memory */
  64. static void nicvf_free_q_desc_mem(struct nicvf *nic, struct q_desc_mem *dmem)
  65. {
  66. if (!dmem)
  67. return;
  68. dma_free_coherent(&nic->pdev->dev, dmem->size,
  69. dmem->unalign_base, dmem->dma);
  70. dmem->unalign_base = NULL;
  71. dmem->base = NULL;
  72. }
  73. #define XDP_PAGE_REFCNT_REFILL 256
  74. /* Allocate a new page or recycle one if possible
  75. *
  76. * We cannot optimize dma mapping here, since
  77. * 1. It's only one RBDR ring for 8 Rx queues.
  78. * 2. CQE_RX gives address of the buffer where pkt has been DMA'ed
  79. * and not idx into RBDR ring, so can't refer to saved info.
  80. * 3. There are multiple receive buffers per page
  81. */
  82. static inline struct pgcache *nicvf_alloc_page(struct nicvf *nic,
  83. struct rbdr *rbdr, gfp_t gfp)
  84. {
  85. int ref_count;
  86. struct page *page = NULL;
  87. struct pgcache *pgcache, *next;
  88. /* Check if page is already allocated */
  89. pgcache = &rbdr->pgcache[rbdr->pgidx];
  90. page = pgcache->page;
  91. /* Check if page can be recycled */
  92. if (page) {
  93. ref_count = page_ref_count(page);
  94. /* Check if this page has been used once i.e 'put_page'
  95. * called after packet transmission i.e internal ref_count
  96. * and page's ref_count are equal i.e page can be recycled.
  97. */
  98. if (rbdr->is_xdp && (ref_count == pgcache->ref_count))
  99. pgcache->ref_count--;
  100. else
  101. page = NULL;
  102. /* In non-XDP mode, page's ref_count needs to be '1' for it
  103. * to be recycled.
  104. */
  105. if (!rbdr->is_xdp && (ref_count != 1))
  106. page = NULL;
  107. }
  108. if (!page) {
  109. page = alloc_pages(gfp | __GFP_COMP | __GFP_NOWARN, 0);
  110. if (!page)
  111. return NULL;
  112. this_cpu_inc(nic->pnicvf->drv_stats->page_alloc);
  113. /* Check for space */
  114. if (rbdr->pgalloc >= rbdr->pgcnt) {
  115. /* Page can still be used */
  116. nic->rb_page = page;
  117. return NULL;
  118. }
  119. /* Save the page in page cache */
  120. pgcache->page = page;
  121. pgcache->dma_addr = 0;
  122. pgcache->ref_count = 0;
  123. rbdr->pgalloc++;
  124. }
  125. /* Take additional page references for recycling */
  126. if (rbdr->is_xdp) {
  127. /* Since there is single RBDR (i.e single core doing
  128. * page recycling) per 8 Rx queues, in XDP mode adjusting
  129. * page references atomically is the biggest bottleneck, so
  130. * take bunch of references at a time.
  131. *
  132. * So here, below reference counts defer by '1'.
  133. */
  134. if (!pgcache->ref_count) {
  135. pgcache->ref_count = XDP_PAGE_REFCNT_REFILL;
  136. page_ref_add(page, XDP_PAGE_REFCNT_REFILL);
  137. }
  138. } else {
  139. /* In non-XDP case, single 64K page is divided across multiple
  140. * receive buffers, so cost of recycling is less anyway.
  141. * So we can do with just one extra reference.
  142. */
  143. page_ref_add(page, 1);
  144. }
  145. rbdr->pgidx++;
  146. rbdr->pgidx &= (rbdr->pgcnt - 1);
  147. /* Prefetch refcount of next page in page cache */
  148. next = &rbdr->pgcache[rbdr->pgidx];
  149. page = next->page;
  150. if (page)
  151. prefetch(&page->_refcount);
  152. return pgcache;
  153. }
  154. /* Allocate buffer for packet reception */
  155. static inline int nicvf_alloc_rcv_buffer(struct nicvf *nic, struct rbdr *rbdr,
  156. gfp_t gfp, u32 buf_len, u64 *rbuf)
  157. {
  158. struct pgcache *pgcache = NULL;
  159. /* Check if request can be accomodated in previous allocated page.
  160. * But in XDP mode only one buffer per page is permitted.
  161. */
  162. if (!rbdr->is_xdp && nic->rb_page &&
  163. ((nic->rb_page_offset + buf_len) <= PAGE_SIZE)) {
  164. nic->rb_pageref++;
  165. goto ret;
  166. }
  167. nicvf_get_page(nic);
  168. nic->rb_page = NULL;
  169. /* Get new page, either recycled or new one */
  170. pgcache = nicvf_alloc_page(nic, rbdr, gfp);
  171. if (!pgcache && !nic->rb_page) {
  172. this_cpu_inc(nic->pnicvf->drv_stats->rcv_buffer_alloc_failures);
  173. return -ENOMEM;
  174. }
  175. nic->rb_page_offset = 0;
  176. /* Reserve space for header modifications by BPF program */
  177. if (rbdr->is_xdp)
  178. buf_len += XDP_PACKET_HEADROOM;
  179. /* Check if it's recycled */
  180. if (pgcache)
  181. nic->rb_page = pgcache->page;
  182. ret:
  183. if (rbdr->is_xdp && pgcache && pgcache->dma_addr) {
  184. *rbuf = pgcache->dma_addr;
  185. } else {
  186. /* HW will ensure data coherency, CPU sync not required */
  187. *rbuf = (u64)dma_map_page_attrs(&nic->pdev->dev, nic->rb_page,
  188. nic->rb_page_offset, buf_len,
  189. DMA_FROM_DEVICE,
  190. DMA_ATTR_SKIP_CPU_SYNC);
  191. if (dma_mapping_error(&nic->pdev->dev, (dma_addr_t)*rbuf)) {
  192. if (!nic->rb_page_offset)
  193. __free_pages(nic->rb_page, 0);
  194. nic->rb_page = NULL;
  195. return -ENOMEM;
  196. }
  197. if (pgcache)
  198. pgcache->dma_addr = *rbuf + XDP_PACKET_HEADROOM;
  199. nic->rb_page_offset += buf_len;
  200. }
  201. return 0;
  202. }
  203. /* Build skb around receive buffer */
  204. static struct sk_buff *nicvf_rb_ptr_to_skb(struct nicvf *nic,
  205. u64 rb_ptr, int len)
  206. {
  207. void *data;
  208. struct sk_buff *skb;
  209. data = phys_to_virt(rb_ptr);
  210. /* Now build an skb to give to stack */
  211. skb = build_skb(data, RCV_FRAG_LEN);
  212. if (!skb) {
  213. put_page(virt_to_page(data));
  214. return NULL;
  215. }
  216. prefetch(skb->data);
  217. return skb;
  218. }
  219. /* Allocate RBDR ring and populate receive buffers */
  220. static int nicvf_init_rbdr(struct nicvf *nic, struct rbdr *rbdr,
  221. int ring_len, int buf_size)
  222. {
  223. int idx;
  224. u64 rbuf;
  225. struct rbdr_entry_t *desc;
  226. int err;
  227. err = nicvf_alloc_q_desc_mem(nic, &rbdr->dmem, ring_len,
  228. sizeof(struct rbdr_entry_t),
  229. NICVF_RCV_BUF_ALIGN_BYTES);
  230. if (err)
  231. return err;
  232. rbdr->desc = rbdr->dmem.base;
  233. /* Buffer size has to be in multiples of 128 bytes */
  234. rbdr->dma_size = buf_size;
  235. rbdr->enable = true;
  236. rbdr->thresh = RBDR_THRESH;
  237. rbdr->head = 0;
  238. rbdr->tail = 0;
  239. /* Initialize page recycling stuff.
  240. *
  241. * Can't use single buffer per page especially with 64K pages.
  242. * On embedded platforms i.e 81xx/83xx available memory itself
  243. * is low and minimum ring size of RBDR is 8K, that takes away
  244. * lots of memory.
  245. *
  246. * But for XDP it has to be a single buffer per page.
  247. */
  248. if (!nic->pnicvf->xdp_prog) {
  249. rbdr->pgcnt = ring_len / (PAGE_SIZE / buf_size);
  250. rbdr->is_xdp = false;
  251. } else {
  252. rbdr->pgcnt = ring_len;
  253. rbdr->is_xdp = true;
  254. }
  255. rbdr->pgcnt = roundup_pow_of_two(rbdr->pgcnt);
  256. rbdr->pgcache = kzalloc(sizeof(*rbdr->pgcache) *
  257. rbdr->pgcnt, GFP_KERNEL);
  258. if (!rbdr->pgcache)
  259. return -ENOMEM;
  260. rbdr->pgidx = 0;
  261. rbdr->pgalloc = 0;
  262. nic->rb_page = NULL;
  263. for (idx = 0; idx < ring_len; idx++) {
  264. err = nicvf_alloc_rcv_buffer(nic, rbdr, GFP_KERNEL,
  265. RCV_FRAG_LEN, &rbuf);
  266. if (err) {
  267. /* To free already allocated and mapped ones */
  268. rbdr->tail = idx - 1;
  269. return err;
  270. }
  271. desc = GET_RBDR_DESC(rbdr, idx);
  272. desc->buf_addr = rbuf & ~(NICVF_RCV_BUF_ALIGN_BYTES - 1);
  273. }
  274. nicvf_get_page(nic);
  275. return 0;
  276. }
  277. /* Free RBDR ring and its receive buffers */
  278. static void nicvf_free_rbdr(struct nicvf *nic, struct rbdr *rbdr)
  279. {
  280. int head, tail;
  281. u64 buf_addr, phys_addr;
  282. struct pgcache *pgcache;
  283. struct rbdr_entry_t *desc;
  284. if (!rbdr)
  285. return;
  286. rbdr->enable = false;
  287. if (!rbdr->dmem.base)
  288. return;
  289. head = rbdr->head;
  290. tail = rbdr->tail;
  291. /* Release page references */
  292. while (head != tail) {
  293. desc = GET_RBDR_DESC(rbdr, head);
  294. buf_addr = desc->buf_addr;
  295. phys_addr = nicvf_iova_to_phys(nic, buf_addr);
  296. dma_unmap_page_attrs(&nic->pdev->dev, buf_addr, RCV_FRAG_LEN,
  297. DMA_FROM_DEVICE, DMA_ATTR_SKIP_CPU_SYNC);
  298. if (phys_addr)
  299. put_page(virt_to_page(phys_to_virt(phys_addr)));
  300. head++;
  301. head &= (rbdr->dmem.q_len - 1);
  302. }
  303. /* Release buffer of tail desc */
  304. desc = GET_RBDR_DESC(rbdr, tail);
  305. buf_addr = desc->buf_addr;
  306. phys_addr = nicvf_iova_to_phys(nic, buf_addr);
  307. dma_unmap_page_attrs(&nic->pdev->dev, buf_addr, RCV_FRAG_LEN,
  308. DMA_FROM_DEVICE, DMA_ATTR_SKIP_CPU_SYNC);
  309. if (phys_addr)
  310. put_page(virt_to_page(phys_to_virt(phys_addr)));
  311. /* Sync page cache info */
  312. smp_rmb();
  313. /* Release additional page references held for recycling */
  314. head = 0;
  315. while (head < rbdr->pgcnt) {
  316. pgcache = &rbdr->pgcache[head];
  317. if (pgcache->page && page_ref_count(pgcache->page) != 0) {
  318. if (!rbdr->is_xdp) {
  319. put_page(pgcache->page);
  320. continue;
  321. }
  322. page_ref_sub(pgcache->page, pgcache->ref_count - 1);
  323. put_page(pgcache->page);
  324. }
  325. head++;
  326. }
  327. /* Free RBDR ring */
  328. nicvf_free_q_desc_mem(nic, &rbdr->dmem);
  329. }
  330. /* Refill receive buffer descriptors with new buffers.
  331. */
  332. static void nicvf_refill_rbdr(struct nicvf *nic, gfp_t gfp)
  333. {
  334. struct queue_set *qs = nic->qs;
  335. int rbdr_idx = qs->rbdr_cnt;
  336. int tail, qcount;
  337. int refill_rb_cnt;
  338. struct rbdr *rbdr;
  339. struct rbdr_entry_t *desc;
  340. u64 rbuf;
  341. int new_rb = 0;
  342. refill:
  343. if (!rbdr_idx)
  344. return;
  345. rbdr_idx--;
  346. rbdr = &qs->rbdr[rbdr_idx];
  347. /* Check if it's enabled */
  348. if (!rbdr->enable)
  349. goto next_rbdr;
  350. /* Get no of desc's to be refilled */
  351. qcount = nicvf_queue_reg_read(nic, NIC_QSET_RBDR_0_1_STATUS0, rbdr_idx);
  352. qcount &= 0x7FFFF;
  353. /* Doorbell can be ringed with a max of ring size minus 1 */
  354. if (qcount >= (qs->rbdr_len - 1))
  355. goto next_rbdr;
  356. else
  357. refill_rb_cnt = qs->rbdr_len - qcount - 1;
  358. /* Sync page cache info */
  359. smp_rmb();
  360. /* Start filling descs from tail */
  361. tail = nicvf_queue_reg_read(nic, NIC_QSET_RBDR_0_1_TAIL, rbdr_idx) >> 3;
  362. while (refill_rb_cnt) {
  363. tail++;
  364. tail &= (rbdr->dmem.q_len - 1);
  365. if (nicvf_alloc_rcv_buffer(nic, rbdr, gfp, RCV_FRAG_LEN, &rbuf))
  366. break;
  367. desc = GET_RBDR_DESC(rbdr, tail);
  368. desc->buf_addr = rbuf & ~(NICVF_RCV_BUF_ALIGN_BYTES - 1);
  369. refill_rb_cnt--;
  370. new_rb++;
  371. }
  372. nicvf_get_page(nic);
  373. /* make sure all memory stores are done before ringing doorbell */
  374. smp_wmb();
  375. /* Check if buffer allocation failed */
  376. if (refill_rb_cnt)
  377. nic->rb_alloc_fail = true;
  378. else
  379. nic->rb_alloc_fail = false;
  380. /* Notify HW */
  381. nicvf_queue_reg_write(nic, NIC_QSET_RBDR_0_1_DOOR,
  382. rbdr_idx, new_rb);
  383. next_rbdr:
  384. /* Re-enable RBDR interrupts only if buffer allocation is success */
  385. if (!nic->rb_alloc_fail && rbdr->enable &&
  386. netif_running(nic->pnicvf->netdev))
  387. nicvf_enable_intr(nic, NICVF_INTR_RBDR, rbdr_idx);
  388. if (rbdr_idx)
  389. goto refill;
  390. }
  391. /* Alloc rcv buffers in non-atomic mode for better success */
  392. void nicvf_rbdr_work(struct work_struct *work)
  393. {
  394. struct nicvf *nic = container_of(work, struct nicvf, rbdr_work.work);
  395. nicvf_refill_rbdr(nic, GFP_KERNEL);
  396. if (nic->rb_alloc_fail)
  397. schedule_delayed_work(&nic->rbdr_work, msecs_to_jiffies(10));
  398. else
  399. nic->rb_work_scheduled = false;
  400. }
  401. /* In Softirq context, alloc rcv buffers in atomic mode */
  402. void nicvf_rbdr_task(unsigned long data)
  403. {
  404. struct nicvf *nic = (struct nicvf *)data;
  405. nicvf_refill_rbdr(nic, GFP_ATOMIC);
  406. if (nic->rb_alloc_fail) {
  407. nic->rb_work_scheduled = true;
  408. schedule_delayed_work(&nic->rbdr_work, msecs_to_jiffies(10));
  409. }
  410. }
  411. /* Initialize completion queue */
  412. static int nicvf_init_cmp_queue(struct nicvf *nic,
  413. struct cmp_queue *cq, int q_len)
  414. {
  415. int err;
  416. err = nicvf_alloc_q_desc_mem(nic, &cq->dmem, q_len, CMP_QUEUE_DESC_SIZE,
  417. NICVF_CQ_BASE_ALIGN_BYTES);
  418. if (err)
  419. return err;
  420. cq->desc = cq->dmem.base;
  421. cq->thresh = pass1_silicon(nic->pdev) ? 0 : CMP_QUEUE_CQE_THRESH;
  422. nic->cq_coalesce_usecs = (CMP_QUEUE_TIMER_THRESH * 0.05) - 1;
  423. return 0;
  424. }
  425. static void nicvf_free_cmp_queue(struct nicvf *nic, struct cmp_queue *cq)
  426. {
  427. if (!cq)
  428. return;
  429. if (!cq->dmem.base)
  430. return;
  431. nicvf_free_q_desc_mem(nic, &cq->dmem);
  432. }
  433. /* Initialize transmit queue */
  434. static int nicvf_init_snd_queue(struct nicvf *nic,
  435. struct snd_queue *sq, int q_len, int qidx)
  436. {
  437. int err;
  438. err = nicvf_alloc_q_desc_mem(nic, &sq->dmem, q_len, SND_QUEUE_DESC_SIZE,
  439. NICVF_SQ_BASE_ALIGN_BYTES);
  440. if (err)
  441. return err;
  442. sq->desc = sq->dmem.base;
  443. sq->skbuff = kcalloc(q_len, sizeof(u64), GFP_KERNEL);
  444. if (!sq->skbuff)
  445. return -ENOMEM;
  446. sq->head = 0;
  447. sq->tail = 0;
  448. sq->thresh = SND_QUEUE_THRESH;
  449. /* Check if this SQ is a XDP TX queue */
  450. if (nic->sqs_mode)
  451. qidx += ((nic->sqs_id + 1) * MAX_SND_QUEUES_PER_QS);
  452. if (qidx < nic->pnicvf->xdp_tx_queues) {
  453. /* Alloc memory to save page pointers for XDP_TX */
  454. sq->xdp_page = kcalloc(q_len, sizeof(u64), GFP_KERNEL);
  455. if (!sq->xdp_page)
  456. return -ENOMEM;
  457. sq->xdp_desc_cnt = 0;
  458. sq->xdp_free_cnt = q_len - 1;
  459. sq->is_xdp = true;
  460. } else {
  461. sq->xdp_page = NULL;
  462. sq->xdp_desc_cnt = 0;
  463. sq->xdp_free_cnt = 0;
  464. sq->is_xdp = false;
  465. atomic_set(&sq->free_cnt, q_len - 1);
  466. /* Preallocate memory for TSO segment's header */
  467. sq->tso_hdrs = dma_alloc_coherent(&nic->pdev->dev,
  468. q_len * TSO_HEADER_SIZE,
  469. &sq->tso_hdrs_phys,
  470. GFP_KERNEL);
  471. if (!sq->tso_hdrs)
  472. return -ENOMEM;
  473. }
  474. return 0;
  475. }
  476. void nicvf_unmap_sndq_buffers(struct nicvf *nic, struct snd_queue *sq,
  477. int hdr_sqe, u8 subdesc_cnt)
  478. {
  479. u8 idx;
  480. struct sq_gather_subdesc *gather;
  481. /* Unmap DMA mapped skb data buffers */
  482. for (idx = 0; idx < subdesc_cnt; idx++) {
  483. hdr_sqe++;
  484. hdr_sqe &= (sq->dmem.q_len - 1);
  485. gather = (struct sq_gather_subdesc *)GET_SQ_DESC(sq, hdr_sqe);
  486. /* HW will ensure data coherency, CPU sync not required */
  487. dma_unmap_page_attrs(&nic->pdev->dev, gather->addr,
  488. gather->size, DMA_TO_DEVICE,
  489. DMA_ATTR_SKIP_CPU_SYNC);
  490. }
  491. }
  492. static void nicvf_free_snd_queue(struct nicvf *nic, struct snd_queue *sq)
  493. {
  494. struct sk_buff *skb;
  495. struct page *page;
  496. struct sq_hdr_subdesc *hdr;
  497. struct sq_hdr_subdesc *tso_sqe;
  498. if (!sq)
  499. return;
  500. if (!sq->dmem.base)
  501. return;
  502. if (sq->tso_hdrs)
  503. dma_free_coherent(&nic->pdev->dev,
  504. sq->dmem.q_len * TSO_HEADER_SIZE,
  505. sq->tso_hdrs, sq->tso_hdrs_phys);
  506. /* Free pending skbs in the queue */
  507. smp_rmb();
  508. while (sq->head != sq->tail) {
  509. skb = (struct sk_buff *)sq->skbuff[sq->head];
  510. if (!skb || !sq->xdp_page)
  511. goto next;
  512. page = (struct page *)sq->xdp_page[sq->head];
  513. if (!page)
  514. goto next;
  515. else
  516. put_page(page);
  517. hdr = (struct sq_hdr_subdesc *)GET_SQ_DESC(sq, sq->head);
  518. /* Check for dummy descriptor used for HW TSO offload on 88xx */
  519. if (hdr->dont_send) {
  520. /* Get actual TSO descriptors and unmap them */
  521. tso_sqe =
  522. (struct sq_hdr_subdesc *)GET_SQ_DESC(sq, hdr->rsvd2);
  523. nicvf_unmap_sndq_buffers(nic, sq, hdr->rsvd2,
  524. tso_sqe->subdesc_cnt);
  525. } else {
  526. nicvf_unmap_sndq_buffers(nic, sq, sq->head,
  527. hdr->subdesc_cnt);
  528. }
  529. if (skb)
  530. dev_kfree_skb_any(skb);
  531. next:
  532. sq->head++;
  533. sq->head &= (sq->dmem.q_len - 1);
  534. }
  535. kfree(sq->skbuff);
  536. kfree(sq->xdp_page);
  537. nicvf_free_q_desc_mem(nic, &sq->dmem);
  538. }
  539. static void nicvf_reclaim_snd_queue(struct nicvf *nic,
  540. struct queue_set *qs, int qidx)
  541. {
  542. /* Disable send queue */
  543. nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_CFG, qidx, 0);
  544. /* Check if SQ is stopped */
  545. if (nicvf_poll_reg(nic, qidx, NIC_QSET_SQ_0_7_STATUS, 21, 1, 0x01))
  546. return;
  547. /* Reset send queue */
  548. nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_CFG, qidx, NICVF_SQ_RESET);
  549. }
  550. static void nicvf_reclaim_rcv_queue(struct nicvf *nic,
  551. struct queue_set *qs, int qidx)
  552. {
  553. union nic_mbx mbx = {};
  554. /* Make sure all packets in the pipeline are written back into mem */
  555. mbx.msg.msg = NIC_MBOX_MSG_RQ_SW_SYNC;
  556. nicvf_send_msg_to_pf(nic, &mbx);
  557. }
  558. static void nicvf_reclaim_cmp_queue(struct nicvf *nic,
  559. struct queue_set *qs, int qidx)
  560. {
  561. /* Disable timer threshold (doesn't get reset upon CQ reset */
  562. nicvf_queue_reg_write(nic, NIC_QSET_CQ_0_7_CFG2, qidx, 0);
  563. /* Disable completion queue */
  564. nicvf_queue_reg_write(nic, NIC_QSET_CQ_0_7_CFG, qidx, 0);
  565. /* Reset completion queue */
  566. nicvf_queue_reg_write(nic, NIC_QSET_CQ_0_7_CFG, qidx, NICVF_CQ_RESET);
  567. }
  568. static void nicvf_reclaim_rbdr(struct nicvf *nic,
  569. struct rbdr *rbdr, int qidx)
  570. {
  571. u64 tmp, fifo_state;
  572. int timeout = 10;
  573. /* Save head and tail pointers for feeing up buffers */
  574. rbdr->head = nicvf_queue_reg_read(nic,
  575. NIC_QSET_RBDR_0_1_HEAD,
  576. qidx) >> 3;
  577. rbdr->tail = nicvf_queue_reg_read(nic,
  578. NIC_QSET_RBDR_0_1_TAIL,
  579. qidx) >> 3;
  580. /* If RBDR FIFO is in 'FAIL' state then do a reset first
  581. * before relaiming.
  582. */
  583. fifo_state = nicvf_queue_reg_read(nic, NIC_QSET_RBDR_0_1_STATUS0, qidx);
  584. if (((fifo_state >> 62) & 0x03) == 0x3)
  585. nicvf_queue_reg_write(nic, NIC_QSET_RBDR_0_1_CFG,
  586. qidx, NICVF_RBDR_RESET);
  587. /* Disable RBDR */
  588. nicvf_queue_reg_write(nic, NIC_QSET_RBDR_0_1_CFG, qidx, 0);
  589. if (nicvf_poll_reg(nic, qidx, NIC_QSET_RBDR_0_1_STATUS0, 62, 2, 0x00))
  590. return;
  591. while (1) {
  592. tmp = nicvf_queue_reg_read(nic,
  593. NIC_QSET_RBDR_0_1_PREFETCH_STATUS,
  594. qidx);
  595. if ((tmp & 0xFFFFFFFF) == ((tmp >> 32) & 0xFFFFFFFF))
  596. break;
  597. usleep_range(1000, 2000);
  598. timeout--;
  599. if (!timeout) {
  600. netdev_err(nic->netdev,
  601. "Failed polling on prefetch status\n");
  602. return;
  603. }
  604. }
  605. nicvf_queue_reg_write(nic, NIC_QSET_RBDR_0_1_CFG,
  606. qidx, NICVF_RBDR_RESET);
  607. if (nicvf_poll_reg(nic, qidx, NIC_QSET_RBDR_0_1_STATUS0, 62, 2, 0x02))
  608. return;
  609. nicvf_queue_reg_write(nic, NIC_QSET_RBDR_0_1_CFG, qidx, 0x00);
  610. if (nicvf_poll_reg(nic, qidx, NIC_QSET_RBDR_0_1_STATUS0, 62, 2, 0x00))
  611. return;
  612. }
  613. void nicvf_config_vlan_stripping(struct nicvf *nic, netdev_features_t features)
  614. {
  615. u64 rq_cfg;
  616. int sqs;
  617. rq_cfg = nicvf_queue_reg_read(nic, NIC_QSET_RQ_GEN_CFG, 0);
  618. /* Enable first VLAN stripping */
  619. if (features & NETIF_F_HW_VLAN_CTAG_RX)
  620. rq_cfg |= (1ULL << 25);
  621. else
  622. rq_cfg &= ~(1ULL << 25);
  623. nicvf_queue_reg_write(nic, NIC_QSET_RQ_GEN_CFG, 0, rq_cfg);
  624. /* Configure Secondary Qsets, if any */
  625. for (sqs = 0; sqs < nic->sqs_count; sqs++)
  626. if (nic->snicvf[sqs])
  627. nicvf_queue_reg_write(nic->snicvf[sqs],
  628. NIC_QSET_RQ_GEN_CFG, 0, rq_cfg);
  629. }
  630. static void nicvf_reset_rcv_queue_stats(struct nicvf *nic)
  631. {
  632. union nic_mbx mbx = {};
  633. /* Reset all RQ/SQ and VF stats */
  634. mbx.reset_stat.msg = NIC_MBOX_MSG_RESET_STAT_COUNTER;
  635. mbx.reset_stat.rx_stat_mask = 0x3FFF;
  636. mbx.reset_stat.tx_stat_mask = 0x1F;
  637. mbx.reset_stat.rq_stat_mask = 0xFFFF;
  638. mbx.reset_stat.sq_stat_mask = 0xFFFF;
  639. nicvf_send_msg_to_pf(nic, &mbx);
  640. }
  641. /* Configures receive queue */
  642. static void nicvf_rcv_queue_config(struct nicvf *nic, struct queue_set *qs,
  643. int qidx, bool enable)
  644. {
  645. union nic_mbx mbx = {};
  646. struct rcv_queue *rq;
  647. struct rq_cfg rq_cfg;
  648. rq = &qs->rq[qidx];
  649. rq->enable = enable;
  650. /* Disable receive queue */
  651. nicvf_queue_reg_write(nic, NIC_QSET_RQ_0_7_CFG, qidx, 0);
  652. if (!rq->enable) {
  653. nicvf_reclaim_rcv_queue(nic, qs, qidx);
  654. return;
  655. }
  656. rq->cq_qs = qs->vnic_id;
  657. rq->cq_idx = qidx;
  658. rq->start_rbdr_qs = qs->vnic_id;
  659. rq->start_qs_rbdr_idx = qs->rbdr_cnt - 1;
  660. rq->cont_rbdr_qs = qs->vnic_id;
  661. rq->cont_qs_rbdr_idx = qs->rbdr_cnt - 1;
  662. /* all writes of RBDR data to be loaded into L2 Cache as well*/
  663. rq->caching = 1;
  664. /* Send a mailbox msg to PF to config RQ */
  665. mbx.rq.msg = NIC_MBOX_MSG_RQ_CFG;
  666. mbx.rq.qs_num = qs->vnic_id;
  667. mbx.rq.rq_num = qidx;
  668. mbx.rq.cfg = (rq->caching << 26) | (rq->cq_qs << 19) |
  669. (rq->cq_idx << 16) | (rq->cont_rbdr_qs << 9) |
  670. (rq->cont_qs_rbdr_idx << 8) |
  671. (rq->start_rbdr_qs << 1) | (rq->start_qs_rbdr_idx);
  672. nicvf_send_msg_to_pf(nic, &mbx);
  673. mbx.rq.msg = NIC_MBOX_MSG_RQ_BP_CFG;
  674. mbx.rq.cfg = BIT_ULL(63) | BIT_ULL(62) |
  675. (RQ_PASS_RBDR_LVL << 16) | (RQ_PASS_CQ_LVL << 8) |
  676. (qs->vnic_id << 0);
  677. nicvf_send_msg_to_pf(nic, &mbx);
  678. /* RQ drop config
  679. * Enable CQ drop to reserve sufficient CQEs for all tx packets
  680. */
  681. mbx.rq.msg = NIC_MBOX_MSG_RQ_DROP_CFG;
  682. mbx.rq.cfg = BIT_ULL(63) | BIT_ULL(62) |
  683. (RQ_PASS_RBDR_LVL << 40) | (RQ_DROP_RBDR_LVL << 32) |
  684. (RQ_PASS_CQ_LVL << 16) | (RQ_DROP_CQ_LVL << 8);
  685. nicvf_send_msg_to_pf(nic, &mbx);
  686. if (!nic->sqs_mode && (qidx == 0)) {
  687. /* Enable checking L3/L4 length and TCP/UDP checksums
  688. * Also allow IPv6 pkts with zero UDP checksum.
  689. */
  690. nicvf_queue_reg_write(nic, NIC_QSET_RQ_GEN_CFG, 0,
  691. (BIT(24) | BIT(23) | BIT(21) | BIT(20)));
  692. nicvf_config_vlan_stripping(nic, nic->netdev->features);
  693. }
  694. /* Enable Receive queue */
  695. memset(&rq_cfg, 0, sizeof(struct rq_cfg));
  696. rq_cfg.ena = 1;
  697. rq_cfg.tcp_ena = 0;
  698. nicvf_queue_reg_write(nic, NIC_QSET_RQ_0_7_CFG, qidx, *(u64 *)&rq_cfg);
  699. }
  700. /* Configures completion queue */
  701. void nicvf_cmp_queue_config(struct nicvf *nic, struct queue_set *qs,
  702. int qidx, bool enable)
  703. {
  704. struct cmp_queue *cq;
  705. struct cq_cfg cq_cfg;
  706. cq = &qs->cq[qidx];
  707. cq->enable = enable;
  708. if (!cq->enable) {
  709. nicvf_reclaim_cmp_queue(nic, qs, qidx);
  710. return;
  711. }
  712. /* Reset completion queue */
  713. nicvf_queue_reg_write(nic, NIC_QSET_CQ_0_7_CFG, qidx, NICVF_CQ_RESET);
  714. if (!cq->enable)
  715. return;
  716. spin_lock_init(&cq->lock);
  717. /* Set completion queue base address */
  718. nicvf_queue_reg_write(nic, NIC_QSET_CQ_0_7_BASE,
  719. qidx, (u64)(cq->dmem.phys_base));
  720. /* Enable Completion queue */
  721. memset(&cq_cfg, 0, sizeof(struct cq_cfg));
  722. cq_cfg.ena = 1;
  723. cq_cfg.reset = 0;
  724. cq_cfg.caching = 0;
  725. cq_cfg.qsize = ilog2(qs->cq_len >> 10);
  726. cq_cfg.avg_con = 0;
  727. nicvf_queue_reg_write(nic, NIC_QSET_CQ_0_7_CFG, qidx, *(u64 *)&cq_cfg);
  728. /* Set threshold value for interrupt generation */
  729. nicvf_queue_reg_write(nic, NIC_QSET_CQ_0_7_THRESH, qidx, cq->thresh);
  730. nicvf_queue_reg_write(nic, NIC_QSET_CQ_0_7_CFG2,
  731. qidx, CMP_QUEUE_TIMER_THRESH);
  732. }
  733. /* Configures transmit queue */
  734. static void nicvf_snd_queue_config(struct nicvf *nic, struct queue_set *qs,
  735. int qidx, bool enable)
  736. {
  737. union nic_mbx mbx = {};
  738. struct snd_queue *sq;
  739. struct sq_cfg sq_cfg;
  740. sq = &qs->sq[qidx];
  741. sq->enable = enable;
  742. if (!sq->enable) {
  743. nicvf_reclaim_snd_queue(nic, qs, qidx);
  744. return;
  745. }
  746. /* Reset send queue */
  747. nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_CFG, qidx, NICVF_SQ_RESET);
  748. sq->cq_qs = qs->vnic_id;
  749. sq->cq_idx = qidx;
  750. /* Send a mailbox msg to PF to config SQ */
  751. mbx.sq.msg = NIC_MBOX_MSG_SQ_CFG;
  752. mbx.sq.qs_num = qs->vnic_id;
  753. mbx.sq.sq_num = qidx;
  754. mbx.sq.sqs_mode = nic->sqs_mode;
  755. mbx.sq.cfg = (sq->cq_qs << 3) | sq->cq_idx;
  756. nicvf_send_msg_to_pf(nic, &mbx);
  757. /* Set queue base address */
  758. nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_BASE,
  759. qidx, (u64)(sq->dmem.phys_base));
  760. /* Enable send queue & set queue size */
  761. memset(&sq_cfg, 0, sizeof(struct sq_cfg));
  762. sq_cfg.ena = 1;
  763. sq_cfg.reset = 0;
  764. sq_cfg.ldwb = 0;
  765. sq_cfg.qsize = ilog2(qs->sq_len >> 10);
  766. sq_cfg.tstmp_bgx_intf = 0;
  767. /* CQ's level at which HW will stop processing SQEs to avoid
  768. * transmitting a pkt with no space in CQ to post CQE_TX.
  769. */
  770. sq_cfg.cq_limit = (CMP_QUEUE_PIPELINE_RSVD * 256) / qs->cq_len;
  771. nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_CFG, qidx, *(u64 *)&sq_cfg);
  772. /* Set threshold value for interrupt generation */
  773. nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_THRESH, qidx, sq->thresh);
  774. /* Set queue:cpu affinity for better load distribution */
  775. if (cpu_online(qidx)) {
  776. cpumask_set_cpu(qidx, &sq->affinity_mask);
  777. netif_set_xps_queue(nic->netdev,
  778. &sq->affinity_mask, qidx);
  779. }
  780. }
  781. /* Configures receive buffer descriptor ring */
  782. static void nicvf_rbdr_config(struct nicvf *nic, struct queue_set *qs,
  783. int qidx, bool enable)
  784. {
  785. struct rbdr *rbdr;
  786. struct rbdr_cfg rbdr_cfg;
  787. rbdr = &qs->rbdr[qidx];
  788. nicvf_reclaim_rbdr(nic, rbdr, qidx);
  789. if (!enable)
  790. return;
  791. /* Set descriptor base address */
  792. nicvf_queue_reg_write(nic, NIC_QSET_RBDR_0_1_BASE,
  793. qidx, (u64)(rbdr->dmem.phys_base));
  794. /* Enable RBDR & set queue size */
  795. /* Buffer size should be in multiples of 128 bytes */
  796. memset(&rbdr_cfg, 0, sizeof(struct rbdr_cfg));
  797. rbdr_cfg.ena = 1;
  798. rbdr_cfg.reset = 0;
  799. rbdr_cfg.ldwb = 0;
  800. rbdr_cfg.qsize = RBDR_SIZE;
  801. rbdr_cfg.avg_con = 0;
  802. rbdr_cfg.lines = rbdr->dma_size / 128;
  803. nicvf_queue_reg_write(nic, NIC_QSET_RBDR_0_1_CFG,
  804. qidx, *(u64 *)&rbdr_cfg);
  805. /* Notify HW */
  806. nicvf_queue_reg_write(nic, NIC_QSET_RBDR_0_1_DOOR,
  807. qidx, qs->rbdr_len - 1);
  808. /* Set threshold value for interrupt generation */
  809. nicvf_queue_reg_write(nic, NIC_QSET_RBDR_0_1_THRESH,
  810. qidx, rbdr->thresh - 1);
  811. }
  812. /* Requests PF to assign and enable Qset */
  813. void nicvf_qset_config(struct nicvf *nic, bool enable)
  814. {
  815. union nic_mbx mbx = {};
  816. struct queue_set *qs = nic->qs;
  817. struct qs_cfg *qs_cfg;
  818. if (!qs) {
  819. netdev_warn(nic->netdev,
  820. "Qset is still not allocated, don't init queues\n");
  821. return;
  822. }
  823. qs->enable = enable;
  824. qs->vnic_id = nic->vf_id;
  825. /* Send a mailbox msg to PF to config Qset */
  826. mbx.qs.msg = NIC_MBOX_MSG_QS_CFG;
  827. mbx.qs.num = qs->vnic_id;
  828. mbx.qs.sqs_count = nic->sqs_count;
  829. mbx.qs.cfg = 0;
  830. qs_cfg = (struct qs_cfg *)&mbx.qs.cfg;
  831. if (qs->enable) {
  832. qs_cfg->ena = 1;
  833. #ifdef __BIG_ENDIAN
  834. qs_cfg->be = 1;
  835. #endif
  836. qs_cfg->vnic = qs->vnic_id;
  837. }
  838. nicvf_send_msg_to_pf(nic, &mbx);
  839. }
  840. static void nicvf_free_resources(struct nicvf *nic)
  841. {
  842. int qidx;
  843. struct queue_set *qs = nic->qs;
  844. /* Free receive buffer descriptor ring */
  845. for (qidx = 0; qidx < qs->rbdr_cnt; qidx++)
  846. nicvf_free_rbdr(nic, &qs->rbdr[qidx]);
  847. /* Free completion queue */
  848. for (qidx = 0; qidx < qs->cq_cnt; qidx++)
  849. nicvf_free_cmp_queue(nic, &qs->cq[qidx]);
  850. /* Free send queue */
  851. for (qidx = 0; qidx < qs->sq_cnt; qidx++)
  852. nicvf_free_snd_queue(nic, &qs->sq[qidx]);
  853. }
  854. static int nicvf_alloc_resources(struct nicvf *nic)
  855. {
  856. int qidx;
  857. struct queue_set *qs = nic->qs;
  858. /* Alloc receive buffer descriptor ring */
  859. for (qidx = 0; qidx < qs->rbdr_cnt; qidx++) {
  860. if (nicvf_init_rbdr(nic, &qs->rbdr[qidx], qs->rbdr_len,
  861. DMA_BUFFER_LEN))
  862. goto alloc_fail;
  863. }
  864. /* Alloc send queue */
  865. for (qidx = 0; qidx < qs->sq_cnt; qidx++) {
  866. if (nicvf_init_snd_queue(nic, &qs->sq[qidx], qs->sq_len, qidx))
  867. goto alloc_fail;
  868. }
  869. /* Alloc completion queue */
  870. for (qidx = 0; qidx < qs->cq_cnt; qidx++) {
  871. if (nicvf_init_cmp_queue(nic, &qs->cq[qidx], qs->cq_len))
  872. goto alloc_fail;
  873. }
  874. return 0;
  875. alloc_fail:
  876. nicvf_free_resources(nic);
  877. return -ENOMEM;
  878. }
  879. int nicvf_set_qset_resources(struct nicvf *nic)
  880. {
  881. struct queue_set *qs;
  882. qs = devm_kzalloc(&nic->pdev->dev, sizeof(*qs), GFP_KERNEL);
  883. if (!qs)
  884. return -ENOMEM;
  885. nic->qs = qs;
  886. /* Set count of each queue */
  887. qs->rbdr_cnt = DEFAULT_RBDR_CNT;
  888. qs->rq_cnt = min_t(u8, MAX_RCV_QUEUES_PER_QS, num_online_cpus());
  889. qs->sq_cnt = min_t(u8, MAX_SND_QUEUES_PER_QS, num_online_cpus());
  890. qs->cq_cnt = max_t(u8, qs->rq_cnt, qs->sq_cnt);
  891. /* Set queue lengths */
  892. qs->rbdr_len = RCV_BUF_COUNT;
  893. qs->sq_len = SND_QUEUE_LEN;
  894. qs->cq_len = CMP_QUEUE_LEN;
  895. nic->rx_queues = qs->rq_cnt;
  896. nic->tx_queues = qs->sq_cnt;
  897. nic->xdp_tx_queues = 0;
  898. return 0;
  899. }
  900. int nicvf_config_data_transfer(struct nicvf *nic, bool enable)
  901. {
  902. bool disable = false;
  903. struct queue_set *qs = nic->qs;
  904. struct queue_set *pqs = nic->pnicvf->qs;
  905. int qidx;
  906. if (!qs)
  907. return 0;
  908. /* Take primary VF's queue lengths.
  909. * This is needed to take queue lengths set from ethtool
  910. * into consideration.
  911. */
  912. if (nic->sqs_mode && pqs) {
  913. qs->cq_len = pqs->cq_len;
  914. qs->sq_len = pqs->sq_len;
  915. }
  916. if (enable) {
  917. if (nicvf_alloc_resources(nic))
  918. return -ENOMEM;
  919. for (qidx = 0; qidx < qs->sq_cnt; qidx++)
  920. nicvf_snd_queue_config(nic, qs, qidx, enable);
  921. for (qidx = 0; qidx < qs->cq_cnt; qidx++)
  922. nicvf_cmp_queue_config(nic, qs, qidx, enable);
  923. for (qidx = 0; qidx < qs->rbdr_cnt; qidx++)
  924. nicvf_rbdr_config(nic, qs, qidx, enable);
  925. for (qidx = 0; qidx < qs->rq_cnt; qidx++)
  926. nicvf_rcv_queue_config(nic, qs, qidx, enable);
  927. } else {
  928. for (qidx = 0; qidx < qs->rq_cnt; qidx++)
  929. nicvf_rcv_queue_config(nic, qs, qidx, disable);
  930. for (qidx = 0; qidx < qs->rbdr_cnt; qidx++)
  931. nicvf_rbdr_config(nic, qs, qidx, disable);
  932. for (qidx = 0; qidx < qs->sq_cnt; qidx++)
  933. nicvf_snd_queue_config(nic, qs, qidx, disable);
  934. for (qidx = 0; qidx < qs->cq_cnt; qidx++)
  935. nicvf_cmp_queue_config(nic, qs, qidx, disable);
  936. nicvf_free_resources(nic);
  937. }
  938. /* Reset RXQ's stats.
  939. * SQ's stats will get reset automatically once SQ is reset.
  940. */
  941. nicvf_reset_rcv_queue_stats(nic);
  942. return 0;
  943. }
  944. /* Get a free desc from SQ
  945. * returns descriptor ponter & descriptor number
  946. */
  947. static inline int nicvf_get_sq_desc(struct snd_queue *sq, int desc_cnt)
  948. {
  949. int qentry;
  950. qentry = sq->tail;
  951. if (!sq->is_xdp)
  952. atomic_sub(desc_cnt, &sq->free_cnt);
  953. else
  954. sq->xdp_free_cnt -= desc_cnt;
  955. sq->tail += desc_cnt;
  956. sq->tail &= (sq->dmem.q_len - 1);
  957. return qentry;
  958. }
  959. /* Rollback to previous tail pointer when descriptors not used */
  960. static inline void nicvf_rollback_sq_desc(struct snd_queue *sq,
  961. int qentry, int desc_cnt)
  962. {
  963. sq->tail = qentry;
  964. atomic_add(desc_cnt, &sq->free_cnt);
  965. }
  966. /* Free descriptor back to SQ for future use */
  967. void nicvf_put_sq_desc(struct snd_queue *sq, int desc_cnt)
  968. {
  969. if (!sq->is_xdp)
  970. atomic_add(desc_cnt, &sq->free_cnt);
  971. else
  972. sq->xdp_free_cnt += desc_cnt;
  973. sq->head += desc_cnt;
  974. sq->head &= (sq->dmem.q_len - 1);
  975. }
  976. static inline int nicvf_get_nxt_sqentry(struct snd_queue *sq, int qentry)
  977. {
  978. qentry++;
  979. qentry &= (sq->dmem.q_len - 1);
  980. return qentry;
  981. }
  982. void nicvf_sq_enable(struct nicvf *nic, struct snd_queue *sq, int qidx)
  983. {
  984. u64 sq_cfg;
  985. sq_cfg = nicvf_queue_reg_read(nic, NIC_QSET_SQ_0_7_CFG, qidx);
  986. sq_cfg |= NICVF_SQ_EN;
  987. nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_CFG, qidx, sq_cfg);
  988. /* Ring doorbell so that H/W restarts processing SQEs */
  989. nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_DOOR, qidx, 0);
  990. }
  991. void nicvf_sq_disable(struct nicvf *nic, int qidx)
  992. {
  993. u64 sq_cfg;
  994. sq_cfg = nicvf_queue_reg_read(nic, NIC_QSET_SQ_0_7_CFG, qidx);
  995. sq_cfg &= ~NICVF_SQ_EN;
  996. nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_CFG, qidx, sq_cfg);
  997. }
  998. void nicvf_sq_free_used_descs(struct net_device *netdev, struct snd_queue *sq,
  999. int qidx)
  1000. {
  1001. u64 head, tail;
  1002. struct sk_buff *skb;
  1003. struct nicvf *nic = netdev_priv(netdev);
  1004. struct sq_hdr_subdesc *hdr;
  1005. head = nicvf_queue_reg_read(nic, NIC_QSET_SQ_0_7_HEAD, qidx) >> 4;
  1006. tail = nicvf_queue_reg_read(nic, NIC_QSET_SQ_0_7_TAIL, qidx) >> 4;
  1007. while (sq->head != head) {
  1008. hdr = (struct sq_hdr_subdesc *)GET_SQ_DESC(sq, sq->head);
  1009. if (hdr->subdesc_type != SQ_DESC_TYPE_HEADER) {
  1010. nicvf_put_sq_desc(sq, 1);
  1011. continue;
  1012. }
  1013. skb = (struct sk_buff *)sq->skbuff[sq->head];
  1014. if (skb)
  1015. dev_kfree_skb_any(skb);
  1016. atomic64_add(1, (atomic64_t *)&netdev->stats.tx_packets);
  1017. atomic64_add(hdr->tot_len,
  1018. (atomic64_t *)&netdev->stats.tx_bytes);
  1019. nicvf_put_sq_desc(sq, hdr->subdesc_cnt + 1);
  1020. }
  1021. }
  1022. /* XDP Transmit APIs */
  1023. void nicvf_xdp_sq_doorbell(struct nicvf *nic,
  1024. struct snd_queue *sq, int sq_num)
  1025. {
  1026. if (!sq->xdp_desc_cnt)
  1027. return;
  1028. /* make sure all memory stores are done before ringing doorbell */
  1029. wmb();
  1030. /* Inform HW to xmit all TSO segments */
  1031. nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_DOOR,
  1032. sq_num, sq->xdp_desc_cnt);
  1033. sq->xdp_desc_cnt = 0;
  1034. }
  1035. static inline void
  1036. nicvf_xdp_sq_add_hdr_subdesc(struct snd_queue *sq, int qentry,
  1037. int subdesc_cnt, u64 data, int len)
  1038. {
  1039. struct sq_hdr_subdesc *hdr;
  1040. hdr = (struct sq_hdr_subdesc *)GET_SQ_DESC(sq, qentry);
  1041. memset(hdr, 0, SND_QUEUE_DESC_SIZE);
  1042. hdr->subdesc_type = SQ_DESC_TYPE_HEADER;
  1043. hdr->subdesc_cnt = subdesc_cnt;
  1044. hdr->tot_len = len;
  1045. hdr->post_cqe = 1;
  1046. sq->xdp_page[qentry] = (u64)virt_to_page((void *)data);
  1047. }
  1048. int nicvf_xdp_sq_append_pkt(struct nicvf *nic, struct snd_queue *sq,
  1049. u64 bufaddr, u64 dma_addr, u16 len)
  1050. {
  1051. int subdesc_cnt = MIN_SQ_DESC_PER_PKT_XMIT;
  1052. int qentry;
  1053. if (subdesc_cnt > sq->xdp_free_cnt)
  1054. return 0;
  1055. qentry = nicvf_get_sq_desc(sq, subdesc_cnt);
  1056. nicvf_xdp_sq_add_hdr_subdesc(sq, qentry, subdesc_cnt - 1, bufaddr, len);
  1057. qentry = nicvf_get_nxt_sqentry(sq, qentry);
  1058. nicvf_sq_add_gather_subdesc(sq, qentry, len, dma_addr);
  1059. sq->xdp_desc_cnt += subdesc_cnt;
  1060. return 1;
  1061. }
  1062. /* Calculate no of SQ subdescriptors needed to transmit all
  1063. * segments of this TSO packet.
  1064. * Taken from 'Tilera network driver' with a minor modification.
  1065. */
  1066. static int nicvf_tso_count_subdescs(struct sk_buff *skb)
  1067. {
  1068. struct skb_shared_info *sh = skb_shinfo(skb);
  1069. unsigned int sh_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
  1070. unsigned int data_len = skb->len - sh_len;
  1071. unsigned int p_len = sh->gso_size;
  1072. long f_id = -1; /* id of the current fragment */
  1073. long f_size = skb_headlen(skb) - sh_len; /* current fragment size */
  1074. long f_used = 0; /* bytes used from the current fragment */
  1075. long n; /* size of the current piece of payload */
  1076. int num_edescs = 0;
  1077. int segment;
  1078. for (segment = 0; segment < sh->gso_segs; segment++) {
  1079. unsigned int p_used = 0;
  1080. /* One edesc for header and for each piece of the payload. */
  1081. for (num_edescs++; p_used < p_len; num_edescs++) {
  1082. /* Advance as needed. */
  1083. while (f_used >= f_size) {
  1084. f_id++;
  1085. f_size = skb_frag_size(&sh->frags[f_id]);
  1086. f_used = 0;
  1087. }
  1088. /* Use bytes from the current fragment. */
  1089. n = p_len - p_used;
  1090. if (n > f_size - f_used)
  1091. n = f_size - f_used;
  1092. f_used += n;
  1093. p_used += n;
  1094. }
  1095. /* The last segment may be less than gso_size. */
  1096. data_len -= p_len;
  1097. if (data_len < p_len)
  1098. p_len = data_len;
  1099. }
  1100. /* '+ gso_segs' for SQ_HDR_SUDESCs for each segment */
  1101. return num_edescs + sh->gso_segs;
  1102. }
  1103. #define POST_CQE_DESC_COUNT 2
  1104. /* Get the number of SQ descriptors needed to xmit this skb */
  1105. static int nicvf_sq_subdesc_required(struct nicvf *nic, struct sk_buff *skb)
  1106. {
  1107. int subdesc_cnt = MIN_SQ_DESC_PER_PKT_XMIT;
  1108. if (skb_shinfo(skb)->gso_size && !nic->hw_tso) {
  1109. subdesc_cnt = nicvf_tso_count_subdescs(skb);
  1110. return subdesc_cnt;
  1111. }
  1112. /* Dummy descriptors to get TSO pkt completion notification */
  1113. if (nic->t88 && nic->hw_tso && skb_shinfo(skb)->gso_size)
  1114. subdesc_cnt += POST_CQE_DESC_COUNT;
  1115. if (skb_shinfo(skb)->nr_frags)
  1116. subdesc_cnt += skb_shinfo(skb)->nr_frags;
  1117. return subdesc_cnt;
  1118. }
  1119. /* Add SQ HEADER subdescriptor.
  1120. * First subdescriptor for every send descriptor.
  1121. */
  1122. static inline void
  1123. nicvf_sq_add_hdr_subdesc(struct nicvf *nic, struct snd_queue *sq, int qentry,
  1124. int subdesc_cnt, struct sk_buff *skb, int len)
  1125. {
  1126. int proto;
  1127. struct sq_hdr_subdesc *hdr;
  1128. union {
  1129. struct iphdr *v4;
  1130. struct ipv6hdr *v6;
  1131. unsigned char *hdr;
  1132. } ip;
  1133. ip.hdr = skb_network_header(skb);
  1134. hdr = (struct sq_hdr_subdesc *)GET_SQ_DESC(sq, qentry);
  1135. memset(hdr, 0, SND_QUEUE_DESC_SIZE);
  1136. hdr->subdesc_type = SQ_DESC_TYPE_HEADER;
  1137. if (nic->t88 && nic->hw_tso && skb_shinfo(skb)->gso_size) {
  1138. /* post_cqe = 0, to avoid HW posting a CQE for every TSO
  1139. * segment transmitted on 88xx.
  1140. */
  1141. hdr->subdesc_cnt = subdesc_cnt - POST_CQE_DESC_COUNT;
  1142. } else {
  1143. sq->skbuff[qentry] = (u64)skb;
  1144. /* Enable notification via CQE after processing SQE */
  1145. hdr->post_cqe = 1;
  1146. /* No of subdescriptors following this */
  1147. hdr->subdesc_cnt = subdesc_cnt;
  1148. }
  1149. hdr->tot_len = len;
  1150. /* Offload checksum calculation to HW */
  1151. if (skb->ip_summed == CHECKSUM_PARTIAL) {
  1152. hdr->csum_l3 = 1; /* Enable IP csum calculation */
  1153. hdr->l3_offset = skb_network_offset(skb);
  1154. hdr->l4_offset = skb_transport_offset(skb);
  1155. proto = (ip.v4->version == 4) ? ip.v4->protocol :
  1156. ip.v6->nexthdr;
  1157. switch (proto) {
  1158. case IPPROTO_TCP:
  1159. hdr->csum_l4 = SEND_L4_CSUM_TCP;
  1160. break;
  1161. case IPPROTO_UDP:
  1162. hdr->csum_l4 = SEND_L4_CSUM_UDP;
  1163. break;
  1164. case IPPROTO_SCTP:
  1165. hdr->csum_l4 = SEND_L4_CSUM_SCTP;
  1166. break;
  1167. }
  1168. }
  1169. if (nic->hw_tso && skb_shinfo(skb)->gso_size) {
  1170. hdr->tso = 1;
  1171. hdr->tso_start = skb_transport_offset(skb) + tcp_hdrlen(skb);
  1172. hdr->tso_max_paysize = skb_shinfo(skb)->gso_size;
  1173. /* For non-tunneled pkts, point this to L2 ethertype */
  1174. hdr->inner_l3_offset = skb_network_offset(skb) - 2;
  1175. this_cpu_inc(nic->pnicvf->drv_stats->tx_tso);
  1176. }
  1177. }
  1178. /* SQ GATHER subdescriptor
  1179. * Must follow HDR descriptor
  1180. */
  1181. static inline void nicvf_sq_add_gather_subdesc(struct snd_queue *sq, int qentry,
  1182. int size, u64 data)
  1183. {
  1184. struct sq_gather_subdesc *gather;
  1185. qentry &= (sq->dmem.q_len - 1);
  1186. gather = (struct sq_gather_subdesc *)GET_SQ_DESC(sq, qentry);
  1187. memset(gather, 0, SND_QUEUE_DESC_SIZE);
  1188. gather->subdesc_type = SQ_DESC_TYPE_GATHER;
  1189. gather->ld_type = NIC_SEND_LD_TYPE_E_LDD;
  1190. gather->size = size;
  1191. gather->addr = data;
  1192. }
  1193. /* Add HDR + IMMEDIATE subdescriptors right after descriptors of a TSO
  1194. * packet so that a CQE is posted as a notifation for transmission of
  1195. * TSO packet.
  1196. */
  1197. static inline void nicvf_sq_add_cqe_subdesc(struct snd_queue *sq, int qentry,
  1198. int tso_sqe, struct sk_buff *skb)
  1199. {
  1200. struct sq_imm_subdesc *imm;
  1201. struct sq_hdr_subdesc *hdr;
  1202. sq->skbuff[qentry] = (u64)skb;
  1203. hdr = (struct sq_hdr_subdesc *)GET_SQ_DESC(sq, qentry);
  1204. memset(hdr, 0, SND_QUEUE_DESC_SIZE);
  1205. hdr->subdesc_type = SQ_DESC_TYPE_HEADER;
  1206. /* Enable notification via CQE after processing SQE */
  1207. hdr->post_cqe = 1;
  1208. /* There is no packet to transmit here */
  1209. hdr->dont_send = 1;
  1210. hdr->subdesc_cnt = POST_CQE_DESC_COUNT - 1;
  1211. hdr->tot_len = 1;
  1212. /* Actual TSO header SQE index, needed for cleanup */
  1213. hdr->rsvd2 = tso_sqe;
  1214. qentry = nicvf_get_nxt_sqentry(sq, qentry);
  1215. imm = (struct sq_imm_subdesc *)GET_SQ_DESC(sq, qentry);
  1216. memset(imm, 0, SND_QUEUE_DESC_SIZE);
  1217. imm->subdesc_type = SQ_DESC_TYPE_IMMEDIATE;
  1218. imm->len = 1;
  1219. }
  1220. static inline void nicvf_sq_doorbell(struct nicvf *nic, struct sk_buff *skb,
  1221. int sq_num, int desc_cnt)
  1222. {
  1223. struct netdev_queue *txq;
  1224. txq = netdev_get_tx_queue(nic->pnicvf->netdev,
  1225. skb_get_queue_mapping(skb));
  1226. netdev_tx_sent_queue(txq, skb->len);
  1227. /* make sure all memory stores are done before ringing doorbell */
  1228. smp_wmb();
  1229. /* Inform HW to xmit all TSO segments */
  1230. nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_DOOR,
  1231. sq_num, desc_cnt);
  1232. }
  1233. /* Segment a TSO packet into 'gso_size' segments and append
  1234. * them to SQ for transfer
  1235. */
  1236. static int nicvf_sq_append_tso(struct nicvf *nic, struct snd_queue *sq,
  1237. int sq_num, int qentry, struct sk_buff *skb)
  1238. {
  1239. struct tso_t tso;
  1240. int seg_subdescs = 0, desc_cnt = 0;
  1241. int seg_len, total_len, data_left;
  1242. int hdr_qentry = qentry;
  1243. int hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
  1244. tso_start(skb, &tso);
  1245. total_len = skb->len - hdr_len;
  1246. while (total_len > 0) {
  1247. char *hdr;
  1248. /* Save Qentry for adding HDR_SUBDESC at the end */
  1249. hdr_qentry = qentry;
  1250. data_left = min_t(int, skb_shinfo(skb)->gso_size, total_len);
  1251. total_len -= data_left;
  1252. /* Add segment's header */
  1253. qentry = nicvf_get_nxt_sqentry(sq, qentry);
  1254. hdr = sq->tso_hdrs + qentry * TSO_HEADER_SIZE;
  1255. tso_build_hdr(skb, hdr, &tso, data_left, total_len == 0);
  1256. nicvf_sq_add_gather_subdesc(sq, qentry, hdr_len,
  1257. sq->tso_hdrs_phys +
  1258. qentry * TSO_HEADER_SIZE);
  1259. /* HDR_SUDESC + GATHER */
  1260. seg_subdescs = 2;
  1261. seg_len = hdr_len;
  1262. /* Add segment's payload fragments */
  1263. while (data_left > 0) {
  1264. int size;
  1265. size = min_t(int, tso.size, data_left);
  1266. qentry = nicvf_get_nxt_sqentry(sq, qentry);
  1267. nicvf_sq_add_gather_subdesc(sq, qentry, size,
  1268. virt_to_phys(tso.data));
  1269. seg_subdescs++;
  1270. seg_len += size;
  1271. data_left -= size;
  1272. tso_build_data(skb, &tso, size);
  1273. }
  1274. nicvf_sq_add_hdr_subdesc(nic, sq, hdr_qentry,
  1275. seg_subdescs - 1, skb, seg_len);
  1276. sq->skbuff[hdr_qentry] = (u64)NULL;
  1277. qentry = nicvf_get_nxt_sqentry(sq, qentry);
  1278. desc_cnt += seg_subdescs;
  1279. }
  1280. /* Save SKB in the last segment for freeing */
  1281. sq->skbuff[hdr_qentry] = (u64)skb;
  1282. nicvf_sq_doorbell(nic, skb, sq_num, desc_cnt);
  1283. this_cpu_inc(nic->pnicvf->drv_stats->tx_tso);
  1284. return 1;
  1285. }
  1286. /* Append an skb to a SQ for packet transfer. */
  1287. int nicvf_sq_append_skb(struct nicvf *nic, struct snd_queue *sq,
  1288. struct sk_buff *skb, u8 sq_num)
  1289. {
  1290. int i, size;
  1291. int subdesc_cnt, hdr_sqe = 0;
  1292. int qentry;
  1293. u64 dma_addr;
  1294. subdesc_cnt = nicvf_sq_subdesc_required(nic, skb);
  1295. if (subdesc_cnt > atomic_read(&sq->free_cnt))
  1296. goto append_fail;
  1297. qentry = nicvf_get_sq_desc(sq, subdesc_cnt);
  1298. /* Check if its a TSO packet */
  1299. if (skb_shinfo(skb)->gso_size && !nic->hw_tso)
  1300. return nicvf_sq_append_tso(nic, sq, sq_num, qentry, skb);
  1301. /* Add SQ header subdesc */
  1302. nicvf_sq_add_hdr_subdesc(nic, sq, qentry, subdesc_cnt - 1,
  1303. skb, skb->len);
  1304. hdr_sqe = qentry;
  1305. /* Add SQ gather subdescs */
  1306. qentry = nicvf_get_nxt_sqentry(sq, qentry);
  1307. size = skb_is_nonlinear(skb) ? skb_headlen(skb) : skb->len;
  1308. /* HW will ensure data coherency, CPU sync not required */
  1309. dma_addr = dma_map_page_attrs(&nic->pdev->dev, virt_to_page(skb->data),
  1310. offset_in_page(skb->data), size,
  1311. DMA_TO_DEVICE, DMA_ATTR_SKIP_CPU_SYNC);
  1312. if (dma_mapping_error(&nic->pdev->dev, dma_addr)) {
  1313. nicvf_rollback_sq_desc(sq, qentry, subdesc_cnt);
  1314. return 0;
  1315. }
  1316. nicvf_sq_add_gather_subdesc(sq, qentry, size, dma_addr);
  1317. /* Check for scattered buffer */
  1318. if (!skb_is_nonlinear(skb))
  1319. goto doorbell;
  1320. for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
  1321. const struct skb_frag_struct *frag;
  1322. frag = &skb_shinfo(skb)->frags[i];
  1323. qentry = nicvf_get_nxt_sqentry(sq, qentry);
  1324. size = skb_frag_size(frag);
  1325. dma_addr = dma_map_page_attrs(&nic->pdev->dev,
  1326. skb_frag_page(frag),
  1327. frag->page_offset, size,
  1328. DMA_TO_DEVICE,
  1329. DMA_ATTR_SKIP_CPU_SYNC);
  1330. if (dma_mapping_error(&nic->pdev->dev, dma_addr)) {
  1331. /* Free entire chain of mapped buffers
  1332. * here 'i' = frags mapped + above mapped skb->data
  1333. */
  1334. nicvf_unmap_sndq_buffers(nic, sq, hdr_sqe, i);
  1335. nicvf_rollback_sq_desc(sq, qentry, subdesc_cnt);
  1336. return 0;
  1337. }
  1338. nicvf_sq_add_gather_subdesc(sq, qentry, size, dma_addr);
  1339. }
  1340. doorbell:
  1341. if (nic->t88 && skb_shinfo(skb)->gso_size) {
  1342. qentry = nicvf_get_nxt_sqentry(sq, qentry);
  1343. nicvf_sq_add_cqe_subdesc(sq, qentry, hdr_sqe, skb);
  1344. }
  1345. nicvf_sq_doorbell(nic, skb, sq_num, subdesc_cnt);
  1346. return 1;
  1347. append_fail:
  1348. /* Use original PCI dev for debug log */
  1349. nic = nic->pnicvf;
  1350. netdev_dbg(nic->netdev, "Not enough SQ descriptors to xmit pkt\n");
  1351. return 0;
  1352. }
  1353. static inline unsigned frag_num(unsigned i)
  1354. {
  1355. #ifdef __BIG_ENDIAN
  1356. return (i & ~3) + 3 - (i & 3);
  1357. #else
  1358. return i;
  1359. #endif
  1360. }
  1361. static void nicvf_unmap_rcv_buffer(struct nicvf *nic, u64 dma_addr,
  1362. u64 buf_addr, bool xdp)
  1363. {
  1364. struct page *page = NULL;
  1365. int len = RCV_FRAG_LEN;
  1366. if (xdp) {
  1367. page = virt_to_page(phys_to_virt(buf_addr));
  1368. /* Check if it's a recycled page, if not
  1369. * unmap the DMA mapping.
  1370. *
  1371. * Recycled page holds an extra reference.
  1372. */
  1373. if (page_ref_count(page) != 1)
  1374. return;
  1375. len += XDP_PACKET_HEADROOM;
  1376. /* Receive buffers in XDP mode are mapped from page start */
  1377. dma_addr &= PAGE_MASK;
  1378. }
  1379. dma_unmap_page_attrs(&nic->pdev->dev, dma_addr, len,
  1380. DMA_FROM_DEVICE, DMA_ATTR_SKIP_CPU_SYNC);
  1381. }
  1382. /* Returns SKB for a received packet */
  1383. struct sk_buff *nicvf_get_rcv_skb(struct nicvf *nic,
  1384. struct cqe_rx_t *cqe_rx, bool xdp)
  1385. {
  1386. int frag;
  1387. int payload_len = 0;
  1388. struct sk_buff *skb = NULL;
  1389. struct page *page;
  1390. int offset;
  1391. u16 *rb_lens = NULL;
  1392. u64 *rb_ptrs = NULL;
  1393. u64 phys_addr;
  1394. rb_lens = (void *)cqe_rx + (3 * sizeof(u64));
  1395. /* Except 88xx pass1 on all other chips CQE_RX2_S is added to
  1396. * CQE_RX at word6, hence buffer pointers move by word
  1397. *
  1398. * Use existing 'hw_tso' flag which will be set for all chips
  1399. * except 88xx pass1 instead of a additional cache line
  1400. * access (or miss) by using pci dev's revision.
  1401. */
  1402. if (!nic->hw_tso)
  1403. rb_ptrs = (void *)cqe_rx + (6 * sizeof(u64));
  1404. else
  1405. rb_ptrs = (void *)cqe_rx + (7 * sizeof(u64));
  1406. for (frag = 0; frag < cqe_rx->rb_cnt; frag++) {
  1407. payload_len = rb_lens[frag_num(frag)];
  1408. phys_addr = nicvf_iova_to_phys(nic, *rb_ptrs);
  1409. if (!phys_addr) {
  1410. if (skb)
  1411. dev_kfree_skb_any(skb);
  1412. return NULL;
  1413. }
  1414. if (!frag) {
  1415. /* First fragment */
  1416. nicvf_unmap_rcv_buffer(nic,
  1417. *rb_ptrs - cqe_rx->align_pad,
  1418. phys_addr, xdp);
  1419. skb = nicvf_rb_ptr_to_skb(nic,
  1420. phys_addr - cqe_rx->align_pad,
  1421. payload_len);
  1422. if (!skb)
  1423. return NULL;
  1424. skb_reserve(skb, cqe_rx->align_pad);
  1425. skb_put(skb, payload_len);
  1426. } else {
  1427. /* Add fragments */
  1428. nicvf_unmap_rcv_buffer(nic, *rb_ptrs, phys_addr, xdp);
  1429. page = virt_to_page(phys_to_virt(phys_addr));
  1430. offset = phys_to_virt(phys_addr) - page_address(page);
  1431. skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, page,
  1432. offset, payload_len, RCV_FRAG_LEN);
  1433. }
  1434. /* Next buffer pointer */
  1435. rb_ptrs++;
  1436. }
  1437. return skb;
  1438. }
  1439. static u64 nicvf_int_type_to_mask(int int_type, int q_idx)
  1440. {
  1441. u64 reg_val;
  1442. switch (int_type) {
  1443. case NICVF_INTR_CQ:
  1444. reg_val = ((1ULL << q_idx) << NICVF_INTR_CQ_SHIFT);
  1445. break;
  1446. case NICVF_INTR_SQ:
  1447. reg_val = ((1ULL << q_idx) << NICVF_INTR_SQ_SHIFT);
  1448. break;
  1449. case NICVF_INTR_RBDR:
  1450. reg_val = ((1ULL << q_idx) << NICVF_INTR_RBDR_SHIFT);
  1451. break;
  1452. case NICVF_INTR_PKT_DROP:
  1453. reg_val = (1ULL << NICVF_INTR_PKT_DROP_SHIFT);
  1454. break;
  1455. case NICVF_INTR_TCP_TIMER:
  1456. reg_val = (1ULL << NICVF_INTR_TCP_TIMER_SHIFT);
  1457. break;
  1458. case NICVF_INTR_MBOX:
  1459. reg_val = (1ULL << NICVF_INTR_MBOX_SHIFT);
  1460. break;
  1461. case NICVF_INTR_QS_ERR:
  1462. reg_val = (1ULL << NICVF_INTR_QS_ERR_SHIFT);
  1463. break;
  1464. default:
  1465. reg_val = 0;
  1466. }
  1467. return reg_val;
  1468. }
  1469. /* Enable interrupt */
  1470. void nicvf_enable_intr(struct nicvf *nic, int int_type, int q_idx)
  1471. {
  1472. u64 mask = nicvf_int_type_to_mask(int_type, q_idx);
  1473. if (!mask) {
  1474. netdev_dbg(nic->netdev,
  1475. "Failed to enable interrupt: unknown type\n");
  1476. return;
  1477. }
  1478. nicvf_reg_write(nic, NIC_VF_ENA_W1S,
  1479. nicvf_reg_read(nic, NIC_VF_ENA_W1S) | mask);
  1480. }
  1481. /* Disable interrupt */
  1482. void nicvf_disable_intr(struct nicvf *nic, int int_type, int q_idx)
  1483. {
  1484. u64 mask = nicvf_int_type_to_mask(int_type, q_idx);
  1485. if (!mask) {
  1486. netdev_dbg(nic->netdev,
  1487. "Failed to disable interrupt: unknown type\n");
  1488. return;
  1489. }
  1490. nicvf_reg_write(nic, NIC_VF_ENA_W1C, mask);
  1491. }
  1492. /* Clear interrupt */
  1493. void nicvf_clear_intr(struct nicvf *nic, int int_type, int q_idx)
  1494. {
  1495. u64 mask = nicvf_int_type_to_mask(int_type, q_idx);
  1496. if (!mask) {
  1497. netdev_dbg(nic->netdev,
  1498. "Failed to clear interrupt: unknown type\n");
  1499. return;
  1500. }
  1501. nicvf_reg_write(nic, NIC_VF_INT, mask);
  1502. }
  1503. /* Check if interrupt is enabled */
  1504. int nicvf_is_intr_enabled(struct nicvf *nic, int int_type, int q_idx)
  1505. {
  1506. u64 mask = nicvf_int_type_to_mask(int_type, q_idx);
  1507. /* If interrupt type is unknown, we treat it disabled. */
  1508. if (!mask) {
  1509. netdev_dbg(nic->netdev,
  1510. "Failed to check interrupt enable: unknown type\n");
  1511. return 0;
  1512. }
  1513. return mask & nicvf_reg_read(nic, NIC_VF_ENA_W1S);
  1514. }
  1515. void nicvf_update_rq_stats(struct nicvf *nic, int rq_idx)
  1516. {
  1517. struct rcv_queue *rq;
  1518. #define GET_RQ_STATS(reg) \
  1519. nicvf_reg_read(nic, NIC_QSET_RQ_0_7_STAT_0_1 |\
  1520. (rq_idx << NIC_Q_NUM_SHIFT) | (reg << 3))
  1521. rq = &nic->qs->rq[rq_idx];
  1522. rq->stats.bytes = GET_RQ_STATS(RQ_SQ_STATS_OCTS);
  1523. rq->stats.pkts = GET_RQ_STATS(RQ_SQ_STATS_PKTS);
  1524. }
  1525. void nicvf_update_sq_stats(struct nicvf *nic, int sq_idx)
  1526. {
  1527. struct snd_queue *sq;
  1528. #define GET_SQ_STATS(reg) \
  1529. nicvf_reg_read(nic, NIC_QSET_SQ_0_7_STAT_0_1 |\
  1530. (sq_idx << NIC_Q_NUM_SHIFT) | (reg << 3))
  1531. sq = &nic->qs->sq[sq_idx];
  1532. sq->stats.bytes = GET_SQ_STATS(RQ_SQ_STATS_OCTS);
  1533. sq->stats.pkts = GET_SQ_STATS(RQ_SQ_STATS_PKTS);
  1534. }
  1535. /* Check for errors in the receive cmp.queue entry */
  1536. int nicvf_check_cqe_rx_errs(struct nicvf *nic, struct cqe_rx_t *cqe_rx)
  1537. {
  1538. if (netif_msg_rx_err(nic))
  1539. netdev_err(nic->netdev,
  1540. "%s: RX error CQE err_level 0x%x err_opcode 0x%x\n",
  1541. nic->netdev->name,
  1542. cqe_rx->err_level, cqe_rx->err_opcode);
  1543. switch (cqe_rx->err_opcode) {
  1544. case CQ_RX_ERROP_RE_PARTIAL:
  1545. this_cpu_inc(nic->drv_stats->rx_bgx_truncated_pkts);
  1546. break;
  1547. case CQ_RX_ERROP_RE_JABBER:
  1548. this_cpu_inc(nic->drv_stats->rx_jabber_errs);
  1549. break;
  1550. case CQ_RX_ERROP_RE_FCS:
  1551. this_cpu_inc(nic->drv_stats->rx_fcs_errs);
  1552. break;
  1553. case CQ_RX_ERROP_RE_RX_CTL:
  1554. this_cpu_inc(nic->drv_stats->rx_bgx_errs);
  1555. break;
  1556. case CQ_RX_ERROP_PREL2_ERR:
  1557. this_cpu_inc(nic->drv_stats->rx_prel2_errs);
  1558. break;
  1559. case CQ_RX_ERROP_L2_MAL:
  1560. this_cpu_inc(nic->drv_stats->rx_l2_hdr_malformed);
  1561. break;
  1562. case CQ_RX_ERROP_L2_OVERSIZE:
  1563. this_cpu_inc(nic->drv_stats->rx_oversize);
  1564. break;
  1565. case CQ_RX_ERROP_L2_UNDERSIZE:
  1566. this_cpu_inc(nic->drv_stats->rx_undersize);
  1567. break;
  1568. case CQ_RX_ERROP_L2_LENMISM:
  1569. this_cpu_inc(nic->drv_stats->rx_l2_len_mismatch);
  1570. break;
  1571. case CQ_RX_ERROP_L2_PCLP:
  1572. this_cpu_inc(nic->drv_stats->rx_l2_pclp);
  1573. break;
  1574. case CQ_RX_ERROP_IP_NOT:
  1575. this_cpu_inc(nic->drv_stats->rx_ip_ver_errs);
  1576. break;
  1577. case CQ_RX_ERROP_IP_CSUM_ERR:
  1578. this_cpu_inc(nic->drv_stats->rx_ip_csum_errs);
  1579. break;
  1580. case CQ_RX_ERROP_IP_MAL:
  1581. this_cpu_inc(nic->drv_stats->rx_ip_hdr_malformed);
  1582. break;
  1583. case CQ_RX_ERROP_IP_MALD:
  1584. this_cpu_inc(nic->drv_stats->rx_ip_payload_malformed);
  1585. break;
  1586. case CQ_RX_ERROP_IP_HOP:
  1587. this_cpu_inc(nic->drv_stats->rx_ip_ttl_errs);
  1588. break;
  1589. case CQ_RX_ERROP_L3_PCLP:
  1590. this_cpu_inc(nic->drv_stats->rx_l3_pclp);
  1591. break;
  1592. case CQ_RX_ERROP_L4_MAL:
  1593. this_cpu_inc(nic->drv_stats->rx_l4_malformed);
  1594. break;
  1595. case CQ_RX_ERROP_L4_CHK:
  1596. this_cpu_inc(nic->drv_stats->rx_l4_csum_errs);
  1597. break;
  1598. case CQ_RX_ERROP_UDP_LEN:
  1599. this_cpu_inc(nic->drv_stats->rx_udp_len_errs);
  1600. break;
  1601. case CQ_RX_ERROP_L4_PORT:
  1602. this_cpu_inc(nic->drv_stats->rx_l4_port_errs);
  1603. break;
  1604. case CQ_RX_ERROP_TCP_FLAG:
  1605. this_cpu_inc(nic->drv_stats->rx_tcp_flag_errs);
  1606. break;
  1607. case CQ_RX_ERROP_TCP_OFFSET:
  1608. this_cpu_inc(nic->drv_stats->rx_tcp_offset_errs);
  1609. break;
  1610. case CQ_RX_ERROP_L4_PCLP:
  1611. this_cpu_inc(nic->drv_stats->rx_l4_pclp);
  1612. break;
  1613. case CQ_RX_ERROP_RBDR_TRUNC:
  1614. this_cpu_inc(nic->drv_stats->rx_truncated_pkts);
  1615. break;
  1616. }
  1617. return 1;
  1618. }
  1619. /* Check for errors in the send cmp.queue entry */
  1620. int nicvf_check_cqe_tx_errs(struct nicvf *nic, struct cqe_send_t *cqe_tx)
  1621. {
  1622. switch (cqe_tx->send_status) {
  1623. case CQ_TX_ERROP_DESC_FAULT:
  1624. this_cpu_inc(nic->drv_stats->tx_desc_fault);
  1625. break;
  1626. case CQ_TX_ERROP_HDR_CONS_ERR:
  1627. this_cpu_inc(nic->drv_stats->tx_hdr_cons_err);
  1628. break;
  1629. case CQ_TX_ERROP_SUBDC_ERR:
  1630. this_cpu_inc(nic->drv_stats->tx_subdesc_err);
  1631. break;
  1632. case CQ_TX_ERROP_MAX_SIZE_VIOL:
  1633. this_cpu_inc(nic->drv_stats->tx_max_size_exceeded);
  1634. break;
  1635. case CQ_TX_ERROP_IMM_SIZE_OFLOW:
  1636. this_cpu_inc(nic->drv_stats->tx_imm_size_oflow);
  1637. break;
  1638. case CQ_TX_ERROP_DATA_SEQUENCE_ERR:
  1639. this_cpu_inc(nic->drv_stats->tx_data_seq_err);
  1640. break;
  1641. case CQ_TX_ERROP_MEM_SEQUENCE_ERR:
  1642. this_cpu_inc(nic->drv_stats->tx_mem_seq_err);
  1643. break;
  1644. case CQ_TX_ERROP_LOCK_VIOL:
  1645. this_cpu_inc(nic->drv_stats->tx_lock_viol);
  1646. break;
  1647. case CQ_TX_ERROP_DATA_FAULT:
  1648. this_cpu_inc(nic->drv_stats->tx_data_fault);
  1649. break;
  1650. case CQ_TX_ERROP_TSTMP_CONFLICT:
  1651. this_cpu_inc(nic->drv_stats->tx_tstmp_conflict);
  1652. break;
  1653. case CQ_TX_ERROP_TSTMP_TIMEOUT:
  1654. this_cpu_inc(nic->drv_stats->tx_tstmp_timeout);
  1655. break;
  1656. case CQ_TX_ERROP_MEM_FAULT:
  1657. this_cpu_inc(nic->drv_stats->tx_mem_fault);
  1658. break;
  1659. case CQ_TX_ERROP_CK_OVERLAP:
  1660. this_cpu_inc(nic->drv_stats->tx_csum_overlap);
  1661. break;
  1662. case CQ_TX_ERROP_CK_OFLOW:
  1663. this_cpu_inc(nic->drv_stats->tx_csum_overflow);
  1664. break;
  1665. }
  1666. return 1;
  1667. }