root/drivers/misc/mic/scif/scif_nodeqp.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. scif_get_peer_dev
  2. scif_put_peer_dev

   1 /*
   2  * Intel MIC Platform Software Stack (MPSS)
   3  *
   4  * This file is provided under a dual BSD/GPLv2 license.  When using or
   5  * redistributing this file, you may do so under either license.
   6  *
   7  * GPL LICENSE SUMMARY
   8  *
   9  * Copyright(c) 2014 Intel Corporation.
  10  *
  11  * This program is free software; you can redistribute it and/or modify
  12  * it under the terms of version 2 of the GNU General Public License as
  13  * published by the Free Software Foundation.
  14  *
  15  * This program is distributed in the hope that it will be useful, but
  16  * WITHOUT ANY WARRANTY; without even the implied warranty of
  17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  18  * General Public License for more details.
  19  *
  20  * BSD LICENSE
  21  *
  22  * Copyright(c) 2014 Intel Corporation.
  23  *
  24  * Redistribution and use in source and binary forms, with or without
  25  * modification, are permitted provided that the following conditions
  26  * are met:
  27  *
  28  * * Redistributions of source code must retain the above copyright
  29  *   notice, this list of conditions and the following disclaimer.
  30  * * Redistributions in binary form must reproduce the above copyright
  31  *   notice, this list of conditions and the following disclaimer in
  32  *   the documentation and/or other materials provided with the
  33  *   distribution.
  34  * * Neither the name of Intel Corporation nor the names of its
  35  *   contributors may be used to endorse or promote products derived
  36  *   from this software without specific prior written permission.
  37  *
  38  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  39  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  40  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  41  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  42  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  43  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  44  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  45  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  46  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  47  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  48  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  49  *
  50  * Intel SCIF driver.
  51  *
  52  */
  53 #ifndef SCIF_NODEQP
  54 #define SCIF_NODEQP
  55 
  56 #include "scif_rb.h"
  57 #include "scif_peer_bus.h"
  58 
  59 #define SCIF_INIT 1  /* First message sent to the peer node for discovery */
  60 #define SCIF_EXIT 2  /* Last message from the peer informing intent to exit */
  61 #define SCIF_EXIT_ACK 3 /* Response to SCIF_EXIT message */
  62 #define SCIF_NODE_ADD 4  /* Tell Online nodes a new node exits */
  63 #define SCIF_NODE_ADD_ACK 5  /* Confirm to mgmt node sequence is finished */
  64 #define SCIF_NODE_ADD_NACK 6 /* SCIF_NODE_ADD failed */
  65 #define SCIF_NODE_REMOVE 7 /* Request to deactivate a SCIF node */
  66 #define SCIF_NODE_REMOVE_ACK 8 /* Response to a SCIF_NODE_REMOVE message */
  67 #define SCIF_CNCT_REQ 9  /* Phys addr of Request connection to a port */
  68 #define SCIF_CNCT_GNT 10  /* Phys addr of new Grant connection request */
  69 #define SCIF_CNCT_GNTACK 11  /* Error type Reject a connection request */
  70 #define SCIF_CNCT_GNTNACK 12  /* Error type Reject a connection request */
  71 #define SCIF_CNCT_REJ 13  /* Error type Reject a connection request */
  72 #define SCIF_DISCNCT 14 /* Notify peer that connection is being terminated */
  73 #define SCIF_DISCNT_ACK 15 /* Notify peer that connection is being terminated */
  74 #define SCIF_CLIENT_SENT 16 /* Notify the peer that data has been written */
  75 #define SCIF_CLIENT_RCVD 17 /* Notify the peer that data has been read */
  76 #define SCIF_GET_NODE_INFO 18 /* Get current node mask from the mgmt node*/
  77 #define SCIF_REGISTER 19 /* Tell peer about a new registered window */
  78 #define SCIF_REGISTER_ACK 20 /* Notify peer about unregistration success */
  79 #define SCIF_REGISTER_NACK 21 /* Notify peer about registration success */
  80 #define SCIF_UNREGISTER 22 /* Tell peer about unregistering a window */
  81 #define SCIF_UNREGISTER_ACK 23 /* Notify peer about registration failure */
  82 #define SCIF_UNREGISTER_NACK 24 /* Notify peer about unregistration failure */
  83 #define SCIF_ALLOC_REQ 25 /* Request a mapped buffer */
  84 #define SCIF_ALLOC_GNT 26 /* Notify peer about allocation success */
  85 #define SCIF_ALLOC_REJ 27 /* Notify peer about allocation failure */
  86 #define SCIF_FREE_VIRT 28 /* Free previously allocated virtual memory */
  87 #define SCIF_MUNMAP 29 /* Acknowledgment for a SCIF_MMAP request */
  88 #define SCIF_MARK 30 /* SCIF Remote Fence Mark Request */
  89 #define SCIF_MARK_ACK 31 /* SCIF Remote Fence Mark Success */
  90 #define SCIF_MARK_NACK 32 /* SCIF Remote Fence Mark Failure */
  91 #define SCIF_WAIT 33 /* SCIF Remote Fence Wait Request */
  92 #define SCIF_WAIT_ACK 34 /* SCIF Remote Fence Wait Success */
  93 #define SCIF_WAIT_NACK 35 /* SCIF Remote Fence Wait Failure */
  94 #define SCIF_SIG_LOCAL 36 /* SCIF Remote Fence Local Signal Request */
  95 #define SCIF_SIG_REMOTE 37 /* SCIF Remote Fence Remote Signal Request */
  96 #define SCIF_SIG_ACK 38 /* SCIF Remote Fence Remote Signal Success */
  97 #define SCIF_SIG_NACK 39 /* SCIF Remote Fence Remote Signal Failure */
  98 #define SCIF_MAX_MSG SCIF_SIG_NACK
  99 
 100 /*
 101  * struct scifmsg - Node QP message format
 102  *
 103  * @src: Source information
 104  * @dst: Destination information
 105  * @uop: The message opcode
 106  * @payload: Unique payload format for each message
 107  */
 108 struct scifmsg {
 109         struct scif_port_id src;
 110         struct scif_port_id dst;
 111         u32 uop;
 112         u64 payload[4];
 113 } __packed;
 114 
 115 /*
 116  * struct scif_allocmsg - Used with SCIF_ALLOC_REQ to request
 117  * the remote note to allocate memory
 118  *
 119  * phys_addr: Physical address of the buffer
 120  * vaddr: Virtual address of the buffer
 121  * size: Size of the buffer
 122  * state: Current state
 123  * allocwq: wait queue for status
 124  */
 125 struct scif_allocmsg {
 126         dma_addr_t phys_addr;
 127         unsigned long vaddr;
 128         size_t size;
 129         enum scif_msg_state state;
 130         wait_queue_head_t allocwq;
 131 };
 132 
 133 /*
 134  * struct scif_qp - Node Queue Pair
 135  *
 136  * Interesting structure -- a little difficult because we can only
 137  * write across the PCIe, so any r/w pointer we need to read is
 138  * local. We only need to read the read pointer on the inbound_q
 139  * and read the write pointer in the outbound_q
 140  *
 141  * @magic: Magic value to ensure the peer sees the QP correctly
 142  * @outbound_q: The outbound ring buffer for sending messages
 143  * @inbound_q: The inbound ring buffer for receiving messages
 144  * @local_write: Local write index
 145  * @local_read: Local read index
 146  * @remote_qp: The remote queue pair
 147  * @local_buf: DMA address of local ring buffer
 148  * @local_qp: DMA address of the local queue pair data structure
 149  * @remote_buf: DMA address of remote ring buffer
 150  * @qp_state: QP state i.e. online or offline used for P2P
 151  * @send_lock: synchronize access to outbound queue
 152  * @recv_lock: Synchronize access to inbound queue
 153  */
 154 struct scif_qp {
 155         u64 magic;
 156 #define SCIFEP_MAGIC 0x5c1f000000005c1fULL
 157         struct scif_rb outbound_q;
 158         struct scif_rb inbound_q;
 159 
 160         u32 local_write __aligned(64);
 161         u32 local_read __aligned(64);
 162         struct scif_qp *remote_qp;
 163         dma_addr_t local_buf;
 164         dma_addr_t local_qp;
 165         dma_addr_t remote_buf;
 166         u32 qp_state;
 167 #define SCIF_QP_OFFLINE 0xdead
 168 #define SCIF_QP_ONLINE 0xc0de
 169         spinlock_t send_lock;
 170         spinlock_t recv_lock;
 171 };
 172 
 173 /*
 174  * struct scif_loopb_msg - An element in the loopback Node QP message list.
 175  *
 176  * @msg - The SCIF node QP message
 177  * @list - link in the list of messages
 178  */
 179 struct scif_loopb_msg {
 180         struct scifmsg msg;
 181         struct list_head list;
 182 };
 183 
 184 int scif_nodeqp_send(struct scif_dev *scifdev, struct scifmsg *msg);
 185 int _scif_nodeqp_send(struct scif_dev *scifdev, struct scifmsg *msg);
 186 void scif_nodeqp_intrhandler(struct scif_dev *scifdev, struct scif_qp *qp);
 187 int scif_loopb_msg_handler(struct scif_dev *scifdev, struct scif_qp *qp);
 188 int scif_setup_qp(struct scif_dev *scifdev);
 189 int scif_qp_response(phys_addr_t phys, struct scif_dev *dev);
 190 int scif_setup_qp_connect(struct scif_qp *qp, dma_addr_t *qp_offset,
 191                           int local_size, struct scif_dev *scifdev);
 192 int scif_setup_qp_accept(struct scif_qp *qp, dma_addr_t *qp_offset,
 193                          dma_addr_t phys, int local_size,
 194                          struct scif_dev *scifdev);
 195 int scif_setup_qp_connect_response(struct scif_dev *scifdev,
 196                                    struct scif_qp *qp, u64 payload);
 197 int scif_setup_loopback_qp(struct scif_dev *scifdev);
 198 int scif_destroy_loopback_qp(struct scif_dev *scifdev);
 199 void scif_poll_qp_state(struct work_struct *work);
 200 void scif_destroy_p2p(struct scif_dev *scifdev);
 201 void scif_send_exit(struct scif_dev *scifdev);
 202 static inline struct device *scif_get_peer_dev(struct scif_dev *scifdev)
 203 {
 204         struct scif_peer_dev *spdev;
 205         struct device *spdev_ret;
 206 
 207         rcu_read_lock();
 208         spdev = rcu_dereference(scifdev->spdev);
 209         if (spdev)
 210                 spdev_ret = get_device(&spdev->dev);
 211         else
 212                 spdev_ret = ERR_PTR(-ENODEV);
 213         rcu_read_unlock();
 214         return spdev_ret;
 215 }
 216 
 217 static inline void scif_put_peer_dev(struct device *dev)
 218 {
 219         put_device(dev);
 220 }
 221 #endif  /* SCIF_NODEQP */

/* [<][>][^][v][top][bottom][index][help] */