Merge remote-tracking branches 'spi/topic/drivers', 'spi/topic/dw', 'spi/topic/efm32...
[linux.git] / drivers / hv / connection.c
1 /*
2  *
3  * Copyright (c) 2009, Microsoft Corporation.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms and conditions of the GNU General Public License,
7  * version 2, as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
12  * more details.
13  *
14  * You should have received a copy of the GNU General Public License along with
15  * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
16  * Place - Suite 330, Boston, MA 02111-1307 USA.
17  *
18  * Authors:
19  *   Haiyang Zhang <haiyangz@microsoft.com>
20  *   Hank Janssen  <hjanssen@microsoft.com>
21  *
22  */
23 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
24
25 #include <linux/kernel.h>
26 #include <linux/sched.h>
27 #include <linux/wait.h>
28 #include <linux/delay.h>
29 #include <linux/mm.h>
30 #include <linux/slab.h>
31 #include <linux/vmalloc.h>
32 #include <linux/hyperv.h>
33 #include <linux/export.h>
34 #include <asm/hyperv.h>
35 #include "hyperv_vmbus.h"
36
37
38 struct vmbus_connection vmbus_connection = {
39         .conn_state             = DISCONNECTED,
40         .next_gpadl_handle      = ATOMIC_INIT(0xE1E10),
41 };
42
43 /*
44  * Negotiated protocol version with the host.
45  */
46 __u32 vmbus_proto_version;
47 EXPORT_SYMBOL_GPL(vmbus_proto_version);
48
49 static __u32 vmbus_get_next_version(__u32 current_version)
50 {
51         switch (current_version) {
52         case (VERSION_WIN7):
53                 return VERSION_WS2008;
54
55         case (VERSION_WIN8):
56                 return VERSION_WIN7;
57
58         case (VERSION_WS2008):
59         default:
60                 return VERSION_INVAL;
61         }
62 }
63
64 static int vmbus_negotiate_version(struct vmbus_channel_msginfo *msginfo,
65                                         __u32 version)
66 {
67         int ret = 0;
68         struct vmbus_channel_initiate_contact *msg;
69         unsigned long flags;
70
71         init_completion(&msginfo->waitevent);
72
73         msg = (struct vmbus_channel_initiate_contact *)msginfo->msg;
74
75         msg->header.msgtype = CHANNELMSG_INITIATE_CONTACT;
76         msg->vmbus_version_requested = version;
77         msg->interrupt_page = virt_to_phys(vmbus_connection.int_page);
78         msg->monitor_page1 = virt_to_phys(vmbus_connection.monitor_pages[0]);
79         msg->monitor_page2 = virt_to_phys(vmbus_connection.monitor_pages[1]);
80         if (version == VERSION_WIN8)
81                 msg->target_vcpu = hv_context.vp_index[smp_processor_id()];
82
83         /*
84          * Add to list before we send the request since we may
85          * receive the response before returning from this routine
86          */
87         spin_lock_irqsave(&vmbus_connection.channelmsg_lock, flags);
88         list_add_tail(&msginfo->msglistentry,
89                       &vmbus_connection.chn_msg_list);
90
91         spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags);
92
93         ret = vmbus_post_msg(msg,
94                                sizeof(struct vmbus_channel_initiate_contact));
95         if (ret != 0) {
96                 spin_lock_irqsave(&vmbus_connection.channelmsg_lock, flags);
97                 list_del(&msginfo->msglistentry);
98                 spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock,
99                                         flags);
100                 return ret;
101         }
102
103         /* Wait for the connection response */
104         wait_for_completion(&msginfo->waitevent);
105
106         spin_lock_irqsave(&vmbus_connection.channelmsg_lock, flags);
107         list_del(&msginfo->msglistentry);
108         spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags);
109
110         /* Check if successful */
111         if (msginfo->response.version_response.version_supported) {
112                 vmbus_connection.conn_state = CONNECTED;
113         } else {
114                 return -ECONNREFUSED;
115         }
116
117         return ret;
118 }
119
120 /*
121  * vmbus_connect - Sends a connect request on the partition service connection
122  */
123 int vmbus_connect(void)
124 {
125         int ret = 0;
126         struct vmbus_channel_msginfo *msginfo = NULL;
127         __u32 version;
128
129         /* Initialize the vmbus connection */
130         vmbus_connection.conn_state = CONNECTING;
131         vmbus_connection.work_queue = create_workqueue("hv_vmbus_con");
132         if (!vmbus_connection.work_queue) {
133                 ret = -ENOMEM;
134                 goto cleanup;
135         }
136
137         INIT_LIST_HEAD(&vmbus_connection.chn_msg_list);
138         spin_lock_init(&vmbus_connection.channelmsg_lock);
139
140         INIT_LIST_HEAD(&vmbus_connection.chn_list);
141         spin_lock_init(&vmbus_connection.channel_lock);
142
143         /*
144          * Setup the vmbus event connection for channel interrupt
145          * abstraction stuff
146          */
147         vmbus_connection.int_page =
148         (void *)__get_free_pages(GFP_KERNEL|__GFP_ZERO, 0);
149         if (vmbus_connection.int_page == NULL) {
150                 ret = -ENOMEM;
151                 goto cleanup;
152         }
153
154         vmbus_connection.recv_int_page = vmbus_connection.int_page;
155         vmbus_connection.send_int_page =
156                 (void *)((unsigned long)vmbus_connection.int_page +
157                         (PAGE_SIZE >> 1));
158
159         /*
160          * Setup the monitor notification facility. The 1st page for
161          * parent->child and the 2nd page for child->parent
162          */
163         vmbus_connection.monitor_pages[0] = (void *)__get_free_pages((GFP_KERNEL|__GFP_ZERO), 0);
164         vmbus_connection.monitor_pages[1] = (void *)__get_free_pages((GFP_KERNEL|__GFP_ZERO), 0);
165         if ((vmbus_connection.monitor_pages[0] == NULL) ||
166             (vmbus_connection.monitor_pages[1] == NULL)) {
167                 ret = -ENOMEM;
168                 goto cleanup;
169         }
170
171         msginfo = kzalloc(sizeof(*msginfo) +
172                           sizeof(struct vmbus_channel_initiate_contact),
173                           GFP_KERNEL);
174         if (msginfo == NULL) {
175                 ret = -ENOMEM;
176                 goto cleanup;
177         }
178
179         /*
180          * Negotiate a compatible VMBUS version number with the
181          * host. We start with the highest number we can support
182          * and work our way down until we negotiate a compatible
183          * version.
184          */
185
186         version = VERSION_CURRENT;
187
188         do {
189                 ret = vmbus_negotiate_version(msginfo, version);
190                 if (ret == -ETIMEDOUT)
191                         goto cleanup;
192
193                 if (vmbus_connection.conn_state == CONNECTED)
194                         break;
195
196                 version = vmbus_get_next_version(version);
197         } while (version != VERSION_INVAL);
198
199         if (version == VERSION_INVAL)
200                 goto cleanup;
201
202         vmbus_proto_version = version;
203         pr_info("Hyper-V Host Build:%d-%d.%d-%d-%d.%d; Vmbus version:%d.%d\n",
204                     host_info_eax, host_info_ebx >> 16,
205                     host_info_ebx & 0xFFFF, host_info_ecx,
206                     host_info_edx >> 24, host_info_edx & 0xFFFFFF,
207                     version >> 16, version & 0xFFFF);
208
209         kfree(msginfo);
210         return 0;
211
212 cleanup:
213         pr_err("Unable to connect to host\n");
214         vmbus_connection.conn_state = DISCONNECTED;
215
216         if (vmbus_connection.work_queue)
217                 destroy_workqueue(vmbus_connection.work_queue);
218
219         if (vmbus_connection.int_page) {
220                 free_pages((unsigned long)vmbus_connection.int_page, 0);
221                 vmbus_connection.int_page = NULL;
222         }
223
224         free_pages((unsigned long)vmbus_connection.monitor_pages[0], 1);
225         free_pages((unsigned long)vmbus_connection.monitor_pages[1], 1);
226         vmbus_connection.monitor_pages[0] = NULL;
227         vmbus_connection.monitor_pages[1] = NULL;
228
229         kfree(msginfo);
230
231         return ret;
232 }
233
234
235 /*
236  * relid2channel - Get the channel object given its
237  * child relative id (ie channel id)
238  */
239 struct vmbus_channel *relid2channel(u32 relid)
240 {
241         struct vmbus_channel *channel;
242         struct vmbus_channel *found_channel  = NULL;
243         unsigned long flags;
244         struct list_head *cur, *tmp;
245         struct vmbus_channel *cur_sc;
246
247         spin_lock_irqsave(&vmbus_connection.channel_lock, flags);
248         list_for_each_entry(channel, &vmbus_connection.chn_list, listentry) {
249                 if (channel->offermsg.child_relid == relid) {
250                         found_channel = channel;
251                         break;
252                 } else if (!list_empty(&channel->sc_list)) {
253                         /*
254                          * Deal with sub-channels.
255                          */
256                         list_for_each_safe(cur, tmp, &channel->sc_list) {
257                                 cur_sc = list_entry(cur, struct vmbus_channel,
258                                                         sc_list);
259                                 if (cur_sc->offermsg.child_relid == relid) {
260                                         found_channel = cur_sc;
261                                         break;
262                                 }
263                         }
264                 }
265         }
266         spin_unlock_irqrestore(&vmbus_connection.channel_lock, flags);
267
268         return found_channel;
269 }
270
271 /*
272  * process_chn_event - Process a channel event notification
273  */
274 static void process_chn_event(u32 relid)
275 {
276         struct vmbus_channel *channel;
277         unsigned long flags;
278         void *arg;
279         bool read_state;
280         u32 bytes_to_read;
281
282         /*
283          * Find the channel based on this relid and invokes the
284          * channel callback to process the event
285          */
286         channel = relid2channel(relid);
287
288         if (!channel) {
289                 pr_err("channel not found for relid - %u\n", relid);
290                 return;
291         }
292
293         /*
294          * A channel once created is persistent even when there
295          * is no driver handling the device. An unloading driver
296          * sets the onchannel_callback to NULL under the
297          * protection of the channel inbound_lock. Thus, checking
298          * and invoking the driver specific callback takes care of
299          * orderly unloading of the driver.
300          */
301
302         spin_lock_irqsave(&channel->inbound_lock, flags);
303         if (channel->onchannel_callback != NULL) {
304                 arg = channel->channel_callback_context;
305                 read_state = channel->batched_reading;
306                 /*
307                  * This callback reads the messages sent by the host.
308                  * We can optimize host to guest signaling by ensuring:
309                  * 1. While reading the channel, we disable interrupts from
310                  *    host.
311                  * 2. Ensure that we process all posted messages from the host
312                  *    before returning from this callback.
313                  * 3. Once we return, enable signaling from the host. Once this
314                  *    state is set we check to see if additional packets are
315                  *    available to read. In this case we repeat the process.
316                  */
317
318                 do {
319                         hv_begin_read(&channel->inbound);
320                         channel->onchannel_callback(arg);
321                         bytes_to_read = hv_end_read(&channel->inbound);
322                 } while (read_state && (bytes_to_read != 0));
323         } else {
324                 pr_err("no channel callback for relid - %u\n", relid);
325         }
326
327         spin_unlock_irqrestore(&channel->inbound_lock, flags);
328 }
329
330 /*
331  * vmbus_on_event - Handler for events
332  */
333 void vmbus_on_event(unsigned long data)
334 {
335         u32 dword;
336         u32 maxdword;
337         int bit;
338         u32 relid;
339         u32 *recv_int_page = NULL;
340         void *page_addr;
341         int cpu = smp_processor_id();
342         union hv_synic_event_flags *event;
343
344         if ((vmbus_proto_version == VERSION_WS2008) ||
345                 (vmbus_proto_version == VERSION_WIN7)) {
346                 maxdword = MAX_NUM_CHANNELS_SUPPORTED >> 5;
347                 recv_int_page = vmbus_connection.recv_int_page;
348         } else {
349                 /*
350                  * When the host is win8 and beyond, the event page
351                  * can be directly checked to get the id of the channel
352                  * that has the interrupt pending.
353                  */
354                 maxdword = HV_EVENT_FLAGS_DWORD_COUNT;
355                 page_addr = hv_context.synic_event_page[cpu];
356                 event = (union hv_synic_event_flags *)page_addr +
357                                                  VMBUS_MESSAGE_SINT;
358                 recv_int_page = event->flags32;
359         }
360
361
362
363         /* Check events */
364         if (!recv_int_page)
365                 return;
366         for (dword = 0; dword < maxdword; dword++) {
367                 if (!recv_int_page[dword])
368                         continue;
369                 for (bit = 0; bit < 32; bit++) {
370                         if (sync_test_and_clear_bit(bit,
371                                 (unsigned long *)&recv_int_page[dword])) {
372                                 relid = (dword << 5) + bit;
373
374                                 if (relid == 0)
375                                         /*
376                                          * Special case - vmbus
377                                          * channel protocol msg
378                                          */
379                                         continue;
380
381                                 process_chn_event(relid);
382                         }
383                 }
384         }
385 }
386
387 /*
388  * vmbus_post_msg - Send a msg on the vmbus's message connection
389  */
390 int vmbus_post_msg(void *buffer, size_t buflen)
391 {
392         union hv_connection_id conn_id;
393         int ret = 0;
394         int retries = 0;
395
396         conn_id.asu32 = 0;
397         conn_id.u.id = VMBUS_MESSAGE_CONNECTION_ID;
398
399         /*
400          * hv_post_message() can have transient failures because of
401          * insufficient resources. Retry the operation a couple of
402          * times before giving up.
403          */
404         while (retries < 3) {
405                 ret =  hv_post_message(conn_id, 1, buffer, buflen);
406                 if (ret != HV_STATUS_INSUFFICIENT_BUFFERS)
407                         return ret;
408                 retries++;
409                 msleep(100);
410         }
411         return ret;
412 }
413
414 /*
415  * vmbus_set_event - Send an event notification to the parent
416  */
417 int vmbus_set_event(struct vmbus_channel *channel)
418 {
419         u32 child_relid = channel->offermsg.child_relid;
420
421         if (!channel->is_dedicated_interrupt) {
422                 /* Each u32 represents 32 channels */
423                 sync_set_bit(child_relid & 31,
424                         (unsigned long *)vmbus_connection.send_int_page +
425                         (child_relid >> 5));
426         }
427
428         return hv_signal_event(channel->sig_event);
429 }