diff options
author | Adrian Dudau <adrian.dudau@enea.com> | 2014-06-26 13:48:23 +0200 |
---|---|---|
committer | Adrian Dudau <adrian.dudau@enea.com> | 2014-06-26 13:48:23 +0200 |
commit | 1b6242fc583a6b871304fb995af6dc211b58f69b (patch) | |
tree | b5d434d90dedae24792906aa304897c23a134386 /recipes-networking/dpdk/files/rte_kni_module_1_6.patch.x | |
download | meta-ip-1b6242fc583a6b871304fb995af6dc211b58f69b.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.x | 206 |
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 | ||