cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

sdma.h (31073B)


      1/* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause */
      2/*
      3 * Copyright(c) 2015 - 2018 Intel Corporation.
      4 */
      5
      6#ifndef _HFI1_SDMA_H
      7#define _HFI1_SDMA_H
      8
      9#include <linux/types.h>
     10#include <linux/list.h>
     11#include <asm/byteorder.h>
     12#include <linux/workqueue.h>
     13#include <linux/rculist.h>
     14
     15#include "hfi.h"
     16#include "verbs.h"
     17#include "sdma_txreq.h"
     18
     19/* Hardware limit */
     20#define MAX_DESC 64
     21/* Hardware limit for SDMA packet size */
     22#define MAX_SDMA_PKT_SIZE ((16 * 1024) - 1)
     23
     24#define SDMA_MAP_NONE          0
     25#define SDMA_MAP_SINGLE        1
     26#define SDMA_MAP_PAGE          2
     27
     28#define SDMA_AHG_VALUE_MASK          0xffff
     29#define SDMA_AHG_VALUE_SHIFT         0
     30#define SDMA_AHG_INDEX_MASK          0xf
     31#define SDMA_AHG_INDEX_SHIFT         16
     32#define SDMA_AHG_FIELD_LEN_MASK      0xf
     33#define SDMA_AHG_FIELD_LEN_SHIFT     20
     34#define SDMA_AHG_FIELD_START_MASK    0x1f
     35#define SDMA_AHG_FIELD_START_SHIFT   24
     36#define SDMA_AHG_UPDATE_ENABLE_MASK  0x1
     37#define SDMA_AHG_UPDATE_ENABLE_SHIFT 31
     38
     39/* AHG modes */
     40
     41/*
     42 * Be aware the ordering and values
     43 * for SDMA_AHG_APPLY_UPDATE[123]
     44 * are assumed in generating a skip
     45 * count in submit_tx() in sdma.c
     46 */
     47#define SDMA_AHG_NO_AHG              0
     48#define SDMA_AHG_COPY                1
     49#define SDMA_AHG_APPLY_UPDATE1       2
     50#define SDMA_AHG_APPLY_UPDATE2       3
     51#define SDMA_AHG_APPLY_UPDATE3       4
     52
     53/*
     54 * Bits defined in the send DMA descriptor.
     55 */
     56#define SDMA_DESC0_FIRST_DESC_FLAG      BIT_ULL(63)
     57#define SDMA_DESC0_LAST_DESC_FLAG       BIT_ULL(62)
     58#define SDMA_DESC0_BYTE_COUNT_SHIFT     48
     59#define SDMA_DESC0_BYTE_COUNT_WIDTH     14
     60#define SDMA_DESC0_BYTE_COUNT_MASK \
     61	((1ULL << SDMA_DESC0_BYTE_COUNT_WIDTH) - 1)
     62#define SDMA_DESC0_BYTE_COUNT_SMASK \
     63	(SDMA_DESC0_BYTE_COUNT_MASK << SDMA_DESC0_BYTE_COUNT_SHIFT)
     64#define SDMA_DESC0_PHY_ADDR_SHIFT       0
     65#define SDMA_DESC0_PHY_ADDR_WIDTH       48
     66#define SDMA_DESC0_PHY_ADDR_MASK \
     67	((1ULL << SDMA_DESC0_PHY_ADDR_WIDTH) - 1)
     68#define SDMA_DESC0_PHY_ADDR_SMASK \
     69	(SDMA_DESC0_PHY_ADDR_MASK << SDMA_DESC0_PHY_ADDR_SHIFT)
     70
     71#define SDMA_DESC1_HEADER_UPDATE1_SHIFT 32
     72#define SDMA_DESC1_HEADER_UPDATE1_WIDTH 32
     73#define SDMA_DESC1_HEADER_UPDATE1_MASK \
     74	((1ULL << SDMA_DESC1_HEADER_UPDATE1_WIDTH) - 1)
     75#define SDMA_DESC1_HEADER_UPDATE1_SMASK \
     76	(SDMA_DESC1_HEADER_UPDATE1_MASK << SDMA_DESC1_HEADER_UPDATE1_SHIFT)
     77#define SDMA_DESC1_HEADER_MODE_SHIFT    13
     78#define SDMA_DESC1_HEADER_MODE_WIDTH    3
     79#define SDMA_DESC1_HEADER_MODE_MASK \
     80	((1ULL << SDMA_DESC1_HEADER_MODE_WIDTH) - 1)
     81#define SDMA_DESC1_HEADER_MODE_SMASK \
     82	(SDMA_DESC1_HEADER_MODE_MASK << SDMA_DESC1_HEADER_MODE_SHIFT)
     83#define SDMA_DESC1_HEADER_INDEX_SHIFT   8
     84#define SDMA_DESC1_HEADER_INDEX_WIDTH   5
     85#define SDMA_DESC1_HEADER_INDEX_MASK \
     86	((1ULL << SDMA_DESC1_HEADER_INDEX_WIDTH) - 1)
     87#define SDMA_DESC1_HEADER_INDEX_SMASK \
     88	(SDMA_DESC1_HEADER_INDEX_MASK << SDMA_DESC1_HEADER_INDEX_SHIFT)
     89#define SDMA_DESC1_HEADER_DWS_SHIFT     4
     90#define SDMA_DESC1_HEADER_DWS_WIDTH     4
     91#define SDMA_DESC1_HEADER_DWS_MASK \
     92	((1ULL << SDMA_DESC1_HEADER_DWS_WIDTH) - 1)
     93#define SDMA_DESC1_HEADER_DWS_SMASK \
     94	(SDMA_DESC1_HEADER_DWS_MASK << SDMA_DESC1_HEADER_DWS_SHIFT)
     95#define SDMA_DESC1_GENERATION_SHIFT     2
     96#define SDMA_DESC1_GENERATION_WIDTH     2
     97#define SDMA_DESC1_GENERATION_MASK \
     98	((1ULL << SDMA_DESC1_GENERATION_WIDTH) - 1)
     99#define SDMA_DESC1_GENERATION_SMASK \
    100	(SDMA_DESC1_GENERATION_MASK << SDMA_DESC1_GENERATION_SHIFT)
    101#define SDMA_DESC1_INT_REQ_FLAG         BIT_ULL(1)
    102#define SDMA_DESC1_HEAD_TO_HOST_FLAG    BIT_ULL(0)
    103
    104enum sdma_states {
    105	sdma_state_s00_hw_down,
    106	sdma_state_s10_hw_start_up_halt_wait,
    107	sdma_state_s15_hw_start_up_clean_wait,
    108	sdma_state_s20_idle,
    109	sdma_state_s30_sw_clean_up_wait,
    110	sdma_state_s40_hw_clean_up_wait,
    111	sdma_state_s50_hw_halt_wait,
    112	sdma_state_s60_idle_halt_wait,
    113	sdma_state_s80_hw_freeze,
    114	sdma_state_s82_freeze_sw_clean,
    115	sdma_state_s99_running,
    116};
    117
    118enum sdma_events {
    119	sdma_event_e00_go_hw_down,
    120	sdma_event_e10_go_hw_start,
    121	sdma_event_e15_hw_halt_done,
    122	sdma_event_e25_hw_clean_up_done,
    123	sdma_event_e30_go_running,
    124	sdma_event_e40_sw_cleaned,
    125	sdma_event_e50_hw_cleaned,
    126	sdma_event_e60_hw_halted,
    127	sdma_event_e70_go_idle,
    128	sdma_event_e80_hw_freeze,
    129	sdma_event_e81_hw_frozen,
    130	sdma_event_e82_hw_unfreeze,
    131	sdma_event_e85_link_down,
    132	sdma_event_e90_sw_halted,
    133};
    134
    135struct sdma_set_state_action {
    136	unsigned op_enable:1;
    137	unsigned op_intenable:1;
    138	unsigned op_halt:1;
    139	unsigned op_cleanup:1;
    140	unsigned go_s99_running_tofalse:1;
    141	unsigned go_s99_running_totrue:1;
    142};
    143
    144struct sdma_state {
    145	struct kref          kref;
    146	struct completion    comp;
    147	enum sdma_states current_state;
    148	unsigned             current_op;
    149	unsigned             go_s99_running;
    150	/* debugging/development */
    151	enum sdma_states previous_state;
    152	unsigned             previous_op;
    153	enum sdma_events last_event;
    154};
    155
    156/**
    157 * DOC: sdma exported routines
    158 *
    159 * These sdma routines fit into three categories:
    160 * - The SDMA API for building and submitting packets
    161 *   to the ring
    162 *
    163 * - Initialization and tear down routines to buildup
    164 *   and tear down SDMA
    165 *
    166 * - ISR entrances to handle interrupts, state changes
    167 *   and errors
    168 */
    169
    170/**
    171 * DOC: sdma PSM/verbs API
    172 *
    173 * The sdma API is designed to be used by both PSM
    174 * and verbs to supply packets to the SDMA ring.
    175 *
    176 * The usage of the API is as follows:
    177 *
    178 * Embed a struct iowait in the QP or
    179 * PQ.  The iowait should be initialized with a
    180 * call to iowait_init().
    181 *
    182 * The user of the API should create an allocation method
    183 * for their version of the txreq. slabs, pre-allocated lists,
    184 * and dma pools can be used.  Once the user's overload of
    185 * the sdma_txreq has been allocated, the sdma_txreq member
    186 * must be initialized with sdma_txinit() or sdma_txinit_ahg().
    187 *
    188 * The txreq must be declared with the sdma_txreq first.
    189 *
    190 * The tx request, once initialized,  is manipulated with calls to
    191 * sdma_txadd_daddr(), sdma_txadd_page(), or sdma_txadd_kvaddr()
    192 * for each disjoint memory location.  It is the user's responsibility
    193 * to understand the packet boundaries and page boundaries to do the
    194 * appropriate number of sdma_txadd_* calls..  The user
    195 * must be prepared to deal with failures from these routines due to
    196 * either memory allocation or dma_mapping failures.
    197 *
    198 * The mapping specifics for each memory location are recorded
    199 * in the tx. Memory locations added with sdma_txadd_page()
    200 * and sdma_txadd_kvaddr() are automatically mapped when added
    201 * to the tx and nmapped as part of the progress processing in the
    202 * SDMA interrupt handling.
    203 *
    204 * sdma_txadd_daddr() is used to add an dma_addr_t memory to the
    205 * tx.   An example of a use case would be a pre-allocated
    206 * set of headers allocated via dma_pool_alloc() or
    207 * dma_alloc_coherent().  For these memory locations, it
    208 * is the responsibility of the user to handle that unmapping.
    209 * (This would usually be at an unload or job termination.)
    210 *
    211 * The routine sdma_send_txreq() is used to submit
    212 * a tx to the ring after the appropriate number of
    213 * sdma_txadd_* have been done.
    214 *
    215 * If it is desired to send a burst of sdma_txreqs, sdma_send_txlist()
    216 * can be used to submit a list of packets.
    217 *
    218 * The user is free to use the link overhead in the struct sdma_txreq as
    219 * long as the tx isn't in flight.
    220 *
    221 * The extreme degenerate case of the number of descriptors
    222 * exceeding the ring size is automatically handled as
    223 * memory locations are added.  An overflow of the descriptor
    224 * array that is part of the sdma_txreq is also automatically
    225 * handled.
    226 *
    227 */
    228
    229/**
    230 * DOC: Infrastructure calls
    231 *
    232 * sdma_init() is used to initialize data structures and
    233 * CSRs for the desired number of SDMA engines.
    234 *
    235 * sdma_start() is used to kick the SDMA engines initialized
    236 * with sdma_init().   Interrupts must be enabled at this
    237 * point since aspects of the state machine are interrupt
    238 * driven.
    239 *
    240 * sdma_engine_error() and sdma_engine_interrupt() are
    241 * entrances for interrupts.
    242 *
    243 * sdma_map_init() is for the management of the mapping
    244 * table when the number of vls is changed.
    245 *
    246 */
    247
    248/*
    249 * struct hw_sdma_desc - raw 128 bit SDMA descriptor
    250 *
    251 * This is the raw descriptor in the SDMA ring
    252 */
    253struct hw_sdma_desc {
    254	/* private:  don't use directly */
    255	__le64 qw[2];
    256};
    257
    258/**
    259 * struct sdma_engine - Data pertaining to each SDMA engine.
    260 * @dd: a back-pointer to the device data
    261 * @ppd: per port back-pointer
    262 * @imask: mask for irq manipulation
    263 * @idle_mask: mask for determining if an interrupt is due to sdma_idle
    264 *
    265 * This structure has the state for each sdma_engine.
    266 *
    267 * Accessing to non public fields are not supported
    268 * since the private members are subject to change.
    269 */
    270struct sdma_engine {
    271	/* read mostly */
    272	struct hfi1_devdata *dd;
    273	struct hfi1_pportdata *ppd;
    274	/* private: */
    275	void __iomem *tail_csr;
    276	u64 imask;			/* clear interrupt mask */
    277	u64 idle_mask;
    278	u64 progress_mask;
    279	u64 int_mask;
    280	/* private: */
    281	volatile __le64      *head_dma; /* DMA'ed by chip */
    282	/* private: */
    283	dma_addr_t            head_phys;
    284	/* private: */
    285	struct hw_sdma_desc *descq;
    286	/* private: */
    287	unsigned descq_full_count;
    288	struct sdma_txreq **tx_ring;
    289	/* private: */
    290	dma_addr_t            descq_phys;
    291	/* private */
    292	u32 sdma_mask;
    293	/* private */
    294	struct sdma_state state;
    295	/* private */
    296	int cpu;
    297	/* private: */
    298	u8 sdma_shift;
    299	/* private: */
    300	u8 this_idx; /* zero relative engine */
    301	/* protect changes to senddmactrl shadow */
    302	spinlock_t senddmactrl_lock;
    303	/* private: */
    304	u64 p_senddmactrl;		/* shadow per-engine SendDmaCtrl */
    305
    306	/* read/write using tail_lock */
    307	spinlock_t            tail_lock ____cacheline_aligned_in_smp;
    308#ifdef CONFIG_HFI1_DEBUG_SDMA_ORDER
    309	/* private: */
    310	u64                   tail_sn;
    311#endif
    312	/* private: */
    313	u32                   descq_tail;
    314	/* private: */
    315	unsigned long         ahg_bits;
    316	/* private: */
    317	u16                   desc_avail;
    318	/* private: */
    319	u16                   tx_tail;
    320	/* private: */
    321	u16 descq_cnt;
    322
    323	/* read/write using head_lock */
    324	/* private: */
    325	seqlock_t            head_lock ____cacheline_aligned_in_smp;
    326#ifdef CONFIG_HFI1_DEBUG_SDMA_ORDER
    327	/* private: */
    328	u64                   head_sn;
    329#endif
    330	/* private: */
    331	u32                   descq_head;
    332	/* private: */
    333	u16                   tx_head;
    334	/* private: */
    335	u64                   last_status;
    336	/* private */
    337	u64                     err_cnt;
    338	/* private */
    339	u64                     sdma_int_cnt;
    340	u64                     idle_int_cnt;
    341	u64                     progress_int_cnt;
    342
    343	/* private: */
    344	seqlock_t            waitlock;
    345	struct list_head      dmawait;
    346
    347	/* CONFIG SDMA for now, just blindly duplicate */
    348	/* private: */
    349	struct tasklet_struct sdma_hw_clean_up_task
    350		____cacheline_aligned_in_smp;
    351
    352	/* private: */
    353	struct tasklet_struct sdma_sw_clean_up_task
    354		____cacheline_aligned_in_smp;
    355	/* private: */
    356	struct work_struct err_halt_worker;
    357	/* private */
    358	struct timer_list     err_progress_check_timer;
    359	u32                   progress_check_head;
    360	/* private: */
    361	struct work_struct flush_worker;
    362	/* protect flush list */
    363	spinlock_t flushlist_lock;
    364	/* private: */
    365	struct list_head flushlist;
    366	struct cpumask cpu_mask;
    367	struct kobject kobj;
    368	u32 msix_intr;
    369};
    370
    371int sdma_init(struct hfi1_devdata *dd, u8 port);
    372void sdma_start(struct hfi1_devdata *dd);
    373void sdma_exit(struct hfi1_devdata *dd);
    374void sdma_clean(struct hfi1_devdata *dd, size_t num_engines);
    375void sdma_all_running(struct hfi1_devdata *dd);
    376void sdma_all_idle(struct hfi1_devdata *dd);
    377void sdma_freeze_notify(struct hfi1_devdata *dd, int go_idle);
    378void sdma_freeze(struct hfi1_devdata *dd);
    379void sdma_unfreeze(struct hfi1_devdata *dd);
    380void sdma_wait(struct hfi1_devdata *dd);
    381
    382/**
    383 * sdma_empty() - idle engine test
    384 * @engine: sdma engine
    385 *
    386 * Currently used by verbs as a latency optimization.
    387 *
    388 * Return:
    389 * 1 - empty, 0 - non-empty
    390 */
    391static inline int sdma_empty(struct sdma_engine *sde)
    392{
    393	return sde->descq_tail == sde->descq_head;
    394}
    395
    396static inline u16 sdma_descq_freecnt(struct sdma_engine *sde)
    397{
    398	return sde->descq_cnt -
    399		(sde->descq_tail -
    400		 READ_ONCE(sde->descq_head)) - 1;
    401}
    402
    403static inline u16 sdma_descq_inprocess(struct sdma_engine *sde)
    404{
    405	return sde->descq_cnt - sdma_descq_freecnt(sde);
    406}
    407
    408/*
    409 * Either head_lock or tail lock required to see
    410 * a steady state.
    411 */
    412static inline int __sdma_running(struct sdma_engine *engine)
    413{
    414	return engine->state.current_state == sdma_state_s99_running;
    415}
    416
    417/**
    418 * sdma_running() - state suitability test
    419 * @engine: sdma engine
    420 *
    421 * sdma_running probes the internal state to determine if it is suitable
    422 * for submitting packets.
    423 *
    424 * Return:
    425 * 1 - ok to submit, 0 - not ok to submit
    426 *
    427 */
    428static inline int sdma_running(struct sdma_engine *engine)
    429{
    430	unsigned long flags;
    431	int ret;
    432
    433	spin_lock_irqsave(&engine->tail_lock, flags);
    434	ret = __sdma_running(engine);
    435	spin_unlock_irqrestore(&engine->tail_lock, flags);
    436	return ret;
    437}
    438
    439void _sdma_txreq_ahgadd(
    440	struct sdma_txreq *tx,
    441	u8 num_ahg,
    442	u8 ahg_entry,
    443	u32 *ahg,
    444	u8 ahg_hlen);
    445
    446/**
    447 * sdma_txinit_ahg() - initialize an sdma_txreq struct with AHG
    448 * @tx: tx request to initialize
    449 * @flags: flags to key last descriptor additions
    450 * @tlen: total packet length (pbc + headers + data)
    451 * @ahg_entry: ahg entry to use  (0 - 31)
    452 * @num_ahg: ahg descriptor for first descriptor (0 - 9)
    453 * @ahg: array of AHG descriptors (up to 9 entries)
    454 * @ahg_hlen: number of bytes from ASIC entry to use
    455 * @cb: callback
    456 *
    457 * The allocation of the sdma_txreq and it enclosing structure is user
    458 * dependent.  This routine must be called to initialize the user independent
    459 * fields.
    460 *
    461 * The currently supported flags are SDMA_TXREQ_F_URGENT,
    462 * SDMA_TXREQ_F_AHG_COPY, and SDMA_TXREQ_F_USE_AHG.
    463 *
    464 * SDMA_TXREQ_F_URGENT is used for latency sensitive situations where the
    465 * completion is desired as soon as possible.
    466 *
    467 * SDMA_TXREQ_F_AHG_COPY causes the header in the first descriptor to be
    468 * copied to chip entry. SDMA_TXREQ_F_USE_AHG causes the code to add in
    469 * the AHG descriptors into the first 1 to 3 descriptors.
    470 *
    471 * Completions of submitted requests can be gotten on selected
    472 * txreqs by giving a completion routine callback to sdma_txinit() or
    473 * sdma_txinit_ahg().  The environment in which the callback runs
    474 * can be from an ISR, a tasklet, or a thread, so no sleeping
    475 * kernel routines can be used.   Aspects of the sdma ring may
    476 * be locked so care should be taken with locking.
    477 *
    478 * The callback pointer can be NULL to avoid any callback for the packet
    479 * being submitted. The callback will be provided this tx, a status, and a flag.
    480 *
    481 * The status will be one of SDMA_TXREQ_S_OK, SDMA_TXREQ_S_SENDERROR,
    482 * SDMA_TXREQ_S_ABORTED, or SDMA_TXREQ_S_SHUTDOWN.
    483 *
    484 * The flag, if the is the iowait had been used, indicates the iowait
    485 * sdma_busy count has reached zero.
    486 *
    487 * user data portion of tlen should be precise.   The sdma_txadd_* entrances
    488 * will pad with a descriptor references 1 - 3 bytes when the number of bytes
    489 * specified in tlen have been supplied to the sdma_txreq.
    490 *
    491 * ahg_hlen is used to determine the number of on-chip entry bytes to
    492 * use as the header.   This is for cases where the stored header is
    493 * larger than the header to be used in a packet.  This is typical
    494 * for verbs where an RDMA_WRITE_FIRST is larger than the packet in
    495 * and RDMA_WRITE_MIDDLE.
    496 *
    497 */
    498static inline int sdma_txinit_ahg(
    499	struct sdma_txreq *tx,
    500	u16 flags,
    501	u16 tlen,
    502	u8 ahg_entry,
    503	u8 num_ahg,
    504	u32 *ahg,
    505	u8 ahg_hlen,
    506	void (*cb)(struct sdma_txreq *, int))
    507{
    508	if (tlen == 0)
    509		return -ENODATA;
    510	if (tlen > MAX_SDMA_PKT_SIZE)
    511		return -EMSGSIZE;
    512	tx->desc_limit = ARRAY_SIZE(tx->descs);
    513	tx->descp = &tx->descs[0];
    514	INIT_LIST_HEAD(&tx->list);
    515	tx->num_desc = 0;
    516	tx->flags = flags;
    517	tx->complete = cb;
    518	tx->coalesce_buf = NULL;
    519	tx->wait = NULL;
    520	tx->packet_len = tlen;
    521	tx->tlen = tx->packet_len;
    522	tx->descs[0].qw[0] = SDMA_DESC0_FIRST_DESC_FLAG;
    523	tx->descs[0].qw[1] = 0;
    524	if (flags & SDMA_TXREQ_F_AHG_COPY)
    525		tx->descs[0].qw[1] |=
    526			(((u64)ahg_entry & SDMA_DESC1_HEADER_INDEX_MASK)
    527				<< SDMA_DESC1_HEADER_INDEX_SHIFT) |
    528			(((u64)SDMA_AHG_COPY & SDMA_DESC1_HEADER_MODE_MASK)
    529				<< SDMA_DESC1_HEADER_MODE_SHIFT);
    530	else if (flags & SDMA_TXREQ_F_USE_AHG && num_ahg)
    531		_sdma_txreq_ahgadd(tx, num_ahg, ahg_entry, ahg, ahg_hlen);
    532	return 0;
    533}
    534
    535/**
    536 * sdma_txinit() - initialize an sdma_txreq struct (no AHG)
    537 * @tx: tx request to initialize
    538 * @flags: flags to key last descriptor additions
    539 * @tlen: total packet length (pbc + headers + data)
    540 * @cb: callback pointer
    541 *
    542 * The allocation of the sdma_txreq and it enclosing structure is user
    543 * dependent.  This routine must be called to initialize the user
    544 * independent fields.
    545 *
    546 * The currently supported flags is SDMA_TXREQ_F_URGENT.
    547 *
    548 * SDMA_TXREQ_F_URGENT is used for latency sensitive situations where the
    549 * completion is desired as soon as possible.
    550 *
    551 * Completions of submitted requests can be gotten on selected
    552 * txreqs by giving a completion routine callback to sdma_txinit() or
    553 * sdma_txinit_ahg().  The environment in which the callback runs
    554 * can be from an ISR, a tasklet, or a thread, so no sleeping
    555 * kernel routines can be used.   The head size of the sdma ring may
    556 * be locked so care should be taken with locking.
    557 *
    558 * The callback pointer can be NULL to avoid any callback for the packet
    559 * being submitted.
    560 *
    561 * The callback, if non-NULL,  will be provided this tx and a status.  The
    562 * status will be one of SDMA_TXREQ_S_OK, SDMA_TXREQ_S_SENDERROR,
    563 * SDMA_TXREQ_S_ABORTED, or SDMA_TXREQ_S_SHUTDOWN.
    564 *
    565 */
    566static inline int sdma_txinit(
    567	struct sdma_txreq *tx,
    568	u16 flags,
    569	u16 tlen,
    570	void (*cb)(struct sdma_txreq *, int))
    571{
    572	return sdma_txinit_ahg(tx, flags, tlen, 0, 0, NULL, 0, cb);
    573}
    574
    575/* helpers - don't use */
    576static inline int sdma_mapping_type(struct sdma_desc *d)
    577{
    578	return (d->qw[1] & SDMA_DESC1_GENERATION_SMASK)
    579		>> SDMA_DESC1_GENERATION_SHIFT;
    580}
    581
    582static inline size_t sdma_mapping_len(struct sdma_desc *d)
    583{
    584	return (d->qw[0] & SDMA_DESC0_BYTE_COUNT_SMASK)
    585		>> SDMA_DESC0_BYTE_COUNT_SHIFT;
    586}
    587
    588static inline dma_addr_t sdma_mapping_addr(struct sdma_desc *d)
    589{
    590	return (d->qw[0] & SDMA_DESC0_PHY_ADDR_SMASK)
    591		>> SDMA_DESC0_PHY_ADDR_SHIFT;
    592}
    593
    594static inline void make_tx_sdma_desc(
    595	struct sdma_txreq *tx,
    596	int type,
    597	dma_addr_t addr,
    598	size_t len)
    599{
    600	struct sdma_desc *desc = &tx->descp[tx->num_desc];
    601
    602	if (!tx->num_desc) {
    603		/* qw[0] zero; qw[1] first, ahg mode already in from init */
    604		desc->qw[1] |= ((u64)type & SDMA_DESC1_GENERATION_MASK)
    605				<< SDMA_DESC1_GENERATION_SHIFT;
    606	} else {
    607		desc->qw[0] = 0;
    608		desc->qw[1] = ((u64)type & SDMA_DESC1_GENERATION_MASK)
    609				<< SDMA_DESC1_GENERATION_SHIFT;
    610	}
    611	desc->qw[0] |= (((u64)addr & SDMA_DESC0_PHY_ADDR_MASK)
    612				<< SDMA_DESC0_PHY_ADDR_SHIFT) |
    613			(((u64)len & SDMA_DESC0_BYTE_COUNT_MASK)
    614				<< SDMA_DESC0_BYTE_COUNT_SHIFT);
    615}
    616
    617/* helper to extend txreq */
    618int ext_coal_sdma_tx_descs(struct hfi1_devdata *dd, struct sdma_txreq *tx,
    619			   int type, void *kvaddr, struct page *page,
    620			   unsigned long offset, u16 len);
    621int _pad_sdma_tx_descs(struct hfi1_devdata *, struct sdma_txreq *);
    622void __sdma_txclean(struct hfi1_devdata *, struct sdma_txreq *);
    623
    624static inline void sdma_txclean(struct hfi1_devdata *dd, struct sdma_txreq *tx)
    625{
    626	if (tx->num_desc)
    627		__sdma_txclean(dd, tx);
    628}
    629
    630/* helpers used by public routines */
    631static inline void _sdma_close_tx(struct hfi1_devdata *dd,
    632				  struct sdma_txreq *tx)
    633{
    634	tx->descp[tx->num_desc].qw[0] |=
    635		SDMA_DESC0_LAST_DESC_FLAG;
    636	tx->descp[tx->num_desc].qw[1] |=
    637		dd->default_desc1;
    638	if (tx->flags & SDMA_TXREQ_F_URGENT)
    639		tx->descp[tx->num_desc].qw[1] |=
    640			(SDMA_DESC1_HEAD_TO_HOST_FLAG |
    641			 SDMA_DESC1_INT_REQ_FLAG);
    642}
    643
    644static inline int _sdma_txadd_daddr(
    645	struct hfi1_devdata *dd,
    646	int type,
    647	struct sdma_txreq *tx,
    648	dma_addr_t addr,
    649	u16 len)
    650{
    651	int rval = 0;
    652
    653	make_tx_sdma_desc(
    654		tx,
    655		type,
    656		addr, len);
    657	WARN_ON(len > tx->tlen);
    658	tx->tlen -= len;
    659	/* special cases for last */
    660	if (!tx->tlen) {
    661		if (tx->packet_len & (sizeof(u32) - 1)) {
    662			rval = _pad_sdma_tx_descs(dd, tx);
    663			if (rval)
    664				return rval;
    665		} else {
    666			_sdma_close_tx(dd, tx);
    667		}
    668	}
    669	tx->num_desc++;
    670	return rval;
    671}
    672
    673/**
    674 * sdma_txadd_page() - add a page to the sdma_txreq
    675 * @dd: the device to use for mapping
    676 * @tx: tx request to which the page is added
    677 * @page: page to map
    678 * @offset: offset within the page
    679 * @len: length in bytes
    680 *
    681 * This is used to add a page/offset/length descriptor.
    682 *
    683 * The mapping/unmapping of the page/offset/len is automatically handled.
    684 *
    685 * Return:
    686 * 0 - success, -ENOSPC - mapping fail, -ENOMEM - couldn't
    687 * extend/coalesce descriptor array
    688 */
    689static inline int sdma_txadd_page(
    690	struct hfi1_devdata *dd,
    691	struct sdma_txreq *tx,
    692	struct page *page,
    693	unsigned long offset,
    694	u16 len)
    695{
    696	dma_addr_t addr;
    697	int rval;
    698
    699	if ((unlikely(tx->num_desc == tx->desc_limit))) {
    700		rval = ext_coal_sdma_tx_descs(dd, tx, SDMA_MAP_PAGE,
    701					      NULL, page, offset, len);
    702		if (rval <= 0)
    703			return rval;
    704	}
    705
    706	addr = dma_map_page(
    707		       &dd->pcidev->dev,
    708		       page,
    709		       offset,
    710		       len,
    711		       DMA_TO_DEVICE);
    712
    713	if (unlikely(dma_mapping_error(&dd->pcidev->dev, addr))) {
    714		__sdma_txclean(dd, tx);
    715		return -ENOSPC;
    716	}
    717
    718	return _sdma_txadd_daddr(
    719			dd, SDMA_MAP_PAGE, tx, addr, len);
    720}
    721
    722/**
    723 * sdma_txadd_daddr() - add a dma address to the sdma_txreq
    724 * @dd: the device to use for mapping
    725 * @tx: sdma_txreq to which the page is added
    726 * @addr: dma address mapped by caller
    727 * @len: length in bytes
    728 *
    729 * This is used to add a descriptor for memory that is already dma mapped.
    730 *
    731 * In this case, there is no unmapping as part of the progress processing for
    732 * this memory location.
    733 *
    734 * Return:
    735 * 0 - success, -ENOMEM - couldn't extend descriptor array
    736 */
    737
    738static inline int sdma_txadd_daddr(
    739	struct hfi1_devdata *dd,
    740	struct sdma_txreq *tx,
    741	dma_addr_t addr,
    742	u16 len)
    743{
    744	int rval;
    745
    746	if ((unlikely(tx->num_desc == tx->desc_limit))) {
    747		rval = ext_coal_sdma_tx_descs(dd, tx, SDMA_MAP_NONE,
    748					      NULL, NULL, 0, 0);
    749		if (rval <= 0)
    750			return rval;
    751	}
    752
    753	return _sdma_txadd_daddr(dd, SDMA_MAP_NONE, tx, addr, len);
    754}
    755
    756/**
    757 * sdma_txadd_kvaddr() - add a kernel virtual address to sdma_txreq
    758 * @dd: the device to use for mapping
    759 * @tx: sdma_txreq to which the page is added
    760 * @kvaddr: the kernel virtual address
    761 * @len: length in bytes
    762 *
    763 * This is used to add a descriptor referenced by the indicated kvaddr and
    764 * len.
    765 *
    766 * The mapping/unmapping of the kvaddr and len is automatically handled.
    767 *
    768 * Return:
    769 * 0 - success, -ENOSPC - mapping fail, -ENOMEM - couldn't extend/coalesce
    770 * descriptor array
    771 */
    772static inline int sdma_txadd_kvaddr(
    773	struct hfi1_devdata *dd,
    774	struct sdma_txreq *tx,
    775	void *kvaddr,
    776	u16 len)
    777{
    778	dma_addr_t addr;
    779	int rval;
    780
    781	if ((unlikely(tx->num_desc == tx->desc_limit))) {
    782		rval = ext_coal_sdma_tx_descs(dd, tx, SDMA_MAP_SINGLE,
    783					      kvaddr, NULL, 0, len);
    784		if (rval <= 0)
    785			return rval;
    786	}
    787
    788	addr = dma_map_single(
    789		       &dd->pcidev->dev,
    790		       kvaddr,
    791		       len,
    792		       DMA_TO_DEVICE);
    793
    794	if (unlikely(dma_mapping_error(&dd->pcidev->dev, addr))) {
    795		__sdma_txclean(dd, tx);
    796		return -ENOSPC;
    797	}
    798
    799	return _sdma_txadd_daddr(
    800			dd, SDMA_MAP_SINGLE, tx, addr, len);
    801}
    802
    803struct iowait_work;
    804
    805int sdma_send_txreq(struct sdma_engine *sde,
    806		    struct iowait_work *wait,
    807		    struct sdma_txreq *tx,
    808		    bool pkts_sent);
    809int sdma_send_txlist(struct sdma_engine *sde,
    810		     struct iowait_work *wait,
    811		     struct list_head *tx_list,
    812		     u16 *count_out);
    813
    814int sdma_ahg_alloc(struct sdma_engine *sde);
    815void sdma_ahg_free(struct sdma_engine *sde, int ahg_index);
    816
    817/**
    818 * sdma_build_ahg - build ahg descriptor
    819 * @data
    820 * @dwindex
    821 * @startbit
    822 * @bits
    823 *
    824 * Build and return a 32 bit descriptor.
    825 */
    826static inline u32 sdma_build_ahg_descriptor(
    827	u16 data,
    828	u8 dwindex,
    829	u8 startbit,
    830	u8 bits)
    831{
    832	return (u32)(1UL << SDMA_AHG_UPDATE_ENABLE_SHIFT |
    833		((startbit & SDMA_AHG_FIELD_START_MASK) <<
    834		SDMA_AHG_FIELD_START_SHIFT) |
    835		((bits & SDMA_AHG_FIELD_LEN_MASK) <<
    836		SDMA_AHG_FIELD_LEN_SHIFT) |
    837		((dwindex & SDMA_AHG_INDEX_MASK) <<
    838		SDMA_AHG_INDEX_SHIFT) |
    839		((data & SDMA_AHG_VALUE_MASK) <<
    840		SDMA_AHG_VALUE_SHIFT));
    841}
    842
    843/**
    844 * sdma_progress - use seq number of detect head progress
    845 * @sde: sdma_engine to check
    846 * @seq: base seq count
    847 * @tx: txreq for which we need to check descriptor availability
    848 *
    849 * This is used in the appropriate spot in the sleep routine
    850 * to check for potential ring progress.  This routine gets the
    851 * seqcount before queuing the iowait structure for progress.
    852 *
    853 * If the seqcount indicates that progress needs to be checked,
    854 * re-submission is detected by checking whether the descriptor
    855 * queue has enough descriptor for the txreq.
    856 */
    857static inline unsigned sdma_progress(struct sdma_engine *sde, unsigned seq,
    858				     struct sdma_txreq *tx)
    859{
    860	if (read_seqretry(&sde->head_lock, seq)) {
    861		sde->desc_avail = sdma_descq_freecnt(sde);
    862		if (tx->num_desc > sde->desc_avail)
    863			return 0;
    864		return 1;
    865	}
    866	return 0;
    867}
    868
    869/* for use by interrupt handling */
    870void sdma_engine_error(struct sdma_engine *sde, u64 status);
    871void sdma_engine_interrupt(struct sdma_engine *sde, u64 status);
    872
    873/*
    874 *
    875 * The diagram below details the relationship of the mapping structures
    876 *
    877 * Since the mapping now allows for non-uniform engines per vl, the
    878 * number of engines for a vl is either the vl_engines[vl] or
    879 * a computation based on num_sdma/num_vls:
    880 *
    881 * For example:
    882 * nactual = vl_engines ? vl_engines[vl] : num_sdma/num_vls
    883 *
    884 * n = roundup to next highest power of 2 using nactual
    885 *
    886 * In the case where there are num_sdma/num_vls doesn't divide
    887 * evenly, the extras are added from the last vl downward.
    888 *
    889 * For the case where n > nactual, the engines are assigned
    890 * in a round robin fashion wrapping back to the first engine
    891 * for a particular vl.
    892 *
    893 *               dd->sdma_map
    894 *                    |                                   sdma_map_elem[0]
    895 *                    |                                +--------------------+
    896 *                    v                                |       mask         |
    897 *               sdma_vl_map                           |--------------------|
    898 *      +--------------------------+                   | sde[0] -> eng 1    |
    899 *      |    list (RCU)            |                   |--------------------|
    900 *      |--------------------------|                 ->| sde[1] -> eng 2    |
    901 *      |    mask                  |              --/  |--------------------|
    902 *      |--------------------------|            -/     |        *           |
    903 *      |    actual_vls (max 8)    |          -/       |--------------------|
    904 *      |--------------------------|       --/         | sde[n-1] -> eng n  |
    905 *      |    vls (max 8)           |     -/            +--------------------+
    906 *      |--------------------------|  --/
    907 *      |    map[0]                |-/
    908 *      |--------------------------|                   +---------------------+
    909 *      |    map[1]                |---                |       mask          |
    910 *      |--------------------------|   \----           |---------------------|
    911 *      |           *              |        \--        | sde[0] -> eng 1+n   |
    912 *      |           *              |           \----   |---------------------|
    913 *      |           *              |                \->| sde[1] -> eng 2+n   |
    914 *      |--------------------------|                   |---------------------|
    915 *      |   map[vls - 1]           |-                  |         *           |
    916 *      +--------------------------+ \-                |---------------------|
    917 *                                     \-              | sde[m-1] -> eng m+n |
    918 *                                       \             +---------------------+
    919 *                                        \-
    920 *                                          \
    921 *                                           \-        +----------------------+
    922 *                                             \-      |       mask           |
    923 *                                               \     |----------------------|
    924 *                                                \-   | sde[0] -> eng 1+m+n  |
    925 *                                                  \- |----------------------|
    926 *                                                    >| sde[1] -> eng 2+m+n  |
    927 *                                                     |----------------------|
    928 *                                                     |         *            |
    929 *                                                     |----------------------|
    930 *                                                     | sde[o-1] -> eng o+m+n|
    931 *                                                     +----------------------+
    932 *
    933 */
    934
    935/**
    936 * struct sdma_map_elem - mapping for a vl
    937 * @mask - selector mask
    938 * @sde - array of engines for this vl
    939 *
    940 * The mask is used to "mod" the selector
    941 * to produce index into the trailing
    942 * array of sdes.
    943 */
    944struct sdma_map_elem {
    945	u32 mask;
    946	struct sdma_engine *sde[];
    947};
    948
    949/**
    950 * struct sdma_map_el - mapping for a vl
    951 * @engine_to_vl - map of an engine to a vl
    952 * @list - rcu head for free callback
    953 * @mask - vl mask to "mod" the vl to produce an index to map array
    954 * @actual_vls - number of vls
    955 * @vls - number of vls rounded to next power of 2
    956 * @map - array of sdma_map_elem entries
    957 *
    958 * This is the parent mapping structure.  The trailing
    959 * members of the struct point to sdma_map_elem entries, which
    960 * in turn point to an array of sde's for that vl.
    961 */
    962struct sdma_vl_map {
    963	s8 engine_to_vl[TXE_NUM_SDMA_ENGINES];
    964	struct rcu_head list;
    965	u32 mask;
    966	u8 actual_vls;
    967	u8 vls;
    968	struct sdma_map_elem *map[];
    969};
    970
    971int sdma_map_init(
    972	struct hfi1_devdata *dd,
    973	u8 port,
    974	u8 num_vls,
    975	u8 *vl_engines);
    976
    977/* slow path */
    978void _sdma_engine_progress_schedule(struct sdma_engine *sde);
    979
    980/**
    981 * sdma_engine_progress_schedule() - schedule progress on engine
    982 * @sde: sdma_engine to schedule progress
    983 *
    984 * This is the fast path.
    985 *
    986 */
    987static inline void sdma_engine_progress_schedule(
    988	struct sdma_engine *sde)
    989{
    990	if (!sde || sdma_descq_inprocess(sde) < (sde->descq_cnt / 8))
    991		return;
    992	_sdma_engine_progress_schedule(sde);
    993}
    994
    995struct sdma_engine *sdma_select_engine_sc(
    996	struct hfi1_devdata *dd,
    997	u32 selector,
    998	u8 sc5);
    999
   1000struct sdma_engine *sdma_select_engine_vl(
   1001	struct hfi1_devdata *dd,
   1002	u32 selector,
   1003	u8 vl);
   1004
   1005struct sdma_engine *sdma_select_user_engine(struct hfi1_devdata *dd,
   1006					    u32 selector, u8 vl);
   1007ssize_t sdma_get_cpu_to_sde_map(struct sdma_engine *sde, char *buf);
   1008ssize_t sdma_set_cpu_to_sde_map(struct sdma_engine *sde, const char *buf,
   1009				size_t count);
   1010int sdma_engine_get_vl(struct sdma_engine *sde);
   1011void sdma_seqfile_dump_sde(struct seq_file *s, struct sdma_engine *);
   1012void sdma_seqfile_dump_cpu_list(struct seq_file *s, struct hfi1_devdata *dd,
   1013				unsigned long cpuid);
   1014
   1015#ifdef CONFIG_SDMA_VERBOSITY
   1016void sdma_dumpstate(struct sdma_engine *);
   1017#endif
   1018static inline char *slashstrip(char *s)
   1019{
   1020	char *r = s;
   1021
   1022	while (*s)
   1023		if (*s++ == '/')
   1024			r = s;
   1025	return r;
   1026}
   1027
   1028u16 sdma_get_descq_cnt(void);
   1029
   1030extern uint mod_num_sdma;
   1031
   1032void sdma_update_lmc(struct hfi1_devdata *dd, u64 mask, u32 lid);
   1033
   1034#endif