nicvf_queues.c 52 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976
  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 = kcalloc(rbdr->pgcnt, sizeof(*rbdr->pgcache),
  257. 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. xdp_rxq_info_unreg(&rq->xdp_rxq);
  655. return;
  656. }
  657. rq->cq_qs = qs->vnic_id;
  658. rq->cq_idx = qidx;
  659. rq->start_rbdr_qs = qs->vnic_id;
  660. rq->start_qs_rbdr_idx = qs->rbdr_cnt - 1;
  661. rq->cont_rbdr_qs = qs->vnic_id;
  662. rq->cont_qs_rbdr_idx = qs->rbdr_cnt - 1;
  663. /* all writes of RBDR data to be loaded into L2 Cache as well*/
  664. rq->caching = 1;
  665. /* Driver have no proper error path for failed XDP RX-queue info reg */
  666. WARN_ON(xdp_rxq_info_reg(&rq->xdp_rxq, nic->netdev, qidx) < 0);
  667. /* Send a mailbox msg to PF to config RQ */
  668. mbx.rq.msg = NIC_MBOX_MSG_RQ_CFG;
  669. mbx.rq.qs_num = qs->vnic_id;
  670. mbx.rq.rq_num = qidx;
  671. mbx.rq.cfg = (rq->caching << 26) | (rq->cq_qs << 19) |
  672. (rq->cq_idx << 16) | (rq->cont_rbdr_qs << 9) |
  673. (rq->cont_qs_rbdr_idx << 8) |
  674. (rq->start_rbdr_qs << 1) | (rq->start_qs_rbdr_idx);
  675. nicvf_send_msg_to_pf(nic, &mbx);
  676. mbx.rq.msg = NIC_MBOX_MSG_RQ_BP_CFG;
  677. mbx.rq.cfg = BIT_ULL(63) | BIT_ULL(62) |
  678. (RQ_PASS_RBDR_LVL << 16) | (RQ_PASS_CQ_LVL << 8) |
  679. (qs->vnic_id << 0);
  680. nicvf_send_msg_to_pf(nic, &mbx);
  681. /* RQ drop config
  682. * Enable CQ drop to reserve sufficient CQEs for all tx packets
  683. */
  684. mbx.rq.msg = NIC_MBOX_MSG_RQ_DROP_CFG;
  685. mbx.rq.cfg = BIT_ULL(63) | BIT_ULL(62) |
  686. (RQ_PASS_RBDR_LVL << 40) | (RQ_DROP_RBDR_LVL << 32) |
  687. (RQ_PASS_CQ_LVL << 16) | (RQ_DROP_CQ_LVL << 8);
  688. nicvf_send_msg_to_pf(nic, &mbx);
  689. if (!nic->sqs_mode && (qidx == 0)) {
  690. /* Enable checking L3/L4 length and TCP/UDP checksums
  691. * Also allow IPv6 pkts with zero UDP checksum.
  692. */
  693. nicvf_queue_reg_write(nic, NIC_QSET_RQ_GEN_CFG, 0,
  694. (BIT(24) | BIT(23) | BIT(21) | BIT(20)));
  695. nicvf_config_vlan_stripping(nic, nic->netdev->features);
  696. }
  697. /* Enable Receive queue */
  698. memset(&rq_cfg, 0, sizeof(struct rq_cfg));
  699. rq_cfg.ena = 1;
  700. rq_cfg.tcp_ena = 0;
  701. nicvf_queue_reg_write(nic, NIC_QSET_RQ_0_7_CFG, qidx, *(u64 *)&rq_cfg);
  702. }
  703. /* Configures completion queue */
  704. void nicvf_cmp_queue_config(struct nicvf *nic, struct queue_set *qs,
  705. int qidx, bool enable)
  706. {
  707. struct cmp_queue *cq;
  708. struct cq_cfg cq_cfg;
  709. cq = &qs->cq[qidx];
  710. cq->enable = enable;
  711. if (!cq->enable) {
  712. nicvf_reclaim_cmp_queue(nic, qs, qidx);
  713. return;
  714. }
  715. /* Reset completion queue */
  716. nicvf_queue_reg_write(nic, NIC_QSET_CQ_0_7_CFG, qidx, NICVF_CQ_RESET);
  717. if (!cq->enable)
  718. return;
  719. spin_lock_init(&cq->lock);
  720. /* Set completion queue base address */
  721. nicvf_queue_reg_write(nic, NIC_QSET_CQ_0_7_BASE,
  722. qidx, (u64)(cq->dmem.phys_base));
  723. /* Enable Completion queue */
  724. memset(&cq_cfg, 0, sizeof(struct cq_cfg));
  725. cq_cfg.ena = 1;
  726. cq_cfg.reset = 0;
  727. cq_cfg.caching = 0;
  728. cq_cfg.qsize = ilog2(qs->cq_len >> 10);
  729. cq_cfg.avg_con = 0;
  730. nicvf_queue_reg_write(nic, NIC_QSET_CQ_0_7_CFG, qidx, *(u64 *)&cq_cfg);
  731. /* Set threshold value for interrupt generation */
  732. nicvf_queue_reg_write(nic, NIC_QSET_CQ_0_7_THRESH, qidx, cq->thresh);
  733. nicvf_queue_reg_write(nic, NIC_QSET_CQ_0_7_CFG2,
  734. qidx, CMP_QUEUE_TIMER_THRESH);
  735. }
  736. /* Configures transmit queue */
  737. static void nicvf_snd_queue_config(struct nicvf *nic, struct queue_set *qs,
  738. int qidx, bool enable)
  739. {
  740. union nic_mbx mbx = {};
  741. struct snd_queue *sq;
  742. struct sq_cfg sq_cfg;
  743. sq = &qs->sq[qidx];
  744. sq->enable = enable;
  745. if (!sq->enable) {
  746. nicvf_reclaim_snd_queue(nic, qs, qidx);
  747. return;
  748. }
  749. /* Reset send queue */
  750. nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_CFG, qidx, NICVF_SQ_RESET);
  751. sq->cq_qs = qs->vnic_id;
  752. sq->cq_idx = qidx;
  753. /* Send a mailbox msg to PF to config SQ */
  754. mbx.sq.msg = NIC_MBOX_MSG_SQ_CFG;
  755. mbx.sq.qs_num = qs->vnic_id;
  756. mbx.sq.sq_num = qidx;
  757. mbx.sq.sqs_mode = nic->sqs_mode;
  758. mbx.sq.cfg = (sq->cq_qs << 3) | sq->cq_idx;
  759. nicvf_send_msg_to_pf(nic, &mbx);
  760. /* Set queue base address */
  761. nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_BASE,
  762. qidx, (u64)(sq->dmem.phys_base));
  763. /* Enable send queue & set queue size */
  764. memset(&sq_cfg, 0, sizeof(struct sq_cfg));
  765. sq_cfg.ena = 1;
  766. sq_cfg.reset = 0;
  767. sq_cfg.ldwb = 0;
  768. sq_cfg.qsize = ilog2(qs->sq_len >> 10);
  769. sq_cfg.tstmp_bgx_intf = 0;
  770. /* CQ's level at which HW will stop processing SQEs to avoid
  771. * transmitting a pkt with no space in CQ to post CQE_TX.
  772. */
  773. sq_cfg.cq_limit = (CMP_QUEUE_PIPELINE_RSVD * 256) / qs->cq_len;
  774. nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_CFG, qidx, *(u64 *)&sq_cfg);
  775. /* Set threshold value for interrupt generation */
  776. nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_THRESH, qidx, sq->thresh);
  777. /* Set queue:cpu affinity for better load distribution */
  778. if (cpu_online(qidx)) {
  779. cpumask_set_cpu(qidx, &sq->affinity_mask);
  780. netif_set_xps_queue(nic->netdev,
  781. &sq->affinity_mask, qidx);
  782. }
  783. }
  784. /* Configures receive buffer descriptor ring */
  785. static void nicvf_rbdr_config(struct nicvf *nic, struct queue_set *qs,
  786. int qidx, bool enable)
  787. {
  788. struct rbdr *rbdr;
  789. struct rbdr_cfg rbdr_cfg;
  790. rbdr = &qs->rbdr[qidx];
  791. nicvf_reclaim_rbdr(nic, rbdr, qidx);
  792. if (!enable)
  793. return;
  794. /* Set descriptor base address */
  795. nicvf_queue_reg_write(nic, NIC_QSET_RBDR_0_1_BASE,
  796. qidx, (u64)(rbdr->dmem.phys_base));
  797. /* Enable RBDR & set queue size */
  798. /* Buffer size should be in multiples of 128 bytes */
  799. memset(&rbdr_cfg, 0, sizeof(struct rbdr_cfg));
  800. rbdr_cfg.ena = 1;
  801. rbdr_cfg.reset = 0;
  802. rbdr_cfg.ldwb = 0;
  803. rbdr_cfg.qsize = RBDR_SIZE;
  804. rbdr_cfg.avg_con = 0;
  805. rbdr_cfg.lines = rbdr->dma_size / 128;
  806. nicvf_queue_reg_write(nic, NIC_QSET_RBDR_0_1_CFG,
  807. qidx, *(u64 *)&rbdr_cfg);
  808. /* Notify HW */
  809. nicvf_queue_reg_write(nic, NIC_QSET_RBDR_0_1_DOOR,
  810. qidx, qs->rbdr_len - 1);
  811. /* Set threshold value for interrupt generation */
  812. nicvf_queue_reg_write(nic, NIC_QSET_RBDR_0_1_THRESH,
  813. qidx, rbdr->thresh - 1);
  814. }
  815. /* Requests PF to assign and enable Qset */
  816. void nicvf_qset_config(struct nicvf *nic, bool enable)
  817. {
  818. union nic_mbx mbx = {};
  819. struct queue_set *qs = nic->qs;
  820. struct qs_cfg *qs_cfg;
  821. if (!qs) {
  822. netdev_warn(nic->netdev,
  823. "Qset is still not allocated, don't init queues\n");
  824. return;
  825. }
  826. qs->enable = enable;
  827. qs->vnic_id = nic->vf_id;
  828. /* Send a mailbox msg to PF to config Qset */
  829. mbx.qs.msg = NIC_MBOX_MSG_QS_CFG;
  830. mbx.qs.num = qs->vnic_id;
  831. mbx.qs.sqs_count = nic->sqs_count;
  832. mbx.qs.cfg = 0;
  833. qs_cfg = (struct qs_cfg *)&mbx.qs.cfg;
  834. if (qs->enable) {
  835. qs_cfg->ena = 1;
  836. #ifdef __BIG_ENDIAN
  837. qs_cfg->be = 1;
  838. #endif
  839. qs_cfg->vnic = qs->vnic_id;
  840. /* Enable Tx timestamping capability */
  841. if (nic->ptp_clock)
  842. qs_cfg->send_tstmp_ena = 1;
  843. }
  844. nicvf_send_msg_to_pf(nic, &mbx);
  845. }
  846. static void nicvf_free_resources(struct nicvf *nic)
  847. {
  848. int qidx;
  849. struct queue_set *qs = nic->qs;
  850. /* Free receive buffer descriptor ring */
  851. for (qidx = 0; qidx < qs->rbdr_cnt; qidx++)
  852. nicvf_free_rbdr(nic, &qs->rbdr[qidx]);
  853. /* Free completion queue */
  854. for (qidx = 0; qidx < qs->cq_cnt; qidx++)
  855. nicvf_free_cmp_queue(nic, &qs->cq[qidx]);
  856. /* Free send queue */
  857. for (qidx = 0; qidx < qs->sq_cnt; qidx++)
  858. nicvf_free_snd_queue(nic, &qs->sq[qidx]);
  859. }
  860. static int nicvf_alloc_resources(struct nicvf *nic)
  861. {
  862. int qidx;
  863. struct queue_set *qs = nic->qs;
  864. /* Alloc receive buffer descriptor ring */
  865. for (qidx = 0; qidx < qs->rbdr_cnt; qidx++) {
  866. if (nicvf_init_rbdr(nic, &qs->rbdr[qidx], qs->rbdr_len,
  867. DMA_BUFFER_LEN))
  868. goto alloc_fail;
  869. }
  870. /* Alloc send queue */
  871. for (qidx = 0; qidx < qs->sq_cnt; qidx++) {
  872. if (nicvf_init_snd_queue(nic, &qs->sq[qidx], qs->sq_len, qidx))
  873. goto alloc_fail;
  874. }
  875. /* Alloc completion queue */
  876. for (qidx = 0; qidx < qs->cq_cnt; qidx++) {
  877. if (nicvf_init_cmp_queue(nic, &qs->cq[qidx], qs->cq_len))
  878. goto alloc_fail;
  879. }
  880. return 0;
  881. alloc_fail:
  882. nicvf_free_resources(nic);
  883. return -ENOMEM;
  884. }
  885. int nicvf_set_qset_resources(struct nicvf *nic)
  886. {
  887. struct queue_set *qs;
  888. qs = devm_kzalloc(&nic->pdev->dev, sizeof(*qs), GFP_KERNEL);
  889. if (!qs)
  890. return -ENOMEM;
  891. nic->qs = qs;
  892. /* Set count of each queue */
  893. qs->rbdr_cnt = DEFAULT_RBDR_CNT;
  894. qs->rq_cnt = min_t(u8, MAX_RCV_QUEUES_PER_QS, num_online_cpus());
  895. qs->sq_cnt = min_t(u8, MAX_SND_QUEUES_PER_QS, num_online_cpus());
  896. qs->cq_cnt = max_t(u8, qs->rq_cnt, qs->sq_cnt);
  897. /* Set queue lengths */
  898. qs->rbdr_len = RCV_BUF_COUNT;
  899. qs->sq_len = SND_QUEUE_LEN;
  900. qs->cq_len = CMP_QUEUE_LEN;
  901. nic->rx_queues = qs->rq_cnt;
  902. nic->tx_queues = qs->sq_cnt;
  903. nic->xdp_tx_queues = 0;
  904. return 0;
  905. }
  906. int nicvf_config_data_transfer(struct nicvf *nic, bool enable)
  907. {
  908. bool disable = false;
  909. struct queue_set *qs = nic->qs;
  910. struct queue_set *pqs = nic->pnicvf->qs;
  911. int qidx;
  912. if (!qs)
  913. return 0;
  914. /* Take primary VF's queue lengths.
  915. * This is needed to take queue lengths set from ethtool
  916. * into consideration.
  917. */
  918. if (nic->sqs_mode && pqs) {
  919. qs->cq_len = pqs->cq_len;
  920. qs->sq_len = pqs->sq_len;
  921. }
  922. if (enable) {
  923. if (nicvf_alloc_resources(nic))
  924. return -ENOMEM;
  925. for (qidx = 0; qidx < qs->sq_cnt; qidx++)
  926. nicvf_snd_queue_config(nic, qs, qidx, enable);
  927. for (qidx = 0; qidx < qs->cq_cnt; qidx++)
  928. nicvf_cmp_queue_config(nic, qs, qidx, enable);
  929. for (qidx = 0; qidx < qs->rbdr_cnt; qidx++)
  930. nicvf_rbdr_config(nic, qs, qidx, enable);
  931. for (qidx = 0; qidx < qs->rq_cnt; qidx++)
  932. nicvf_rcv_queue_config(nic, qs, qidx, enable);
  933. } else {
  934. for (qidx = 0; qidx < qs->rq_cnt; qidx++)
  935. nicvf_rcv_queue_config(nic, qs, qidx, disable);
  936. for (qidx = 0; qidx < qs->rbdr_cnt; qidx++)
  937. nicvf_rbdr_config(nic, qs, qidx, disable);
  938. for (qidx = 0; qidx < qs->sq_cnt; qidx++)
  939. nicvf_snd_queue_config(nic, qs, qidx, disable);
  940. for (qidx = 0; qidx < qs->cq_cnt; qidx++)
  941. nicvf_cmp_queue_config(nic, qs, qidx, disable);
  942. nicvf_free_resources(nic);
  943. }
  944. /* Reset RXQ's stats.
  945. * SQ's stats will get reset automatically once SQ is reset.
  946. */
  947. nicvf_reset_rcv_queue_stats(nic);
  948. return 0;
  949. }
  950. /* Get a free desc from SQ
  951. * returns descriptor ponter & descriptor number
  952. */
  953. static inline int nicvf_get_sq_desc(struct snd_queue *sq, int desc_cnt)
  954. {
  955. int qentry;
  956. qentry = sq->tail;
  957. if (!sq->is_xdp)
  958. atomic_sub(desc_cnt, &sq->free_cnt);
  959. else
  960. sq->xdp_free_cnt -= desc_cnt;
  961. sq->tail += desc_cnt;
  962. sq->tail &= (sq->dmem.q_len - 1);
  963. return qentry;
  964. }
  965. /* Rollback to previous tail pointer when descriptors not used */
  966. static inline void nicvf_rollback_sq_desc(struct snd_queue *sq,
  967. int qentry, int desc_cnt)
  968. {
  969. sq->tail = qentry;
  970. atomic_add(desc_cnt, &sq->free_cnt);
  971. }
  972. /* Free descriptor back to SQ for future use */
  973. void nicvf_put_sq_desc(struct snd_queue *sq, int desc_cnt)
  974. {
  975. if (!sq->is_xdp)
  976. atomic_add(desc_cnt, &sq->free_cnt);
  977. else
  978. sq->xdp_free_cnt += desc_cnt;
  979. sq->head += desc_cnt;
  980. sq->head &= (sq->dmem.q_len - 1);
  981. }
  982. static inline int nicvf_get_nxt_sqentry(struct snd_queue *sq, int qentry)
  983. {
  984. qentry++;
  985. qentry &= (sq->dmem.q_len - 1);
  986. return qentry;
  987. }
  988. void nicvf_sq_enable(struct nicvf *nic, struct snd_queue *sq, int qidx)
  989. {
  990. u64 sq_cfg;
  991. sq_cfg = nicvf_queue_reg_read(nic, NIC_QSET_SQ_0_7_CFG, qidx);
  992. sq_cfg |= NICVF_SQ_EN;
  993. nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_CFG, qidx, sq_cfg);
  994. /* Ring doorbell so that H/W restarts processing SQEs */
  995. nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_DOOR, qidx, 0);
  996. }
  997. void nicvf_sq_disable(struct nicvf *nic, int qidx)
  998. {
  999. u64 sq_cfg;
  1000. sq_cfg = nicvf_queue_reg_read(nic, NIC_QSET_SQ_0_7_CFG, qidx);
  1001. sq_cfg &= ~NICVF_SQ_EN;
  1002. nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_CFG, qidx, sq_cfg);
  1003. }
  1004. void nicvf_sq_free_used_descs(struct net_device *netdev, struct snd_queue *sq,
  1005. int qidx)
  1006. {
  1007. u64 head, tail;
  1008. struct sk_buff *skb;
  1009. struct nicvf *nic = netdev_priv(netdev);
  1010. struct sq_hdr_subdesc *hdr;
  1011. head = nicvf_queue_reg_read(nic, NIC_QSET_SQ_0_7_HEAD, qidx) >> 4;
  1012. tail = nicvf_queue_reg_read(nic, NIC_QSET_SQ_0_7_TAIL, qidx) >> 4;
  1013. while (sq->head != head) {
  1014. hdr = (struct sq_hdr_subdesc *)GET_SQ_DESC(sq, sq->head);
  1015. if (hdr->subdesc_type != SQ_DESC_TYPE_HEADER) {
  1016. nicvf_put_sq_desc(sq, 1);
  1017. continue;
  1018. }
  1019. skb = (struct sk_buff *)sq->skbuff[sq->head];
  1020. if (skb)
  1021. dev_kfree_skb_any(skb);
  1022. atomic64_add(1, (atomic64_t *)&netdev->stats.tx_packets);
  1023. atomic64_add(hdr->tot_len,
  1024. (atomic64_t *)&netdev->stats.tx_bytes);
  1025. nicvf_put_sq_desc(sq, hdr->subdesc_cnt + 1);
  1026. }
  1027. }
  1028. /* XDP Transmit APIs */
  1029. void nicvf_xdp_sq_doorbell(struct nicvf *nic,
  1030. struct snd_queue *sq, int sq_num)
  1031. {
  1032. if (!sq->xdp_desc_cnt)
  1033. return;
  1034. /* make sure all memory stores are done before ringing doorbell */
  1035. wmb();
  1036. /* Inform HW to xmit all TSO segments */
  1037. nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_DOOR,
  1038. sq_num, sq->xdp_desc_cnt);
  1039. sq->xdp_desc_cnt = 0;
  1040. }
  1041. static inline void
  1042. nicvf_xdp_sq_add_hdr_subdesc(struct snd_queue *sq, int qentry,
  1043. int subdesc_cnt, u64 data, int len)
  1044. {
  1045. struct sq_hdr_subdesc *hdr;
  1046. hdr = (struct sq_hdr_subdesc *)GET_SQ_DESC(sq, qentry);
  1047. memset(hdr, 0, SND_QUEUE_DESC_SIZE);
  1048. hdr->subdesc_type = SQ_DESC_TYPE_HEADER;
  1049. hdr->subdesc_cnt = subdesc_cnt;
  1050. hdr->tot_len = len;
  1051. hdr->post_cqe = 1;
  1052. sq->xdp_page[qentry] = (u64)virt_to_page((void *)data);
  1053. }
  1054. int nicvf_xdp_sq_append_pkt(struct nicvf *nic, struct snd_queue *sq,
  1055. u64 bufaddr, u64 dma_addr, u16 len)
  1056. {
  1057. int subdesc_cnt = MIN_SQ_DESC_PER_PKT_XMIT;
  1058. int qentry;
  1059. if (subdesc_cnt > sq->xdp_free_cnt)
  1060. return 0;
  1061. qentry = nicvf_get_sq_desc(sq, subdesc_cnt);
  1062. nicvf_xdp_sq_add_hdr_subdesc(sq, qentry, subdesc_cnt - 1, bufaddr, len);
  1063. qentry = nicvf_get_nxt_sqentry(sq, qentry);
  1064. nicvf_sq_add_gather_subdesc(sq, qentry, len, dma_addr);
  1065. sq->xdp_desc_cnt += subdesc_cnt;
  1066. return 1;
  1067. }
  1068. /* Calculate no of SQ subdescriptors needed to transmit all
  1069. * segments of this TSO packet.
  1070. * Taken from 'Tilera network driver' with a minor modification.
  1071. */
  1072. static int nicvf_tso_count_subdescs(struct sk_buff *skb)
  1073. {
  1074. struct skb_shared_info *sh = skb_shinfo(skb);
  1075. unsigned int sh_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
  1076. unsigned int data_len = skb->len - sh_len;
  1077. unsigned int p_len = sh->gso_size;
  1078. long f_id = -1; /* id of the current fragment */
  1079. long f_size = skb_headlen(skb) - sh_len; /* current fragment size */
  1080. long f_used = 0; /* bytes used from the current fragment */
  1081. long n; /* size of the current piece of payload */
  1082. int num_edescs = 0;
  1083. int segment;
  1084. for (segment = 0; segment < sh->gso_segs; segment++) {
  1085. unsigned int p_used = 0;
  1086. /* One edesc for header and for each piece of the payload. */
  1087. for (num_edescs++; p_used < p_len; num_edescs++) {
  1088. /* Advance as needed. */
  1089. while (f_used >= f_size) {
  1090. f_id++;
  1091. f_size = skb_frag_size(&sh->frags[f_id]);
  1092. f_used = 0;
  1093. }
  1094. /* Use bytes from the current fragment. */
  1095. n = p_len - p_used;
  1096. if (n > f_size - f_used)
  1097. n = f_size - f_used;
  1098. f_used += n;
  1099. p_used += n;
  1100. }
  1101. /* The last segment may be less than gso_size. */
  1102. data_len -= p_len;
  1103. if (data_len < p_len)
  1104. p_len = data_len;
  1105. }
  1106. /* '+ gso_segs' for SQ_HDR_SUDESCs for each segment */
  1107. return num_edescs + sh->gso_segs;
  1108. }
  1109. #define POST_CQE_DESC_COUNT 2
  1110. /* Get the number of SQ descriptors needed to xmit this skb */
  1111. static int nicvf_sq_subdesc_required(struct nicvf *nic, struct sk_buff *skb)
  1112. {
  1113. int subdesc_cnt = MIN_SQ_DESC_PER_PKT_XMIT;
  1114. if (skb_shinfo(skb)->gso_size && !nic->hw_tso) {
  1115. subdesc_cnt = nicvf_tso_count_subdescs(skb);
  1116. return subdesc_cnt;
  1117. }
  1118. /* Dummy descriptors to get TSO pkt completion notification */
  1119. if (nic->t88 && nic->hw_tso && skb_shinfo(skb)->gso_size)
  1120. subdesc_cnt += POST_CQE_DESC_COUNT;
  1121. if (skb_shinfo(skb)->nr_frags)
  1122. subdesc_cnt += skb_shinfo(skb)->nr_frags;
  1123. return subdesc_cnt;
  1124. }
  1125. /* Add SQ HEADER subdescriptor.
  1126. * First subdescriptor for every send descriptor.
  1127. */
  1128. static inline void
  1129. nicvf_sq_add_hdr_subdesc(struct nicvf *nic, struct snd_queue *sq, int qentry,
  1130. int subdesc_cnt, struct sk_buff *skb, int len)
  1131. {
  1132. int proto;
  1133. struct sq_hdr_subdesc *hdr;
  1134. union {
  1135. struct iphdr *v4;
  1136. struct ipv6hdr *v6;
  1137. unsigned char *hdr;
  1138. } ip;
  1139. ip.hdr = skb_network_header(skb);
  1140. hdr = (struct sq_hdr_subdesc *)GET_SQ_DESC(sq, qentry);
  1141. memset(hdr, 0, SND_QUEUE_DESC_SIZE);
  1142. hdr->subdesc_type = SQ_DESC_TYPE_HEADER;
  1143. if (nic->t88 && nic->hw_tso && skb_shinfo(skb)->gso_size) {
  1144. /* post_cqe = 0, to avoid HW posting a CQE for every TSO
  1145. * segment transmitted on 88xx.
  1146. */
  1147. hdr->subdesc_cnt = subdesc_cnt - POST_CQE_DESC_COUNT;
  1148. } else {
  1149. sq->skbuff[qentry] = (u64)skb;
  1150. /* Enable notification via CQE after processing SQE */
  1151. hdr->post_cqe = 1;
  1152. /* No of subdescriptors following this */
  1153. hdr->subdesc_cnt = subdesc_cnt;
  1154. }
  1155. hdr->tot_len = len;
  1156. /* Offload checksum calculation to HW */
  1157. if (skb->ip_summed == CHECKSUM_PARTIAL) {
  1158. if (ip.v4->version == 4)
  1159. hdr->csum_l3 = 1; /* Enable IP csum calculation */
  1160. hdr->l3_offset = skb_network_offset(skb);
  1161. hdr->l4_offset = skb_transport_offset(skb);
  1162. proto = (ip.v4->version == 4) ? ip.v4->protocol :
  1163. ip.v6->nexthdr;
  1164. switch (proto) {
  1165. case IPPROTO_TCP:
  1166. hdr->csum_l4 = SEND_L4_CSUM_TCP;
  1167. break;
  1168. case IPPROTO_UDP:
  1169. hdr->csum_l4 = SEND_L4_CSUM_UDP;
  1170. break;
  1171. case IPPROTO_SCTP:
  1172. hdr->csum_l4 = SEND_L4_CSUM_SCTP;
  1173. break;
  1174. }
  1175. }
  1176. if (nic->hw_tso && skb_shinfo(skb)->gso_size) {
  1177. hdr->tso = 1;
  1178. hdr->tso_start = skb_transport_offset(skb) + tcp_hdrlen(skb);
  1179. hdr->tso_max_paysize = skb_shinfo(skb)->gso_size;
  1180. /* For non-tunneled pkts, point this to L2 ethertype */
  1181. hdr->inner_l3_offset = skb_network_offset(skb) - 2;
  1182. this_cpu_inc(nic->pnicvf->drv_stats->tx_tso);
  1183. }
  1184. /* Check if timestamp is requested */
  1185. if (!(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) {
  1186. skb_tx_timestamp(skb);
  1187. return;
  1188. }
  1189. /* Tx timestamping not supported along with TSO, so ignore request */
  1190. if (skb_shinfo(skb)->gso_size)
  1191. return;
  1192. /* HW supports only a single outstanding packet to timestamp */
  1193. if (!atomic_add_unless(&nic->pnicvf->tx_ptp_skbs, 1, 1))
  1194. return;
  1195. /* Mark the SKB for later reference */
  1196. skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
  1197. /* Finally enable timestamp generation
  1198. * Since 'post_cqe' is also set, two CQEs will be posted
  1199. * for this packet i.e CQE_TYPE_SEND and CQE_TYPE_SEND_PTP.
  1200. */
  1201. hdr->tstmp = 1;
  1202. }
  1203. /* SQ GATHER subdescriptor
  1204. * Must follow HDR descriptor
  1205. */
  1206. static inline void nicvf_sq_add_gather_subdesc(struct snd_queue *sq, int qentry,
  1207. int size, u64 data)
  1208. {
  1209. struct sq_gather_subdesc *gather;
  1210. qentry &= (sq->dmem.q_len - 1);
  1211. gather = (struct sq_gather_subdesc *)GET_SQ_DESC(sq, qentry);
  1212. memset(gather, 0, SND_QUEUE_DESC_SIZE);
  1213. gather->subdesc_type = SQ_DESC_TYPE_GATHER;
  1214. gather->ld_type = NIC_SEND_LD_TYPE_E_LDD;
  1215. gather->size = size;
  1216. gather->addr = data;
  1217. }
  1218. /* Add HDR + IMMEDIATE subdescriptors right after descriptors of a TSO
  1219. * packet so that a CQE is posted as a notifation for transmission of
  1220. * TSO packet.
  1221. */
  1222. static inline void nicvf_sq_add_cqe_subdesc(struct snd_queue *sq, int qentry,
  1223. int tso_sqe, struct sk_buff *skb)
  1224. {
  1225. struct sq_imm_subdesc *imm;
  1226. struct sq_hdr_subdesc *hdr;
  1227. sq->skbuff[qentry] = (u64)skb;
  1228. hdr = (struct sq_hdr_subdesc *)GET_SQ_DESC(sq, qentry);
  1229. memset(hdr, 0, SND_QUEUE_DESC_SIZE);
  1230. hdr->subdesc_type = SQ_DESC_TYPE_HEADER;
  1231. /* Enable notification via CQE after processing SQE */
  1232. hdr->post_cqe = 1;
  1233. /* There is no packet to transmit here */
  1234. hdr->dont_send = 1;
  1235. hdr->subdesc_cnt = POST_CQE_DESC_COUNT - 1;
  1236. hdr->tot_len = 1;
  1237. /* Actual TSO header SQE index, needed for cleanup */
  1238. hdr->rsvd2 = tso_sqe;
  1239. qentry = nicvf_get_nxt_sqentry(sq, qentry);
  1240. imm = (struct sq_imm_subdesc *)GET_SQ_DESC(sq, qentry);
  1241. memset(imm, 0, SND_QUEUE_DESC_SIZE);
  1242. imm->subdesc_type = SQ_DESC_TYPE_IMMEDIATE;
  1243. imm->len = 1;
  1244. }
  1245. static inline void nicvf_sq_doorbell(struct nicvf *nic, struct sk_buff *skb,
  1246. int sq_num, int desc_cnt)
  1247. {
  1248. struct netdev_queue *txq;
  1249. txq = netdev_get_tx_queue(nic->pnicvf->netdev,
  1250. skb_get_queue_mapping(skb));
  1251. netdev_tx_sent_queue(txq, skb->len);
  1252. /* make sure all memory stores are done before ringing doorbell */
  1253. smp_wmb();
  1254. /* Inform HW to xmit all TSO segments */
  1255. nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_DOOR,
  1256. sq_num, desc_cnt);
  1257. }
  1258. /* Segment a TSO packet into 'gso_size' segments and append
  1259. * them to SQ for transfer
  1260. */
  1261. static int nicvf_sq_append_tso(struct nicvf *nic, struct snd_queue *sq,
  1262. int sq_num, int qentry, struct sk_buff *skb)
  1263. {
  1264. struct tso_t tso;
  1265. int seg_subdescs = 0, desc_cnt = 0;
  1266. int seg_len, total_len, data_left;
  1267. int hdr_qentry = qentry;
  1268. int hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
  1269. tso_start(skb, &tso);
  1270. total_len = skb->len - hdr_len;
  1271. while (total_len > 0) {
  1272. char *hdr;
  1273. /* Save Qentry for adding HDR_SUBDESC at the end */
  1274. hdr_qentry = qentry;
  1275. data_left = min_t(int, skb_shinfo(skb)->gso_size, total_len);
  1276. total_len -= data_left;
  1277. /* Add segment's header */
  1278. qentry = nicvf_get_nxt_sqentry(sq, qentry);
  1279. hdr = sq->tso_hdrs + qentry * TSO_HEADER_SIZE;
  1280. tso_build_hdr(skb, hdr, &tso, data_left, total_len == 0);
  1281. nicvf_sq_add_gather_subdesc(sq, qentry, hdr_len,
  1282. sq->tso_hdrs_phys +
  1283. qentry * TSO_HEADER_SIZE);
  1284. /* HDR_SUDESC + GATHER */
  1285. seg_subdescs = 2;
  1286. seg_len = hdr_len;
  1287. /* Add segment's payload fragments */
  1288. while (data_left > 0) {
  1289. int size;
  1290. size = min_t(int, tso.size, data_left);
  1291. qentry = nicvf_get_nxt_sqentry(sq, qentry);
  1292. nicvf_sq_add_gather_subdesc(sq, qentry, size,
  1293. virt_to_phys(tso.data));
  1294. seg_subdescs++;
  1295. seg_len += size;
  1296. data_left -= size;
  1297. tso_build_data(skb, &tso, size);
  1298. }
  1299. nicvf_sq_add_hdr_subdesc(nic, sq, hdr_qentry,
  1300. seg_subdescs - 1, skb, seg_len);
  1301. sq->skbuff[hdr_qentry] = (u64)NULL;
  1302. qentry = nicvf_get_nxt_sqentry(sq, qentry);
  1303. desc_cnt += seg_subdescs;
  1304. }
  1305. /* Save SKB in the last segment for freeing */
  1306. sq->skbuff[hdr_qentry] = (u64)skb;
  1307. nicvf_sq_doorbell(nic, skb, sq_num, desc_cnt);
  1308. this_cpu_inc(nic->pnicvf->drv_stats->tx_tso);
  1309. return 1;
  1310. }
  1311. /* Append an skb to a SQ for packet transfer. */
  1312. int nicvf_sq_append_skb(struct nicvf *nic, struct snd_queue *sq,
  1313. struct sk_buff *skb, u8 sq_num)
  1314. {
  1315. int i, size;
  1316. int subdesc_cnt, hdr_sqe = 0;
  1317. int qentry;
  1318. u64 dma_addr;
  1319. subdesc_cnt = nicvf_sq_subdesc_required(nic, skb);
  1320. if (subdesc_cnt > atomic_read(&sq->free_cnt))
  1321. goto append_fail;
  1322. qentry = nicvf_get_sq_desc(sq, subdesc_cnt);
  1323. /* Check if its a TSO packet */
  1324. if (skb_shinfo(skb)->gso_size && !nic->hw_tso)
  1325. return nicvf_sq_append_tso(nic, sq, sq_num, qentry, skb);
  1326. /* Add SQ header subdesc */
  1327. nicvf_sq_add_hdr_subdesc(nic, sq, qentry, subdesc_cnt - 1,
  1328. skb, skb->len);
  1329. hdr_sqe = qentry;
  1330. /* Add SQ gather subdescs */
  1331. qentry = nicvf_get_nxt_sqentry(sq, qentry);
  1332. size = skb_is_nonlinear(skb) ? skb_headlen(skb) : skb->len;
  1333. /* HW will ensure data coherency, CPU sync not required */
  1334. dma_addr = dma_map_page_attrs(&nic->pdev->dev, virt_to_page(skb->data),
  1335. offset_in_page(skb->data), size,
  1336. DMA_TO_DEVICE, DMA_ATTR_SKIP_CPU_SYNC);
  1337. if (dma_mapping_error(&nic->pdev->dev, dma_addr)) {
  1338. nicvf_rollback_sq_desc(sq, qentry, subdesc_cnt);
  1339. return 0;
  1340. }
  1341. nicvf_sq_add_gather_subdesc(sq, qentry, size, dma_addr);
  1342. /* Check for scattered buffer */
  1343. if (!skb_is_nonlinear(skb))
  1344. goto doorbell;
  1345. for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
  1346. const struct skb_frag_struct *frag;
  1347. frag = &skb_shinfo(skb)->frags[i];
  1348. qentry = nicvf_get_nxt_sqentry(sq, qentry);
  1349. size = skb_frag_size(frag);
  1350. dma_addr = dma_map_page_attrs(&nic->pdev->dev,
  1351. skb_frag_page(frag),
  1352. frag->page_offset, size,
  1353. DMA_TO_DEVICE,
  1354. DMA_ATTR_SKIP_CPU_SYNC);
  1355. if (dma_mapping_error(&nic->pdev->dev, dma_addr)) {
  1356. /* Free entire chain of mapped buffers
  1357. * here 'i' = frags mapped + above mapped skb->data
  1358. */
  1359. nicvf_unmap_sndq_buffers(nic, sq, hdr_sqe, i);
  1360. nicvf_rollback_sq_desc(sq, qentry, subdesc_cnt);
  1361. return 0;
  1362. }
  1363. nicvf_sq_add_gather_subdesc(sq, qentry, size, dma_addr);
  1364. }
  1365. doorbell:
  1366. if (nic->t88 && skb_shinfo(skb)->gso_size) {
  1367. qentry = nicvf_get_nxt_sqentry(sq, qentry);
  1368. nicvf_sq_add_cqe_subdesc(sq, qentry, hdr_sqe, skb);
  1369. }
  1370. nicvf_sq_doorbell(nic, skb, sq_num, subdesc_cnt);
  1371. return 1;
  1372. append_fail:
  1373. /* Use original PCI dev for debug log */
  1374. nic = nic->pnicvf;
  1375. netdev_dbg(nic->netdev, "Not enough SQ descriptors to xmit pkt\n");
  1376. return 0;
  1377. }
  1378. static inline unsigned frag_num(unsigned i)
  1379. {
  1380. #ifdef __BIG_ENDIAN
  1381. return (i & ~3) + 3 - (i & 3);
  1382. #else
  1383. return i;
  1384. #endif
  1385. }
  1386. static void nicvf_unmap_rcv_buffer(struct nicvf *nic, u64 dma_addr,
  1387. u64 buf_addr, bool xdp)
  1388. {
  1389. struct page *page = NULL;
  1390. int len = RCV_FRAG_LEN;
  1391. if (xdp) {
  1392. page = virt_to_page(phys_to_virt(buf_addr));
  1393. /* Check if it's a recycled page, if not
  1394. * unmap the DMA mapping.
  1395. *
  1396. * Recycled page holds an extra reference.
  1397. */
  1398. if (page_ref_count(page) != 1)
  1399. return;
  1400. len += XDP_PACKET_HEADROOM;
  1401. /* Receive buffers in XDP mode are mapped from page start */
  1402. dma_addr &= PAGE_MASK;
  1403. }
  1404. dma_unmap_page_attrs(&nic->pdev->dev, dma_addr, len,
  1405. DMA_FROM_DEVICE, DMA_ATTR_SKIP_CPU_SYNC);
  1406. }
  1407. /* Returns SKB for a received packet */
  1408. struct sk_buff *nicvf_get_rcv_skb(struct nicvf *nic,
  1409. struct cqe_rx_t *cqe_rx, bool xdp)
  1410. {
  1411. int frag;
  1412. int payload_len = 0;
  1413. struct sk_buff *skb = NULL;
  1414. struct page *page;
  1415. int offset;
  1416. u16 *rb_lens = NULL;
  1417. u64 *rb_ptrs = NULL;
  1418. u64 phys_addr;
  1419. rb_lens = (void *)cqe_rx + (3 * sizeof(u64));
  1420. /* Except 88xx pass1 on all other chips CQE_RX2_S is added to
  1421. * CQE_RX at word6, hence buffer pointers move by word
  1422. *
  1423. * Use existing 'hw_tso' flag which will be set for all chips
  1424. * except 88xx pass1 instead of a additional cache line
  1425. * access (or miss) by using pci dev's revision.
  1426. */
  1427. if (!nic->hw_tso)
  1428. rb_ptrs = (void *)cqe_rx + (6 * sizeof(u64));
  1429. else
  1430. rb_ptrs = (void *)cqe_rx + (7 * sizeof(u64));
  1431. for (frag = 0; frag < cqe_rx->rb_cnt; frag++) {
  1432. payload_len = rb_lens[frag_num(frag)];
  1433. phys_addr = nicvf_iova_to_phys(nic, *rb_ptrs);
  1434. if (!phys_addr) {
  1435. if (skb)
  1436. dev_kfree_skb_any(skb);
  1437. return NULL;
  1438. }
  1439. if (!frag) {
  1440. /* First fragment */
  1441. nicvf_unmap_rcv_buffer(nic,
  1442. *rb_ptrs - cqe_rx->align_pad,
  1443. phys_addr, xdp);
  1444. skb = nicvf_rb_ptr_to_skb(nic,
  1445. phys_addr - cqe_rx->align_pad,
  1446. payload_len);
  1447. if (!skb)
  1448. return NULL;
  1449. skb_reserve(skb, cqe_rx->align_pad);
  1450. skb_put(skb, payload_len);
  1451. } else {
  1452. /* Add fragments */
  1453. nicvf_unmap_rcv_buffer(nic, *rb_ptrs, phys_addr, xdp);
  1454. page = virt_to_page(phys_to_virt(phys_addr));
  1455. offset = phys_to_virt(phys_addr) - page_address(page);
  1456. skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, page,
  1457. offset, payload_len, RCV_FRAG_LEN);
  1458. }
  1459. /* Next buffer pointer */
  1460. rb_ptrs++;
  1461. }
  1462. return skb;
  1463. }
  1464. static u64 nicvf_int_type_to_mask(int int_type, int q_idx)
  1465. {
  1466. u64 reg_val;
  1467. switch (int_type) {
  1468. case NICVF_INTR_CQ:
  1469. reg_val = ((1ULL << q_idx) << NICVF_INTR_CQ_SHIFT);
  1470. break;
  1471. case NICVF_INTR_SQ:
  1472. reg_val = ((1ULL << q_idx) << NICVF_INTR_SQ_SHIFT);
  1473. break;
  1474. case NICVF_INTR_RBDR:
  1475. reg_val = ((1ULL << q_idx) << NICVF_INTR_RBDR_SHIFT);
  1476. break;
  1477. case NICVF_INTR_PKT_DROP:
  1478. reg_val = (1ULL << NICVF_INTR_PKT_DROP_SHIFT);
  1479. break;
  1480. case NICVF_INTR_TCP_TIMER:
  1481. reg_val = (1ULL << NICVF_INTR_TCP_TIMER_SHIFT);
  1482. break;
  1483. case NICVF_INTR_MBOX:
  1484. reg_val = (1ULL << NICVF_INTR_MBOX_SHIFT);
  1485. break;
  1486. case NICVF_INTR_QS_ERR:
  1487. reg_val = (1ULL << NICVF_INTR_QS_ERR_SHIFT);
  1488. break;
  1489. default:
  1490. reg_val = 0;
  1491. }
  1492. return reg_val;
  1493. }
  1494. /* Enable interrupt */
  1495. void nicvf_enable_intr(struct nicvf *nic, int int_type, int q_idx)
  1496. {
  1497. u64 mask = nicvf_int_type_to_mask(int_type, q_idx);
  1498. if (!mask) {
  1499. netdev_dbg(nic->netdev,
  1500. "Failed to enable interrupt: unknown type\n");
  1501. return;
  1502. }
  1503. nicvf_reg_write(nic, NIC_VF_ENA_W1S,
  1504. nicvf_reg_read(nic, NIC_VF_ENA_W1S) | mask);
  1505. }
  1506. /* Disable interrupt */
  1507. void nicvf_disable_intr(struct nicvf *nic, int int_type, int q_idx)
  1508. {
  1509. u64 mask = nicvf_int_type_to_mask(int_type, q_idx);
  1510. if (!mask) {
  1511. netdev_dbg(nic->netdev,
  1512. "Failed to disable interrupt: unknown type\n");
  1513. return;
  1514. }
  1515. nicvf_reg_write(nic, NIC_VF_ENA_W1C, mask);
  1516. }
  1517. /* Clear interrupt */
  1518. void nicvf_clear_intr(struct nicvf *nic, int int_type, int q_idx)
  1519. {
  1520. u64 mask = nicvf_int_type_to_mask(int_type, q_idx);
  1521. if (!mask) {
  1522. netdev_dbg(nic->netdev,
  1523. "Failed to clear interrupt: unknown type\n");
  1524. return;
  1525. }
  1526. nicvf_reg_write(nic, NIC_VF_INT, mask);
  1527. }
  1528. /* Check if interrupt is enabled */
  1529. int nicvf_is_intr_enabled(struct nicvf *nic, int int_type, int q_idx)
  1530. {
  1531. u64 mask = nicvf_int_type_to_mask(int_type, q_idx);
  1532. /* If interrupt type is unknown, we treat it disabled. */
  1533. if (!mask) {
  1534. netdev_dbg(nic->netdev,
  1535. "Failed to check interrupt enable: unknown type\n");
  1536. return 0;
  1537. }
  1538. return mask & nicvf_reg_read(nic, NIC_VF_ENA_W1S);
  1539. }
  1540. void nicvf_update_rq_stats(struct nicvf *nic, int rq_idx)
  1541. {
  1542. struct rcv_queue *rq;
  1543. #define GET_RQ_STATS(reg) \
  1544. nicvf_reg_read(nic, NIC_QSET_RQ_0_7_STAT_0_1 |\
  1545. (rq_idx << NIC_Q_NUM_SHIFT) | (reg << 3))
  1546. rq = &nic->qs->rq[rq_idx];
  1547. rq->stats.bytes = GET_RQ_STATS(RQ_SQ_STATS_OCTS);
  1548. rq->stats.pkts = GET_RQ_STATS(RQ_SQ_STATS_PKTS);
  1549. }
  1550. void nicvf_update_sq_stats(struct nicvf *nic, int sq_idx)
  1551. {
  1552. struct snd_queue *sq;
  1553. #define GET_SQ_STATS(reg) \
  1554. nicvf_reg_read(nic, NIC_QSET_SQ_0_7_STAT_0_1 |\
  1555. (sq_idx << NIC_Q_NUM_SHIFT) | (reg << 3))
  1556. sq = &nic->qs->sq[sq_idx];
  1557. sq->stats.bytes = GET_SQ_STATS(RQ_SQ_STATS_OCTS);
  1558. sq->stats.pkts = GET_SQ_STATS(RQ_SQ_STATS_PKTS);
  1559. }
  1560. /* Check for errors in the receive cmp.queue entry */
  1561. int nicvf_check_cqe_rx_errs(struct nicvf *nic, struct cqe_rx_t *cqe_rx)
  1562. {
  1563. netif_err(nic, rx_err, nic->netdev,
  1564. "RX error CQE err_level 0x%x err_opcode 0x%x\n",
  1565. cqe_rx->err_level, cqe_rx->err_opcode);
  1566. switch (cqe_rx->err_opcode) {
  1567. case CQ_RX_ERROP_RE_PARTIAL:
  1568. this_cpu_inc(nic->drv_stats->rx_bgx_truncated_pkts);
  1569. break;
  1570. case CQ_RX_ERROP_RE_JABBER:
  1571. this_cpu_inc(nic->drv_stats->rx_jabber_errs);
  1572. break;
  1573. case CQ_RX_ERROP_RE_FCS:
  1574. this_cpu_inc(nic->drv_stats->rx_fcs_errs);
  1575. break;
  1576. case CQ_RX_ERROP_RE_RX_CTL:
  1577. this_cpu_inc(nic->drv_stats->rx_bgx_errs);
  1578. break;
  1579. case CQ_RX_ERROP_PREL2_ERR:
  1580. this_cpu_inc(nic->drv_stats->rx_prel2_errs);
  1581. break;
  1582. case CQ_RX_ERROP_L2_MAL:
  1583. this_cpu_inc(nic->drv_stats->rx_l2_hdr_malformed);
  1584. break;
  1585. case CQ_RX_ERROP_L2_OVERSIZE:
  1586. this_cpu_inc(nic->drv_stats->rx_oversize);
  1587. break;
  1588. case CQ_RX_ERROP_L2_UNDERSIZE:
  1589. this_cpu_inc(nic->drv_stats->rx_undersize);
  1590. break;
  1591. case CQ_RX_ERROP_L2_LENMISM:
  1592. this_cpu_inc(nic->drv_stats->rx_l2_len_mismatch);
  1593. break;
  1594. case CQ_RX_ERROP_L2_PCLP:
  1595. this_cpu_inc(nic->drv_stats->rx_l2_pclp);
  1596. break;
  1597. case CQ_RX_ERROP_IP_NOT:
  1598. this_cpu_inc(nic->drv_stats->rx_ip_ver_errs);
  1599. break;
  1600. case CQ_RX_ERROP_IP_CSUM_ERR:
  1601. this_cpu_inc(nic->drv_stats->rx_ip_csum_errs);
  1602. break;
  1603. case CQ_RX_ERROP_IP_MAL:
  1604. this_cpu_inc(nic->drv_stats->rx_ip_hdr_malformed);
  1605. break;
  1606. case CQ_RX_ERROP_IP_MALD:
  1607. this_cpu_inc(nic->drv_stats->rx_ip_payload_malformed);
  1608. break;
  1609. case CQ_RX_ERROP_IP_HOP:
  1610. this_cpu_inc(nic->drv_stats->rx_ip_ttl_errs);
  1611. break;
  1612. case CQ_RX_ERROP_L3_PCLP:
  1613. this_cpu_inc(nic->drv_stats->rx_l3_pclp);
  1614. break;
  1615. case CQ_RX_ERROP_L4_MAL:
  1616. this_cpu_inc(nic->drv_stats->rx_l4_malformed);
  1617. break;
  1618. case CQ_RX_ERROP_L4_CHK:
  1619. this_cpu_inc(nic->drv_stats->rx_l4_csum_errs);
  1620. break;
  1621. case CQ_RX_ERROP_UDP_LEN:
  1622. this_cpu_inc(nic->drv_stats->rx_udp_len_errs);
  1623. break;
  1624. case CQ_RX_ERROP_L4_PORT:
  1625. this_cpu_inc(nic->drv_stats->rx_l4_port_errs);
  1626. break;
  1627. case CQ_RX_ERROP_TCP_FLAG:
  1628. this_cpu_inc(nic->drv_stats->rx_tcp_flag_errs);
  1629. break;
  1630. case CQ_RX_ERROP_TCP_OFFSET:
  1631. this_cpu_inc(nic->drv_stats->rx_tcp_offset_errs);
  1632. break;
  1633. case CQ_RX_ERROP_L4_PCLP:
  1634. this_cpu_inc(nic->drv_stats->rx_l4_pclp);
  1635. break;
  1636. case CQ_RX_ERROP_RBDR_TRUNC:
  1637. this_cpu_inc(nic->drv_stats->rx_truncated_pkts);
  1638. break;
  1639. }
  1640. return 1;
  1641. }
  1642. /* Check for errors in the send cmp.queue entry */
  1643. int nicvf_check_cqe_tx_errs(struct nicvf *nic, struct cqe_send_t *cqe_tx)
  1644. {
  1645. switch (cqe_tx->send_status) {
  1646. case CQ_TX_ERROP_DESC_FAULT:
  1647. this_cpu_inc(nic->drv_stats->tx_desc_fault);
  1648. break;
  1649. case CQ_TX_ERROP_HDR_CONS_ERR:
  1650. this_cpu_inc(nic->drv_stats->tx_hdr_cons_err);
  1651. break;
  1652. case CQ_TX_ERROP_SUBDC_ERR:
  1653. this_cpu_inc(nic->drv_stats->tx_subdesc_err);
  1654. break;
  1655. case CQ_TX_ERROP_MAX_SIZE_VIOL:
  1656. this_cpu_inc(nic->drv_stats->tx_max_size_exceeded);
  1657. break;
  1658. case CQ_TX_ERROP_IMM_SIZE_OFLOW:
  1659. this_cpu_inc(nic->drv_stats->tx_imm_size_oflow);
  1660. break;
  1661. case CQ_TX_ERROP_DATA_SEQUENCE_ERR:
  1662. this_cpu_inc(nic->drv_stats->tx_data_seq_err);
  1663. break;
  1664. case CQ_TX_ERROP_MEM_SEQUENCE_ERR:
  1665. this_cpu_inc(nic->drv_stats->tx_mem_seq_err);
  1666. break;
  1667. case CQ_TX_ERROP_LOCK_VIOL:
  1668. this_cpu_inc(nic->drv_stats->tx_lock_viol);
  1669. break;
  1670. case CQ_TX_ERROP_DATA_FAULT:
  1671. this_cpu_inc(nic->drv_stats->tx_data_fault);
  1672. break;
  1673. case CQ_TX_ERROP_TSTMP_CONFLICT:
  1674. this_cpu_inc(nic->drv_stats->tx_tstmp_conflict);
  1675. break;
  1676. case CQ_TX_ERROP_TSTMP_TIMEOUT:
  1677. this_cpu_inc(nic->drv_stats->tx_tstmp_timeout);
  1678. break;
  1679. case CQ_TX_ERROP_MEM_FAULT:
  1680. this_cpu_inc(nic->drv_stats->tx_mem_fault);
  1681. break;
  1682. case CQ_TX_ERROP_CK_OVERLAP:
  1683. this_cpu_inc(nic->drv_stats->tx_csum_overlap);
  1684. break;
  1685. case CQ_TX_ERROP_CK_OFLOW:
  1686. this_cpu_inc(nic->drv_stats->tx_csum_overflow);
  1687. break;
  1688. }
  1689. return 1;
  1690. }