aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/misc/mic
diff options
context:
space:
mode:
authorSudeep Dutt <sudeep.dutt@intel.com>2016-02-08 18:48:14 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2016-02-09 20:32:37 -0500
commit26909e26f4b51a9f7f8838eee775a65563388c0d (patch)
tree2efd041a61f085b84be6baf7082a1ba1a4964738 /drivers/misc/mic
parenta19ddd6fd260d6b92de38acb1b87940045697627 (diff)
misc: mic: Add data structures for the VOP driver
This patch adds VOP driver data structures used in subsequent patches. These data structures are refactored from similar data structures used in the virtio parts of previous MIC host and card drivers. Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com> Signed-off-by: Sudeep Dutt <sudeep.dutt@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/misc/mic')
-rw-r--r--drivers/misc/mic/vop/vop_main.h170
1 files changed, 170 insertions, 0 deletions
diff --git a/drivers/misc/mic/vop/vop_main.h b/drivers/misc/mic/vop/vop_main.h
new file mode 100644
index 000000000000..ba47ec7a6386
--- /dev/null
+++ b/drivers/misc/mic/vop/vop_main.h
@@ -0,0 +1,170 @@
1/*
2 * Intel MIC Platform Software Stack (MPSS)
3 *
4 * Copyright(c) 2016 Intel Corporation.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License, version 2, as
8 * published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
14 *
15 * The full GNU General Public License is included in this distribution in
16 * the file called "COPYING".
17 *
18 * Intel Virtio Over PCIe (VOP) driver.
19 *
20 */
21#ifndef _VOP_MAIN_H_
22#define _VOP_MAIN_H_
23
24#include <linux/vringh.h>
25#include <linux/virtio_config.h>
26#include <linux/virtio.h>
27#include <linux/miscdevice.h>
28
29#include <linux/mic_common.h>
30#include "../common/mic_dev.h"
31
32#include "../bus/vop_bus.h"
33
34/*
35 * Note on endianness.
36 * 1. Host can be both BE or LE
37 * 2. Guest/card is LE. Host uses le_to_cpu to access desc/avail
38 * rings and ioreadXX/iowriteXX to access used ring.
39 * 3. Device page exposed by host to guest contains LE values. Guest
40 * accesses these using ioreadXX/iowriteXX etc. This way in general we
41 * obey the virtio spec according to which guest works with native
42 * endianness and host is aware of guest endianness and does all
43 * required endianness conversion.
44 * 4. Data provided from user space to guest (in ADD_DEVICE and
45 * CONFIG_CHANGE ioctl's) is not interpreted by the driver and should be
46 * in guest endianness.
47 */
48
49/*
50 * vop_info - Allocated per invocation of VOP probe
51 *
52 * @vpdev: VOP device
53 * @hotplug_work: Handle virtio device creation, deletion and configuration
54 * @cookie: Cookie received upon requesting a virtio configuration interrupt
55 * @h2c_config_db: The doorbell used by the peer to indicate a config change
56 * @vdev_list: List of "active" virtio devices injected in the peer node
57 * @vop_mutex: Synchronize access to the device page as well as serialize
58 * creation/deletion of virtio devices on the peer node
59 * @dp: Peer device page information
60 * @dbg: Debugfs entry
61 * @dma_ch: The DMA channel used by this transport for data transfers.
62 * @name: Name for this transport used in misc device creation.
63 * @miscdev: The misc device registered.
64 */
65struct vop_info {
66 struct vop_device *vpdev;
67 struct work_struct hotplug_work;
68 struct mic_irq *cookie;
69 int h2c_config_db;
70 struct list_head vdev_list;
71 struct mutex vop_mutex;
72 void __iomem *dp;
73 struct dentry *dbg;
74 struct dma_chan *dma_ch;
75 char name[16];
76 struct miscdevice miscdev;
77};
78
79/**
80 * struct vop_vringh - Virtio ring host information.
81 *
82 * @vring: The VOP vring used for setting up user space mappings.
83 * @vrh: The host VRINGH used for accessing the card vrings.
84 * @riov: The VRINGH read kernel IOV.
85 * @wiov: The VRINGH write kernel IOV.
86 * @head: The VRINGH head index address passed to vringh_getdesc_kern(..).
87 * @vr_mutex: Mutex for synchronizing access to the VRING.
88 * @buf: Temporary kernel buffer used to copy in/out data
89 * from/to the card via DMA.
90 * @buf_da: dma address of buf.
91 * @vdev: Back pointer to VOP virtio device for vringh_notify(..).
92 */
93struct vop_vringh {
94 struct mic_vring vring;
95 struct vringh vrh;
96 struct vringh_kiov riov;
97 struct vringh_kiov wiov;
98 u16 head;
99 struct mutex vr_mutex;
100 void *buf;
101 dma_addr_t buf_da;
102 struct vop_vdev *vdev;
103};
104
105/**
106 * struct vop_vdev - Host information for a card Virtio device.
107 *
108 * @virtio_id - Virtio device id.
109 * @waitq - Waitqueue to allow ring3 apps to poll.
110 * @vpdev - pointer to VOP bus device.
111 * @poll_wake - Used for waking up threads blocked in poll.
112 * @out_bytes - Debug stats for number of bytes copied from host to card.
113 * @in_bytes - Debug stats for number of bytes copied from card to host.
114 * @out_bytes_dma - Debug stats for number of bytes copied from host to card
115 * using DMA.
116 * @in_bytes_dma - Debug stats for number of bytes copied from card to host
117 * using DMA.
118 * @tx_len_unaligned - Debug stats for number of bytes copied to the card where
119 * the transfer length did not have the required DMA alignment.
120 * @tx_dst_unaligned - Debug stats for number of bytes copied where the
121 * destination address on the card did not have the required DMA alignment.
122 * @vvr - Store per VRING data structures.
123 * @virtio_bh_work - Work struct used to schedule virtio bottom half handling.
124 * @dd - Virtio device descriptor.
125 * @dc - Virtio device control fields.
126 * @list - List of Virtio devices.
127 * @virtio_db - The doorbell used by the card to interrupt the host.
128 * @virtio_cookie - The cookie returned while requesting interrupts.
129 * @vi: Transport information.
130 * @vdev_mutex: Mutex synchronizing virtio device injection,
131 * removal and data transfers.
132 * @destroy: Track if a virtio device is being destroyed.
133 * @deleted: The virtio device has been deleted.
134 */
135struct vop_vdev {
136 int virtio_id;
137 wait_queue_head_t waitq;
138 struct vop_device *vpdev;
139 int poll_wake;
140 unsigned long out_bytes;
141 unsigned long in_bytes;
142 unsigned long out_bytes_dma;
143 unsigned long in_bytes_dma;
144 unsigned long tx_len_unaligned;
145 unsigned long tx_dst_unaligned;
146 unsigned long rx_dst_unaligned;
147 struct vop_vringh vvr[MIC_MAX_VRINGS];
148 struct work_struct virtio_bh_work;
149 struct mic_device_desc *dd;
150 struct mic_device_ctrl *dc;
151 struct list_head list;
152 int virtio_db;
153 struct mic_irq *virtio_cookie;
154 struct vop_info *vi;
155 struct mutex vdev_mutex;
156 struct completion destroy;
157 bool deleted;
158};
159
160/* Helper API to check if a virtio device is running */
161static inline bool vop_vdevup(struct vop_vdev *vdev)
162{
163 return !!vdev->dd->status;
164}
165
166void vop_init_debugfs(struct vop_info *vi);
167void vop_exit_debugfs(struct vop_info *vi);
168int vop_host_init(struct vop_info *vi);
169void vop_host_uninit(struct vop_info *vi);
170#endif