nicvf_queues.c 51 KB

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