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