162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright(c) 2016 Intel Corporation.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef HFI1_SDMA_TXREQ_H
762306a36Sopenharmony_ci#define HFI1_SDMA_TXREQ_H
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci/* increased for AHG */
1062306a36Sopenharmony_ci#define NUM_DESC 6
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci/*
1362306a36Sopenharmony_ci * struct sdma_desc - canonical fragment descriptor
1462306a36Sopenharmony_ci *
1562306a36Sopenharmony_ci * This is the descriptor carried in the tx request
1662306a36Sopenharmony_ci * corresponding to each fragment.
1762306a36Sopenharmony_ci *
1862306a36Sopenharmony_ci */
1962306a36Sopenharmony_cistruct sdma_desc {
2062306a36Sopenharmony_ci	/* private:  don't use directly */
2162306a36Sopenharmony_ci	u64 qw[2];
2262306a36Sopenharmony_ci	void *pinning_ctx;
2362306a36Sopenharmony_ci	/* Release reference to @pinning_ctx. May be called in interrupt context. Must not sleep. */
2462306a36Sopenharmony_ci	void (*ctx_put)(void *ctx);
2562306a36Sopenharmony_ci};
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci/**
2862306a36Sopenharmony_ci * struct sdma_txreq - the sdma_txreq structure (one per packet)
2962306a36Sopenharmony_ci * @list: for use by user and by queuing for wait
3062306a36Sopenharmony_ci *
3162306a36Sopenharmony_ci * This is the representation of a packet which consists of some
3262306a36Sopenharmony_ci * number of fragments.   Storage is provided to within the structure.
3362306a36Sopenharmony_ci * for all fragments.
3462306a36Sopenharmony_ci *
3562306a36Sopenharmony_ci * The storage for the descriptors are automatically extended as needed
3662306a36Sopenharmony_ci * when the currently allocation is exceeded.
3762306a36Sopenharmony_ci *
3862306a36Sopenharmony_ci * The user (Verbs or PSM) may overload this structure with fields
3962306a36Sopenharmony_ci * specific to their use by putting this struct first in their struct.
4062306a36Sopenharmony_ci * The method of allocation of the overloaded structure is user dependent
4162306a36Sopenharmony_ci *
4262306a36Sopenharmony_ci * The list is the only public field in the structure.
4362306a36Sopenharmony_ci *
4462306a36Sopenharmony_ci */
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci#define SDMA_TXREQ_S_OK        0
4762306a36Sopenharmony_ci#define SDMA_TXREQ_S_SENDERROR 1
4862306a36Sopenharmony_ci#define SDMA_TXREQ_S_ABORTED   2
4962306a36Sopenharmony_ci#define SDMA_TXREQ_S_SHUTDOWN  3
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci/* flags bits */
5262306a36Sopenharmony_ci#define SDMA_TXREQ_F_URGENT       0x0001
5362306a36Sopenharmony_ci#define SDMA_TXREQ_F_AHG_COPY     0x0002
5462306a36Sopenharmony_ci#define SDMA_TXREQ_F_USE_AHG      0x0004
5562306a36Sopenharmony_ci#define SDMA_TXREQ_F_VIP          0x0010
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_cistruct sdma_txreq;
5862306a36Sopenharmony_citypedef void (*callback_t)(struct sdma_txreq *, int);
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cistruct iowait;
6162306a36Sopenharmony_cistruct sdma_txreq {
6262306a36Sopenharmony_ci	struct list_head list;
6362306a36Sopenharmony_ci	/* private: */
6462306a36Sopenharmony_ci	struct sdma_desc *descp;
6562306a36Sopenharmony_ci	/* private: */
6662306a36Sopenharmony_ci	void *coalesce_buf;
6762306a36Sopenharmony_ci	/* private: */
6862306a36Sopenharmony_ci	struct iowait *wait;
6962306a36Sopenharmony_ci	/* private: */
7062306a36Sopenharmony_ci	callback_t                  complete;
7162306a36Sopenharmony_ci#ifdef CONFIG_HFI1_DEBUG_SDMA_ORDER
7262306a36Sopenharmony_ci	u64 sn;
7362306a36Sopenharmony_ci#endif
7462306a36Sopenharmony_ci	/* private: - used in coalesce/pad processing */
7562306a36Sopenharmony_ci	u16                         packet_len;
7662306a36Sopenharmony_ci	/* private: - down-counted to trigger last */
7762306a36Sopenharmony_ci	u16                         tlen;
7862306a36Sopenharmony_ci	/* private: */
7962306a36Sopenharmony_ci	u16                         num_desc;
8062306a36Sopenharmony_ci	/* private: */
8162306a36Sopenharmony_ci	u16                         desc_limit;
8262306a36Sopenharmony_ci	/* private: */
8362306a36Sopenharmony_ci	u16                         next_descq_idx;
8462306a36Sopenharmony_ci	/* private: */
8562306a36Sopenharmony_ci	u16 coalesce_idx;
8662306a36Sopenharmony_ci	/* private: flags */
8762306a36Sopenharmony_ci	u16                         flags;
8862306a36Sopenharmony_ci	/* private: */
8962306a36Sopenharmony_ci	struct sdma_desc descs[NUM_DESC];
9062306a36Sopenharmony_ci};
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_cistatic inline int sdma_txreq_built(struct sdma_txreq *tx)
9362306a36Sopenharmony_ci{
9462306a36Sopenharmony_ci	return tx->num_desc;
9562306a36Sopenharmony_ci}
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci#endif                          /* HFI1_SDMA_TXREQ_H */
98