]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - drivers/staging/rdma/hfi1/sdma.h
IB/hfi1: Do not free hfi1 cdev parent structure early
[mirror_ubuntu-artful-kernel.git] / drivers / staging / rdma / hfi1 / sdma.h
index da89e6458162445d0cd1ec5fcfb048ea75a75991..8f50c99fe71100f27a891cb446893b55f3da278d 100644 (file)
@@ -1,14 +1,13 @@
 #ifndef _HFI1_SDMA_H
 #define _HFI1_SDMA_H
 /*
+ * Copyright(c) 2015, 2016 Intel Corporation.
  *
  * This file is provided under a dual BSD/GPLv2 license.  When using or
  * redistributing this file, you may do so under either license.
  *
  * GPL LICENSE SUMMARY
  *
- * Copyright(c) 2015 Intel Corporation.
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
  * published by the Free Software Foundation.
@@ -20,8 +19,6 @@
  *
  * BSD LICENSE
  *
- * Copyright(c) 2015 Intel Corporation.
- *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
 
 #include "hfi.h"
 #include "verbs.h"
+#include "sdma_txreq.h"
 
-/* increased for AHG */
-#define NUM_DESC 6
 /* Hardware limit */
 #define MAX_DESC 64
 /* Hardware limit for SDMA packet size */
 #define MAX_SDMA_PKT_SIZE ((16 * 1024) - 1)
 
-
 #define SDMA_TXREQ_S_OK        0
 #define SDMA_TXREQ_S_SENDERROR 1
 #define SDMA_TXREQ_S_ABORTED   2
 /*
  * Bits defined in the send DMA descriptor.
  */
-#define SDMA_DESC0_FIRST_DESC_FLAG      (1ULL << 63)
-#define SDMA_DESC0_LAST_DESC_FLAG       (1ULL << 62)
+#define SDMA_DESC0_FIRST_DESC_FLAG      BIT_ULL(63)
+#define SDMA_DESC0_LAST_DESC_FLAG       BIT_ULL(62)
 #define SDMA_DESC0_BYTE_COUNT_SHIFT     48
 #define SDMA_DESC0_BYTE_COUNT_WIDTH     14
 #define SDMA_DESC0_BYTE_COUNT_MASK \
        ((1ULL << SDMA_DESC1_GENERATION_WIDTH) - 1)
 #define SDMA_DESC1_GENERATION_SMASK \
        (SDMA_DESC1_GENERATION_MASK << SDMA_DESC1_GENERATION_SHIFT)
-#define SDMA_DESC1_INT_REQ_FLAG         (1ULL << 1)
-#define SDMA_DESC1_HEAD_TO_HOST_FLAG    (1ULL << 0)
+#define SDMA_DESC1_INT_REQ_FLAG         BIT_ULL(1)
+#define SDMA_DESC1_HEAD_TO_HOST_FLAG    BIT_ULL(0)
 
 enum sdma_states {
        sdma_state_s00_hw_down,
@@ -311,83 +306,6 @@ struct hw_sdma_desc {
        __le64 qw[2];
 };
 
-/*
- * struct sdma_desc - canonical fragment descriptor
- *
- * This is the descriptor carried in the tx request
- * corresponding to each fragment.
- *
- */
-struct sdma_desc {
-       /* private:  don't use directly */
-       u64 qw[2];
-};
-
-struct sdma_txreq;
-typedef void (*callback_t)(struct sdma_txreq *, int, int);
-
-/**
- * struct sdma_txreq - the sdma_txreq structure (one per packet)
- * @list: for use by user and by queuing for wait
- *
- * This is the representation of a packet which consists of some
- * number of fragments.   Storage is provided to within the structure.
- * for all fragments.
- *
- * The storage for the descriptors are automatically extended as needed
- * when the currently allocation is exceeded.
- *
- * The user (Verbs or PSM) may overload this structure with fields
- * specific to their use by putting this struct first in their struct.
- * The method of allocation of the overloaded structure is user dependent
- *
- * The list is the only public field in the structure.
- *
- */
-
-struct sdma_txreq {
-       struct list_head list;
-       /* private: */
-       struct sdma_desc *descp;
-       /* private: */
-       void *coalesce_buf;
-       /* private: */
-       u16 coalesce_idx;
-       /* private: */
-       struct iowait *wait;
-       /* private: */
-       callback_t                  complete;
-#ifdef CONFIG_HFI1_DEBUG_SDMA_ORDER
-       u64 sn;
-#endif
-       /* private: - used in coalesce/pad processing */
-       u16                         packet_len;
-       /* private: - down-counted to trigger last */
-       u16                         tlen;
-       /* private: flags */
-       u16                         flags;
-       /* private: */
-       u16                         num_desc;
-       /* private: */
-       u16                         desc_limit;
-       /* private: */
-       u16                         next_descq_idx;
-       /* private: */
-       struct sdma_desc descs[NUM_DESC];
-};
-
-struct verbs_txreq {
-       struct hfi1_pio_header  phdr;
-       struct sdma_txreq       txreq;
-       struct hfi1_qp           *qp;
-       struct hfi1_swqe         *wqe;
-       struct hfi1_mregion     *mr;
-       struct hfi1_sge_state    *ss;
-       struct sdma_engine     *sde;
-       u16                     hdr_dwords;
-       u16                     hdr_inx;
-};
-
 /**
  * struct sdma_engine - Data pertaining to each SDMA engine.
  * @dd: a back-pointer to the device data
@@ -409,6 +327,7 @@ struct sdma_engine {
        u64 imask;                      /* clear interrupt mask */
        u64 idle_mask;
        u64 progress_mask;
+       u64 int_mask;
        /* private: */
        volatile __le64      *head_dma; /* DMA'ed by chip */
        /* private: */
@@ -465,6 +384,12 @@ struct sdma_engine {
        u16                   tx_head;
        /* private: */
        u64                   last_status;
+       /* private */
+       u64                     err_cnt;
+       /* private */
+       u64                     sdma_int_cnt;
+       u64                     idle_int_cnt;
+       u64                     progress_int_cnt;
 
        /* private: */
        struct list_head      dmawait;
@@ -484,12 +409,12 @@ struct sdma_engine {
        u32                   progress_check_head;
        /* private: */
        struct work_struct flush_worker;
+       /* protect flush list */
        spinlock_t flushlist_lock;
        /* private: */
        struct list_head flushlist;
 };
 
-
 int sdma_init(struct hfi1_devdata *dd, u8 port);
 void sdma_start(struct hfi1_devdata *dd);
 void sdma_exit(struct hfi1_devdata *dd);
@@ -535,7 +460,6 @@ static inline int __sdma_running(struct sdma_engine *engine)
        return engine->state.current_state == sdma_state_s99_running;
 }
 
-
 /**
  * sdma_running() - state suitability test
  * @engine: sdma engine
@@ -565,7 +489,6 @@ void _sdma_txreq_ahgadd(
        u32 *ahg,
        u8 ahg_hlen);
 
-
 /**
  * sdma_txinit_ahg() - initialize an sdma_txreq struct with AHG
  * @tx: tx request to initialize
@@ -626,7 +549,7 @@ static inline int sdma_txinit_ahg(
        u8 num_ahg,
        u32 *ahg,
        u8 ahg_hlen,
-       void (*cb)(struct sdma_txreq *, int, int))
+       void (*cb)(struct sdma_txreq *, int))
 {
        if (tlen == 0)
                return -ENODATA;
@@ -640,7 +563,8 @@ static inline int sdma_txinit_ahg(
        tx->complete = cb;
        tx->coalesce_buf = NULL;
        tx->wait = NULL;
-       tx->tlen = tx->packet_len = tlen;
+       tx->packet_len = tlen;
+       tx->tlen = tx->packet_len;
        tx->descs[0].qw[0] = SDMA_DESC0_FIRST_DESC_FLAG;
        tx->descs[0].qw[1] = 0;
        if (flags & SDMA_TXREQ_F_AHG_COPY)
@@ -689,7 +613,7 @@ static inline int sdma_txinit(
        struct sdma_txreq *tx,
        u16 flags,
        u16 tlen,
-       void (*cb)(struct sdma_txreq *, int, int))
+       void (*cb)(struct sdma_txreq *, int))
 {
        return sdma_txinit_ahg(tx, flags, tlen, 0, 0, NULL, 0, cb);
 }
@@ -753,7 +677,7 @@ static inline void _sdma_close_tx(struct hfi1_devdata *dd,
                dd->default_desc1;
        if (tx->flags & SDMA_TXREQ_F_URGENT)
                tx->descp[tx->num_desc].qw[1] |=
-                       (SDMA_DESC1_HEAD_TO_HOST_FLAG|
+                       (SDMA_DESC1_HEAD_TO_HOST_FLAG |
                         SDMA_DESC1_INT_REQ_FLAG);
 }
 
@@ -1080,6 +1004,7 @@ struct sdma_map_elem {
 
 /**
  * struct sdma_map_el - mapping for a vl
+ * @engine_to_vl - map of an engine to a vl
  * @list - rcu head for free callback
  * @mask - vl mask to "mod" the vl to produce an index to map array
  * @actual_vls - number of vls
@@ -1091,6 +1016,7 @@ struct sdma_map_elem {
  * in turn point to an array of sde's for that vl.
  */
 struct sdma_vl_map {
+       s8 engine_to_vl[TXE_NUM_SDMA_ENGINES];
        struct rcu_head list;
        u32 mask;
        u8 actual_vls;