hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/infiniband/hw/hfi1/sdma.h
....@@ -1,7 +1,7 @@
11 #ifndef _HFI1_SDMA_H
22 #define _HFI1_SDMA_H
33 /*
4
- * Copyright(c) 2015, 2016 Intel Corporation.
4
+ * Copyright(c) 2015 - 2018 Intel Corporation.
55 *
66 * This file is provided under a dual BSD/GPLv2 license. When using or
77 * redistributing this file, you may do so under either license.
....@@ -61,16 +61,6 @@
6161 #define MAX_DESC 64
6262 /* Hardware limit for SDMA packet size */
6363 #define MAX_SDMA_PKT_SIZE ((16 * 1024) - 1)
64
-
65
-#define SDMA_TXREQ_S_OK 0
66
-#define SDMA_TXREQ_S_SENDERROR 1
67
-#define SDMA_TXREQ_S_ABORTED 2
68
-#define SDMA_TXREQ_S_SHUTDOWN 3
69
-
70
-/* flags bits */
71
-#define SDMA_TXREQ_F_URGENT 0x0001
72
-#define SDMA_TXREQ_F_AHG_COPY 0x0002
73
-#define SDMA_TXREQ_F_USE_AHG 0x0004
7464
7565 #define SDMA_MAP_NONE 0
7666 #define SDMA_MAP_SINGLE 1
....@@ -392,6 +382,7 @@
392382 u64 progress_int_cnt;
393383
394384 /* private: */
385
+ seqlock_t waitlock;
395386 struct list_head dmawait;
396387
397388 /* CONFIG SDMA for now, just blindly duplicate */
....@@ -415,6 +406,7 @@
415406 struct list_head flushlist;
416407 struct cpumask cpu_mask;
417408 struct kobject kobj;
409
+ u32 msix_intr;
418410 };
419411
420412 int sdma_init(struct hfi1_devdata *dd, u8 port);
....@@ -644,7 +636,10 @@
644636 struct sdma_txreq *tx,
645637 int type,
646638 dma_addr_t addr,
647
- size_t len)
639
+ size_t len,
640
+ void *pinning_ctx,
641
+ void (*ctx_get)(void *),
642
+ void (*ctx_put)(void *))
648643 {
649644 struct sdma_desc *desc = &tx->descp[tx->num_desc];
650645
....@@ -661,6 +656,11 @@
661656 << SDMA_DESC0_PHY_ADDR_SHIFT) |
662657 (((u64)len & SDMA_DESC0_BYTE_COUNT_MASK)
663658 << SDMA_DESC0_BYTE_COUNT_SHIFT);
659
+
660
+ desc->pinning_ctx = pinning_ctx;
661
+ desc->ctx_put = ctx_put;
662
+ if (pinning_ctx && ctx_get)
663
+ ctx_get(pinning_ctx);
664664 }
665665
666666 /* helper to extend txreq */
....@@ -680,14 +680,13 @@
680680 static inline void _sdma_close_tx(struct hfi1_devdata *dd,
681681 struct sdma_txreq *tx)
682682 {
683
- tx->descp[tx->num_desc].qw[0] |=
684
- SDMA_DESC0_LAST_DESC_FLAG;
685
- tx->descp[tx->num_desc].qw[1] |=
686
- dd->default_desc1;
683
+ u16 last_desc = tx->num_desc - 1;
684
+
685
+ tx->descp[last_desc].qw[0] |= SDMA_DESC0_LAST_DESC_FLAG;
686
+ tx->descp[last_desc].qw[1] |= dd->default_desc1;
687687 if (tx->flags & SDMA_TXREQ_F_URGENT)
688
- tx->descp[tx->num_desc].qw[1] |=
689
- (SDMA_DESC1_HEAD_TO_HOST_FLAG |
690
- SDMA_DESC1_INT_REQ_FLAG);
688
+ tx->descp[last_desc].qw[1] |= (SDMA_DESC1_HEAD_TO_HOST_FLAG |
689
+ SDMA_DESC1_INT_REQ_FLAG);
691690 }
692691
693692 static inline int _sdma_txadd_daddr(
....@@ -695,15 +694,20 @@
695694 int type,
696695 struct sdma_txreq *tx,
697696 dma_addr_t addr,
698
- u16 len)
697
+ u16 len,
698
+ void *pinning_ctx,
699
+ void (*ctx_get)(void *),
700
+ void (*ctx_put)(void *))
699701 {
700702 int rval = 0;
701703
702704 make_tx_sdma_desc(
703705 tx,
704706 type,
705
- addr, len);
707
+ addr, len,
708
+ pinning_ctx, ctx_get, ctx_put);
706709 WARN_ON(len > tx->tlen);
710
+ tx->num_desc++;
707711 tx->tlen -= len;
708712 /* special cases for last */
709713 if (!tx->tlen) {
....@@ -715,7 +719,6 @@
715719 _sdma_close_tx(dd, tx);
716720 }
717721 }
718
- tx->num_desc++;
719722 return rval;
720723 }
721724
....@@ -726,6 +729,14 @@
726729 * @page: page to map
727730 * @offset: offset within the page
728731 * @len: length in bytes
732
+ * @pinning_ctx: context to be stored on struct sdma_desc .pinning_ctx. Not
733
+ * added if coalesce buffer is used. E.g. pointer to pinned-page
734
+ * cache entry for the sdma_desc.
735
+ * @ctx_get: optional function to take reference to @pinning_ctx. Not called if
736
+ * @pinning_ctx is NULL.
737
+ * @ctx_put: optional function to release reference to @pinning_ctx after
738
+ * sdma_desc completes. May be called in interrupt context so must
739
+ * not sleep. Not called if @pinning_ctx is NULL.
729740 *
730741 * This is used to add a page/offset/length descriptor.
731742 *
....@@ -740,7 +751,10 @@
740751 struct sdma_txreq *tx,
741752 struct page *page,
742753 unsigned long offset,
743
- u16 len)
754
+ u16 len,
755
+ void *pinning_ctx,
756
+ void (*ctx_get)(void *),
757
+ void (*ctx_put)(void *))
744758 {
745759 dma_addr_t addr;
746760 int rval;
....@@ -764,8 +778,8 @@
764778 return -ENOSPC;
765779 }
766780
767
- return _sdma_txadd_daddr(
768
- dd, SDMA_MAP_PAGE, tx, addr, len);
781
+ return _sdma_txadd_daddr(dd, SDMA_MAP_PAGE, tx, addr, len,
782
+ pinning_ctx, ctx_get, ctx_put);
769783 }
770784
771785 /**
....@@ -799,7 +813,8 @@
799813 return rval;
800814 }
801815
802
- return _sdma_txadd_daddr(dd, SDMA_MAP_NONE, tx, addr, len);
816
+ return _sdma_txadd_daddr(dd, SDMA_MAP_NONE, tx, addr, len,
817
+ NULL, NULL, NULL);
803818 }
804819
805820 /**
....@@ -845,20 +860,20 @@
845860 return -ENOSPC;
846861 }
847862
848
- return _sdma_txadd_daddr(
849
- dd, SDMA_MAP_SINGLE, tx, addr, len);
863
+ return _sdma_txadd_daddr(dd, SDMA_MAP_SINGLE, tx, addr, len,
864
+ NULL, NULL, NULL);
850865 }
851866
852
-struct iowait;
867
+struct iowait_work;
853868
854869 int sdma_send_txreq(struct sdma_engine *sde,
855
- struct iowait *wait,
870
+ struct iowait_work *wait,
856871 struct sdma_txreq *tx,
857872 bool pkts_sent);
858873 int sdma_send_txlist(struct sdma_engine *sde,
859
- struct iowait *wait,
874
+ struct iowait_work *wait,
860875 struct list_head *tx_list,
861
- u32 *count);
876
+ u16 *count_out);
862877
863878 int sdma_ahg_alloc(struct sdma_engine *sde);
864879 void sdma_ahg_free(struct sdma_engine *sde, int ahg_index);
....@@ -1010,7 +1025,7 @@
10101025 */
10111026 struct sdma_map_elem {
10121027 u32 mask;
1013
- struct sdma_engine *sde[0];
1028
+ struct sdma_engine *sde[];
10141029 };
10151030
10161031 /**
....@@ -1032,7 +1047,7 @@
10321047 u32 mask;
10331048 u8 actual_vls;
10341049 u8 vls;
1035
- struct sdma_map_elem *map[0];
1050
+ struct sdma_map_elem *map[];
10361051 };
10371052
10381053 int sdma_map_init(
....@@ -1097,5 +1112,4 @@
10971112 extern uint mod_num_sdma;
10981113
10991114 void sdma_update_lmc(struct hfi1_devdata *dd, u64 mask, u32 lid);
1100
-
11011115 #endif