1 | /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ |
2 | /* |
3 | * Copyright(c) 2016 Intel Corporation. |
4 | */ |
5 | |
6 | #ifndef HFI1_SDMA_TXREQ_H |
7 | #define HFI1_SDMA_TXREQ_H |
8 | |
9 | /* increased for AHG */ |
10 | #define NUM_DESC 6 |
11 | |
12 | /* |
13 | * struct sdma_desc - canonical fragment descriptor |
14 | * |
15 | * This is the descriptor carried in the tx request |
16 | * corresponding to each fragment. |
17 | * |
18 | */ |
19 | struct sdma_desc { |
20 | /* private: don't use directly */ |
21 | u64 qw[2]; |
22 | void *pinning_ctx; |
23 | /* Release reference to @pinning_ctx. May be called in interrupt context. Must not sleep. */ |
24 | void (*ctx_put)(void *ctx); |
25 | }; |
26 | |
27 | /** |
28 | * struct sdma_txreq - the sdma_txreq structure (one per packet) |
29 | * @list: for use by user and by queuing for wait |
30 | * |
31 | * This is the representation of a packet which consists of some |
32 | * number of fragments. Storage is provided to within the structure. |
33 | * for all fragments. |
34 | * |
35 | * The storage for the descriptors are automatically extended as needed |
36 | * when the currently allocation is exceeded. |
37 | * |
38 | * The user (Verbs or PSM) may overload this structure with fields |
39 | * specific to their use by putting this struct first in their struct. |
40 | * The method of allocation of the overloaded structure is user dependent |
41 | * |
42 | * The list is the only public field in the structure. |
43 | * |
44 | */ |
45 | |
46 | #define SDMA_TXREQ_S_OK 0 |
47 | #define SDMA_TXREQ_S_SENDERROR 1 |
48 | #define SDMA_TXREQ_S_ABORTED 2 |
49 | #define SDMA_TXREQ_S_SHUTDOWN 3 |
50 | |
51 | /* flags bits */ |
52 | #define SDMA_TXREQ_F_URGENT 0x0001 |
53 | #define SDMA_TXREQ_F_AHG_COPY 0x0002 |
54 | #define SDMA_TXREQ_F_USE_AHG 0x0004 |
55 | #define SDMA_TXREQ_F_VIP 0x0010 |
56 | |
57 | struct sdma_txreq; |
58 | typedef void (*callback_t)(struct sdma_txreq *, int); |
59 | |
60 | struct iowait; |
61 | struct sdma_txreq { |
62 | struct list_head list; |
63 | /* private: */ |
64 | struct sdma_desc *descp; |
65 | /* private: */ |
66 | void *coalesce_buf; |
67 | /* private: */ |
68 | struct iowait *wait; |
69 | /* private: */ |
70 | callback_t complete; |
71 | #ifdef CONFIG_HFI1_DEBUG_SDMA_ORDER |
72 | u64 sn; |
73 | #endif |
74 | /* private: - used in coalesce/pad processing */ |
75 | u16 packet_len; |
76 | /* private: - down-counted to trigger last */ |
77 | u16 tlen; |
78 | /* private: */ |
79 | u16 num_desc; |
80 | /* private: */ |
81 | u16 desc_limit; |
82 | /* private: */ |
83 | u16 next_descq_idx; |
84 | /* private: */ |
85 | u16 coalesce_idx; |
86 | /* private: flags */ |
87 | u16 flags; |
88 | /* private: */ |
89 | struct sdma_desc descs[NUM_DESC]; |
90 | }; |
91 | |
92 | static inline int sdma_txreq_built(struct sdma_txreq *tx) |
93 | { |
94 | return tx->num_desc; |
95 | } |
96 | |
97 | #endif /* HFI1_SDMA_TXREQ_H */ |
98 | |