summaryrefslogtreecommitdiffstats
path: root/recipes-networking/dpdk/files/rte_kni_module_1_6.patch.x
diff options
context:
space:
mode:
authorAdrian Dudau <adrian.dudau@enea.com>2014-06-26 13:48:23 +0200
committerAdrian Dudau <adrian.dudau@enea.com>2014-06-26 13:48:23 +0200
commit1b6242fc583a6b871304fb995af6dc211b58f69b (patch)
treeb5d434d90dedae24792906aa304897c23a134386 /recipes-networking/dpdk/files/rte_kni_module_1_6.patch.x
downloadmeta-ip-daisy-enea.tar.gz
initial commit for Enea Linux 4.0daisy-enea
Migrated from the internal git server on the daisy-enea branch Signed-off-by: Adrian Dudau <adrian.dudau@enea.com>
Diffstat (limited to 'recipes-networking/dpdk/files/rte_kni_module_1_6.patch.x')
-rw-r--r--recipes-networking/dpdk/files/rte_kni_module_1_6.patch.x206
1 files changed, 206 insertions, 0 deletions
diff --git a/recipes-networking/dpdk/files/rte_kni_module_1_6.patch.x b/recipes-networking/dpdk/files/rte_kni_module_1_6.patch.x
new file mode 100644
index 0000000..48b1849
--- /dev/null
+++ b/recipes-networking/dpdk/files/rte_kni_module_1_6.patch.x
@@ -0,0 +1,206 @@
1--- a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h
2+++ b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h
3@@ -101,6 +101,7 @@ struct rte_kni_device_info {
4
5 /* mbuf size */
6 unsigned mbuf_size;
7+ uint64_t mempool_size;
8 };
9
10 #define KNI_DEVICE "kni"
11--- a/lib/librte_eal/linuxapp/kni/kni_misc.c
12+++ b/lib/librte_eal/linuxapp/kni/kni_misc.c
13@@ -21,6 +21,19 @@ MODULE_DESCRIPTION("Kernel Module for managing kni devices");
14
15 #define KNI_MAX_DEVICES 32
16
17+#define PCI_VENDOR_ID_IVSHMEM 0x1AF4
18+#define PCI_DEVICE_ID_IVSHMEM 0x1110
19+#define BAR2 2
20+#define IVSHMEM_MAGIC 0x0BADC0DE
21+#define IVSHMEM_METADATA_SIZE 0x4000
22+#define KNI_FIFO_COUNT_MAX 1024
23+#define KNI_FIFO_SIZE ((KNI_FIFO_COUNT_MAX) * sizeof(void *) + \
24+ sizeof(struct rte_kni_fifo))
25+
26+#define get_virt_addr(x) get_virt_addr_by_size(x,KNI_FIFO_SIZE)
27+#define get_virt_addr_by_size(x,s) (has_ivshmem_metadata ? \
28+ ioremap(x, s) : phys_to_virt(x))
29+
30 extern void kni_net_rx(struct kni_dev *kni);
31 extern void kni_net_init(struct net_device *dev);
32 extern void kni_net_config_lo_mode(char *lo_str);
33@@ -47,6 +60,8 @@ static int kni_thread_single(void *unused);
34 /* KNI processing for multiple kernel thread mode */
35 static int kni_thread_multiple(void *param);
36
37+static int kni_has_ivshmem_metadata(void);
38+
39 static struct file_operations kni_fops = {
40 .owner = THIS_MODULE,
41 .open = kni_open,
42@@ -72,6 +87,7 @@ static unsigned multiple_kthread_on = 0;
43
44 static volatile unsigned long device_in_use; /* device in use flag */
45 static struct task_struct *kni_kthread;
46+static int has_ivshmem_metadata = 0;
47
48 /* kni list lock */
49 static DECLARE_RWSEM(kni_list_lock);
50@@ -100,6 +116,10 @@ kni_init(void)
51 /* Configure the lo mode according to the input parameter */
52 kni_net_config_lo_mode(lo_mode);
53
54+ has_ivshmem_metadata = kni_has_ivshmem_metadata();
55+ KNI_PRINT("IVSHMEM metadata %s \n",
56+ has_ivshmem_metadata ? "found" : "NOT found");
57+
58 KNI_PRINT("######## DPDK kni module loaded ########\n");
59
60 return 0;
61@@ -178,6 +198,19 @@ kni_release(struct inode *inode, struct file *file)
62 #endif
63 kni_dev_remove(dev);
64 list_del(&dev->list);
65+
66+ if (has_ivshmem_metadata) {
67+ KNI_PRINT("iounmapping KNI FIFOs for device '%s'\n", dev->name);
68+ iounmap(dev->tx_q);
69+ iounmap(dev->rx_q);
70+ iounmap(dev->alloc_q);
71+ iounmap(dev->free_q);
72+ iounmap(dev->req_q);
73+ iounmap(dev->resp_q);
74+ iounmap(dev->sync_kva);
75+ iounmap(dev->mbuf_kva);
76+ }
77+
78 }
79 up_write(&kni_list_lock);
80
81@@ -339,17 +372,17 @@ kni_ioctl_create(unsigned int ioctl_num, unsigned long ioctl_param)
82 strncpy(kni->name, dev_info.name, RTE_KNI_NAMESIZE);
83
84 /* Translate user space info into kernel space info */
85- kni->tx_q = phys_to_virt(dev_info.tx_phys);
86- kni->rx_q = phys_to_virt(dev_info.rx_phys);
87- kni->alloc_q = phys_to_virt(dev_info.alloc_phys);
88- kni->free_q = phys_to_virt(dev_info.free_phys);
89+ kni->tx_q = get_virt_addr(dev_info.tx_phys);
90+ kni->rx_q = get_virt_addr(dev_info.rx_phys);
91+ kni->alloc_q = get_virt_addr(dev_info.alloc_phys);
92+ kni->free_q = get_virt_addr(dev_info.free_phys);
93
94- kni->req_q = phys_to_virt(dev_info.req_phys);
95- kni->resp_q = phys_to_virt(dev_info.resp_phys);
96+ kni->req_q = get_virt_addr(dev_info.req_phys);
97+ kni->resp_q = get_virt_addr(dev_info.resp_phys);
98 kni->sync_va = dev_info.sync_va;
99- kni->sync_kva = phys_to_virt(dev_info.sync_phys);
100+ kni->sync_kva = get_virt_addr(dev_info.sync_phys);
101
102- kni->mbuf_kva = phys_to_virt(dev_info.mbuf_phys);
103+ kni->mbuf_kva = get_virt_addr_by_size(dev_info.mbuf_phys, dev_info.mempool_size);
104 kni->mbuf_va = dev_info.mbuf_va;
105
106 #ifdef RTE_KNI_VHOST
107@@ -552,6 +585,40 @@ kni_compat_ioctl(struct inode *inode,
108 return -EINVAL;
109 }
110
111+static int
112+kni_has_ivshmem_metadata(void)
113+{
114+ struct pci_dev *ivshm_dev = NULL;
115+ phys_addr_t ivshmem_metadata_addr = 0;
116+ void *ivshmem_metadata = NULL;
117+ int ivshmem_magic_number;
118+
119+ ivshm_dev = pci_get_device(PCI_VENDOR_ID_IVSHMEM, PCI_DEVICE_ID_IVSHMEM,
120+ NULL);
121+
122+ if (ivshm_dev == NULL) {
123+ printk("No IVSHMEM device found!\n");
124+ return 0;
125+ }
126+
127+ /* IVSHMEM metadata will be received at the very last 4K of the BAR2 */
128+ ivshmem_metadata_addr = (pci_resource_end(ivshm_dev, BAR2)
129+ - IVSHMEM_METADATA_SIZE) + 1;
130+
131+ ivshmem_metadata = ioremap(ivshmem_metadata_addr, IVSHMEM_METADATA_SIZE);
132+ if (ivshmem_metadata == NULL) {
133+ printk("Could not ioremap IVSHMEM metadata\n");
134+ return 0;
135+ }
136+
137+ /* The first sizeof(int) bytes contain the magic number that tells us
138+ * ivshmem_metadata is coming from the host */
139+ ivshmem_magic_number = ((int*) ivshmem_metadata)[0];
140+ iounmap(ivshmem_metadata);
141+ return !!(ivshmem_magic_number == IVSHMEM_MAGIC);
142+}
143+
144+
145 module_init(kni_init);
146 module_exit(kni_exit);
147
148--- a/lib/librte_eal/linuxapp/kni/kni_net.c
149+++ b/lib/librte_eal/linuxapp/kni/kni_net.c
150@@ -50,15 +50,16 @@ kni_net_open(struct net_device *dev)
151 struct rte_kni_request req;
152 struct kni_dev *kni = netdev_priv(dev);
153
154- if (kni->lad_dev)
155- memcpy(dev->dev_addr, kni->lad_dev->dev_addr, ETH_ALEN);
156- else
157- /*
158- * Generate random mac address. eth_random_addr() is the newer
159- * version of generating mac address in linux kernel.
160- */
161- random_ether_addr(dev->dev_addr);
162-
163+ if (!is_valid_ether_addr(dev->dev_addr)) {
164+ if (kni->lad_dev)
165+ memcpy(dev->dev_addr, kni->lad_dev->dev_addr, ETH_ALEN);
166+ else
167+ /*
168+ * Generate random mac address. eth_random_addr() is the newer
169+ * version of generating mac address in linux kernel.
170+ */
171+ random_ether_addr(dev->dev_addr);
172+ }
173 netif_start_queue(dev);
174
175 memset(&req, 0, sizeof(req));
176@@ -459,6 +460,22 @@ kni_net_tx_timeout (struct net_device *dev)
177 return;
178 }
179
180+static int
181+kni_set_mac_address(struct net_device *dev, void *addr_ptr)
182+{
183+ struct sockaddr *addr = addr_ptr;
184+
185+ if (netif_running(dev))
186+ return -EBUSY;
187+
188+ if (!is_valid_ether_addr(addr->sa_data))
189+ return -EADDRNOTAVAIL;
190+
191+ memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
192+
193+ return 0;
194+}
195+
196 /*
197 * Ioctl commands
198 */
199@@ -608,6 +625,7 @@ static const struct net_device_ops kni_net_netdev_ops = {
200 .ndo_do_ioctl = kni_net_ioctl,
201 .ndo_get_stats = kni_net_stats,
202 .ndo_tx_timeout = kni_net_tx_timeout,
203+ .ndo_set_mac_address = kni_set_mac_address,
204 };
205
206 void