]> git.karo-electronics.de Git - mv-sheeva.git/blob - drivers/staging/hv/vmbus_drv.c
Staging: hv: remove vmbus_on_event_dpc()
[mv-sheeva.git] / drivers / staging / hv / vmbus_drv.c
1 /*
2  * Copyright (c) 2009, Microsoft Corporation.
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms and conditions of the GNU General Public License,
6  * version 2, as published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope it will be useful, but WITHOUT
9  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
11  * more details.
12  *
13  * You should have received a copy of the GNU General Public License along with
14  * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
15  * Place - Suite 330, Boston, MA 02111-1307 USA.
16  *
17  * Authors:
18  *   Haiyang Zhang <haiyangz@microsoft.com>
19  *   Hank Janssen  <hjanssen@microsoft.com>
20  */
21 #include <linux/init.h>
22 #include <linux/module.h>
23 #include <linux/device.h>
24 #include <linux/irq.h>
25 #include <linux/interrupt.h>
26 #include <linux/sysctl.h>
27 #include <linux/pci.h>
28 #include <linux/dmi.h>
29 #include <linux/slab.h>
30 #include <linux/completion.h>
31 #include "version_info.h"
32 #include "osd.h"
33 #include "logging.h"
34 #include "vmbus.h"
35 #include "channel.h"
36 #include "vmbus_private.h"
37
38
39 /* FIXME! We need to do this dynamically for PIC and APIC system */
40 #define VMBUS_IRQ               0x5
41 #define VMBUS_IRQ_VECTOR        IRQ5_VECTOR
42
43 /* Main vmbus driver data structure */
44 struct vmbus_driver_context {
45         /* !! These must be the first 2 fields !! */
46         /* FIXME, this is a bug */
47         /* The driver field is not used in here. Instead, the bus field is */
48         /* used to represent the driver */
49         struct driver_context drv_ctx;
50         struct hv_driver drv_obj;
51
52         struct bus_type bus;
53         struct tasklet_struct msg_dpc;
54         struct tasklet_struct event_dpc;
55
56         /* The bus root device */
57         struct vm_device device_ctx;
58 };
59
60 static int vmbus_match(struct device *device, struct device_driver *driver);
61 static int vmbus_probe(struct device *device);
62 static int vmbus_remove(struct device *device);
63 static void vmbus_shutdown(struct device *device);
64 static int vmbus_uevent(struct device *device, struct kobj_uevent_env *env);
65 static void vmbus_msg_dpc(unsigned long data);
66 static void vmbus_event_dpc(unsigned long data);
67
68 static irqreturn_t vmbus_isr(int irq, void *dev_id);
69
70 static void vmbus_device_release(struct device *device);
71 static void vmbus_bus_release(struct device *device);
72
73 static ssize_t vmbus_show_device_attr(struct device *dev,
74                                       struct device_attribute *dev_attr,
75                                       char *buf);
76
77
78 unsigned int vmbus_loglevel = (ALL_MODULES << 16 | INFO_LVL);
79 EXPORT_SYMBOL(vmbus_loglevel);
80         /* (ALL_MODULES << 16 | DEBUG_LVL_ENTEREXIT); */
81         /* (((VMBUS | VMBUS_DRV)<<16) | DEBUG_LVL_ENTEREXIT); */
82
83 static int vmbus_irq = VMBUS_IRQ;
84
85 /* Set up per device attributes in /sys/bus/vmbus/devices/<bus device> */
86 static struct device_attribute vmbus_device_attrs[] = {
87         __ATTR(id, S_IRUGO, vmbus_show_device_attr, NULL),
88         __ATTR(state, S_IRUGO, vmbus_show_device_attr, NULL),
89         __ATTR(class_id, S_IRUGO, vmbus_show_device_attr, NULL),
90         __ATTR(device_id, S_IRUGO, vmbus_show_device_attr, NULL),
91         __ATTR(monitor_id, S_IRUGO, vmbus_show_device_attr, NULL),
92
93         __ATTR(server_monitor_pending, S_IRUGO, vmbus_show_device_attr, NULL),
94         __ATTR(server_monitor_latency, S_IRUGO, vmbus_show_device_attr, NULL),
95         __ATTR(server_monitor_conn_id, S_IRUGO, vmbus_show_device_attr, NULL),
96
97         __ATTR(client_monitor_pending, S_IRUGO, vmbus_show_device_attr, NULL),
98         __ATTR(client_monitor_latency, S_IRUGO, vmbus_show_device_attr, NULL),
99         __ATTR(client_monitor_conn_id, S_IRUGO, vmbus_show_device_attr, NULL),
100
101         __ATTR(out_intr_mask, S_IRUGO, vmbus_show_device_attr, NULL),
102         __ATTR(out_read_index, S_IRUGO, vmbus_show_device_attr, NULL),
103         __ATTR(out_write_index, S_IRUGO, vmbus_show_device_attr, NULL),
104         __ATTR(out_read_bytes_avail, S_IRUGO, vmbus_show_device_attr, NULL),
105         __ATTR(out_write_bytes_avail, S_IRUGO, vmbus_show_device_attr, NULL),
106
107         __ATTR(in_intr_mask, S_IRUGO, vmbus_show_device_attr, NULL),
108         __ATTR(in_read_index, S_IRUGO, vmbus_show_device_attr, NULL),
109         __ATTR(in_write_index, S_IRUGO, vmbus_show_device_attr, NULL),
110         __ATTR(in_read_bytes_avail, S_IRUGO, vmbus_show_device_attr, NULL),
111         __ATTR(in_write_bytes_avail, S_IRUGO, vmbus_show_device_attr, NULL),
112         __ATTR_NULL
113 };
114
115 /* The one and only one */
116 static struct vmbus_driver_context g_vmbus_drv = {
117         .bus.name =             "vmbus",
118         .bus.match =            vmbus_match,
119         .bus.shutdown =         vmbus_shutdown,
120         .bus.remove =           vmbus_remove,
121         .bus.probe =            vmbus_probe,
122         .bus.uevent =           vmbus_uevent,
123         .bus.dev_attrs =        vmbus_device_attrs,
124 };
125
126 static const char *gDriverName = "hyperv";
127
128 /*
129  * Windows vmbus does not defined this.
130  * We defined this to be consistent with other devices
131  */
132 /* {c5295816-f63a-4d5f-8d1a-4daf999ca185} */
133 static const struct hv_guid gVmbusDeviceType = {
134         .data = {
135                 0x16, 0x58, 0x29, 0xc5, 0x3a, 0xf6, 0x5f, 0x4d,
136                 0x8d, 0x1a, 0x4d, 0xaf, 0x99, 0x9c, 0xa1, 0x85
137         }
138 };
139
140 /* {ac3760fc-9adf-40aa-9427-a70ed6de95c5} */
141 static const struct hv_guid gVmbusDeviceId = {
142         .data = {
143                 0xfc, 0x60, 0x37, 0xac, 0xdf, 0x9a, 0xaa, 0x40,
144                 0x94, 0x27, 0xa7, 0x0e, 0xd6, 0xde, 0x95, 0xc5
145         }
146 };
147
148 static struct hv_device *gDevice; /* vmbus root device */
149
150 /*
151  * VmbusChildDeviceAdd - Registers the child device with the vmbus
152  */
153 int VmbusChildDeviceAdd(struct hv_device *ChildDevice)
154 {
155         return vmbus_child_device_register(gDevice, ChildDevice);
156 }
157
158 /*
159  * VmbusOnDeviceAdd - Callback when the root bus device is added
160  */
161 static int VmbusOnDeviceAdd(struct hv_device *dev, void *AdditionalInfo)
162 {
163         u32 *irqvector = AdditionalInfo;
164         int ret;
165
166         gDevice = dev;
167
168         memcpy(&gDevice->deviceType, &gVmbusDeviceType, sizeof(struct hv_guid));
169         memcpy(&gDevice->deviceInstance, &gVmbusDeviceId,
170                sizeof(struct hv_guid));
171
172         /* strcpy(dev->name, "vmbus"); */
173         /* SynIC setup... */
174         on_each_cpu(hv_synic_init, (void *)irqvector, 1);
175
176         /* Connect to VMBus in the root partition */
177         ret = VmbusConnect();
178
179         /* VmbusSendEvent(device->localPortId+1); */
180         return ret;
181 }
182
183 /*
184  * VmbusOnDeviceRemove - Callback when the root bus device is removed
185  */
186 static int VmbusOnDeviceRemove(struct hv_device *dev)
187 {
188         int ret = 0;
189
190         vmbus_release_unattached_channels();
191         VmbusDisconnect();
192         on_each_cpu(hv_synic_cleanup, NULL, 1);
193         return ret;
194 }
195
196 /*
197  * VmbusOnCleanup - Perform any cleanup when the driver is removed
198  */
199 static void VmbusOnCleanup(struct hv_driver *drv)
200 {
201         /* struct vmbus_driver *driver = (struct vmbus_driver *)drv; */
202
203         hv_cleanup();
204 }
205
206 /*
207  * vmbus_on_msg_dpc - DPC routine to handle messages from the hypervisior
208  */
209 static void vmbus_on_msg_dpc(struct hv_driver *drv)
210 {
211         int cpu = smp_processor_id();
212         void *page_addr = hv_context.synic_message_page[cpu];
213         struct hv_message *msg = (struct hv_message *)page_addr +
214                                   VMBUS_MESSAGE_SINT;
215         struct hv_message *copied;
216
217         while (1) {
218                 if (msg->header.message_type == HVMSG_NONE) {
219                         /* no msg */
220                         break;
221                 } else {
222                         copied = kmemdup(msg, sizeof(*copied), GFP_ATOMIC);
223                         if (copied == NULL)
224                                 continue;
225
226                         osd_schedule_callback(gVmbusConnection.WorkQueue,
227                                               vmbus_onmessage,
228                                               (void *)copied);
229                 }
230
231                 msg->header.message_type = HVMSG_NONE;
232
233                 /*
234                  * Make sure the write to MessageType (ie set to
235                  * HVMSG_NONE) happens before we read the
236                  * MessagePending and EOMing. Otherwise, the EOMing
237                  * will not deliver any more messages since there is
238                  * no empty slot
239                  */
240                 mb();
241
242                 if (msg->header.message_flags.msg_pending) {
243                         /*
244                          * This will cause message queue rescan to
245                          * possibly deliver another msg from the
246                          * hypervisor
247                          */
248                         wrmsrl(HV_X64_MSR_EOM, 0);
249                 }
250         }
251 }
252
253 /*
254  * vmbus_on_isr - ISR routine
255  */
256 static int vmbus_on_isr(struct hv_driver *drv)
257 {
258         int ret = 0;
259         int cpu = smp_processor_id();
260         void *page_addr;
261         struct hv_message *msg;
262         union hv_synic_event_flags *event;
263
264         page_addr = hv_context.synic_message_page[cpu];
265         msg = (struct hv_message *)page_addr + VMBUS_MESSAGE_SINT;
266
267         /* Check if there are actual msgs to be process */
268         if (msg->header.message_type != HVMSG_NONE) {
269                 DPRINT_DBG(VMBUS, "received msg type %d size %d",
270                                 msg->header.message_type,
271                                 msg->header.payload_size);
272                 ret |= 0x1;
273         }
274
275         /* TODO: Check if there are events to be process */
276         page_addr = hv_context.synic_event_page[cpu];
277         event = (union hv_synic_event_flags *)page_addr + VMBUS_MESSAGE_SINT;
278
279         /* Since we are a child, we only need to check bit 0 */
280         if (test_and_clear_bit(0, (unsigned long *) &event->flags32[0])) {
281                 DPRINT_DBG(VMBUS, "received event %d", event->flags32[0]);
282                 ret |= 0x2;
283         }
284
285         return ret;
286 }
287
288 static void get_channel_info(struct hv_device *device,
289                              struct hv_device_info *info)
290 {
291         struct vmbus_channel_debug_info debug_info;
292
293         if (!device->channel)
294                 return;
295
296         vmbus_get_debug_info(device->channel, &debug_info);
297
298         info->ChannelId = debug_info.relid;
299         info->ChannelState = debug_info.state;
300         memcpy(&info->ChannelType, &debug_info.interfacetype,
301                sizeof(struct hv_guid));
302         memcpy(&info->ChannelInstance, &debug_info.interface_instance,
303                sizeof(struct hv_guid));
304
305         info->MonitorId = debug_info.monitorid;
306
307         info->ServerMonitorPending = debug_info.servermonitor_pending;
308         info->ServerMonitorLatency = debug_info.servermonitor_latency;
309         info->ServerMonitorConnectionId = debug_info.servermonitor_connectionid;
310
311         info->ClientMonitorPending = debug_info.clientmonitor_pending;
312         info->ClientMonitorLatency = debug_info.clientmonitor_latency;
313         info->ClientMonitorConnectionId = debug_info.clientmonitor_connectionid;
314
315         info->Inbound.InterruptMask = debug_info.inbound.current_interrupt_mask;
316         info->Inbound.ReadIndex = debug_info.inbound.current_read_index;
317         info->Inbound.WriteIndex = debug_info.inbound.current_write_index;
318         info->Inbound.BytesAvailToRead = debug_info.inbound.bytes_avail_toread;
319         info->Inbound.BytesAvailToWrite =
320                 debug_info.inbound.bytes_avail_towrite;
321
322         info->Outbound.InterruptMask =
323                 debug_info.outbound.current_interrupt_mask;
324         info->Outbound.ReadIndex = debug_info.outbound.current_read_index;
325         info->Outbound.WriteIndex = debug_info.outbound.current_write_index;
326         info->Outbound.BytesAvailToRead =
327                 debug_info.outbound.bytes_avail_toread;
328         info->Outbound.BytesAvailToWrite =
329                 debug_info.outbound.bytes_avail_towrite;
330 }
331
332 /*
333  * vmbus_show_device_attr - Show the device attribute in sysfs.
334  *
335  * This is invoked when user does a
336  * "cat /sys/bus/vmbus/devices/<busdevice>/<attr name>"
337  */
338 static ssize_t vmbus_show_device_attr(struct device *dev,
339                                       struct device_attribute *dev_attr,
340                                       char *buf)
341 {
342         struct vm_device *device_ctx = device_to_vm_device(dev);
343         struct hv_device_info device_info;
344
345         memset(&device_info, 0, sizeof(struct hv_device_info));
346
347         get_channel_info(&device_ctx->device_obj, &device_info);
348
349         if (!strcmp(dev_attr->attr.name, "class_id")) {
350                 return sprintf(buf, "{%02x%02x%02x%02x-%02x%02x-%02x%02x-"
351                                "%02x%02x%02x%02x%02x%02x%02x%02x}\n",
352                                device_info.ChannelType.data[3],
353                                device_info.ChannelType.data[2],
354                                device_info.ChannelType.data[1],
355                                device_info.ChannelType.data[0],
356                                device_info.ChannelType.data[5],
357                                device_info.ChannelType.data[4],
358                                device_info.ChannelType.data[7],
359                                device_info.ChannelType.data[6],
360                                device_info.ChannelType.data[8],
361                                device_info.ChannelType.data[9],
362                                device_info.ChannelType.data[10],
363                                device_info.ChannelType.data[11],
364                                device_info.ChannelType.data[12],
365                                device_info.ChannelType.data[13],
366                                device_info.ChannelType.data[14],
367                                device_info.ChannelType.data[15]);
368         } else if (!strcmp(dev_attr->attr.name, "device_id")) {
369                 return sprintf(buf, "{%02x%02x%02x%02x-%02x%02x-%02x%02x-"
370                                "%02x%02x%02x%02x%02x%02x%02x%02x}\n",
371                                device_info.ChannelInstance.data[3],
372                                device_info.ChannelInstance.data[2],
373                                device_info.ChannelInstance.data[1],
374                                device_info.ChannelInstance.data[0],
375                                device_info.ChannelInstance.data[5],
376                                device_info.ChannelInstance.data[4],
377                                device_info.ChannelInstance.data[7],
378                                device_info.ChannelInstance.data[6],
379                                device_info.ChannelInstance.data[8],
380                                device_info.ChannelInstance.data[9],
381                                device_info.ChannelInstance.data[10],
382                                device_info.ChannelInstance.data[11],
383                                device_info.ChannelInstance.data[12],
384                                device_info.ChannelInstance.data[13],
385                                device_info.ChannelInstance.data[14],
386                                device_info.ChannelInstance.data[15]);
387         } else if (!strcmp(dev_attr->attr.name, "state")) {
388                 return sprintf(buf, "%d\n", device_info.ChannelState);
389         } else if (!strcmp(dev_attr->attr.name, "id")) {
390                 return sprintf(buf, "%d\n", device_info.ChannelId);
391         } else if (!strcmp(dev_attr->attr.name, "out_intr_mask")) {
392                 return sprintf(buf, "%d\n", device_info.Outbound.InterruptMask);
393         } else if (!strcmp(dev_attr->attr.name, "out_read_index")) {
394                 return sprintf(buf, "%d\n", device_info.Outbound.ReadIndex);
395         } else if (!strcmp(dev_attr->attr.name, "out_write_index")) {
396                 return sprintf(buf, "%d\n", device_info.Outbound.WriteIndex);
397         } else if (!strcmp(dev_attr->attr.name, "out_read_bytes_avail")) {
398                 return sprintf(buf, "%d\n",
399                                device_info.Outbound.BytesAvailToRead);
400         } else if (!strcmp(dev_attr->attr.name, "out_write_bytes_avail")) {
401                 return sprintf(buf, "%d\n",
402                                device_info.Outbound.BytesAvailToWrite);
403         } else if (!strcmp(dev_attr->attr.name, "in_intr_mask")) {
404                 return sprintf(buf, "%d\n", device_info.Inbound.InterruptMask);
405         } else if (!strcmp(dev_attr->attr.name, "in_read_index")) {
406                 return sprintf(buf, "%d\n", device_info.Inbound.ReadIndex);
407         } else if (!strcmp(dev_attr->attr.name, "in_write_index")) {
408                 return sprintf(buf, "%d\n", device_info.Inbound.WriteIndex);
409         } else if (!strcmp(dev_attr->attr.name, "in_read_bytes_avail")) {
410                 return sprintf(buf, "%d\n",
411                                device_info.Inbound.BytesAvailToRead);
412         } else if (!strcmp(dev_attr->attr.name, "in_write_bytes_avail")) {
413                 return sprintf(buf, "%d\n",
414                                device_info.Inbound.BytesAvailToWrite);
415         } else if (!strcmp(dev_attr->attr.name, "monitor_id")) {
416                 return sprintf(buf, "%d\n", device_info.MonitorId);
417         } else if (!strcmp(dev_attr->attr.name, "server_monitor_pending")) {
418                 return sprintf(buf, "%d\n", device_info.ServerMonitorPending);
419         } else if (!strcmp(dev_attr->attr.name, "server_monitor_latency")) {
420                 return sprintf(buf, "%d\n", device_info.ServerMonitorLatency);
421         } else if (!strcmp(dev_attr->attr.name, "server_monitor_conn_id")) {
422                 return sprintf(buf, "%d\n",
423                                device_info.ServerMonitorConnectionId);
424         } else if (!strcmp(dev_attr->attr.name, "client_monitor_pending")) {
425                 return sprintf(buf, "%d\n", device_info.ClientMonitorPending);
426         } else if (!strcmp(dev_attr->attr.name, "client_monitor_latency")) {
427                 return sprintf(buf, "%d\n", device_info.ClientMonitorLatency);
428         } else if (!strcmp(dev_attr->attr.name, "client_monitor_conn_id")) {
429                 return sprintf(buf, "%d\n",
430                                device_info.ClientMonitorConnectionId);
431         } else {
432                 return 0;
433         }
434 }
435
436 /*
437  * vmbus_bus_init -Main vmbus driver initialization routine.
438  *
439  * Here, we
440  *      - initialize the vmbus driver context
441  *      - setup various driver entry points
442  *      - invoke the vmbus hv main init routine
443  *      - get the irq resource
444  *      - invoke the vmbus to add the vmbus root device
445  *      - setup the vmbus root device
446  *      - retrieve the channel offers
447  */
448 static int vmbus_bus_init(void)
449 {
450         struct vmbus_driver_context *vmbus_drv_ctx = &g_vmbus_drv;
451         struct hv_driver *driver = &g_vmbus_drv.drv_obj;
452         struct vm_device *dev_ctx = &g_vmbus_drv.device_ctx;
453         int ret;
454         unsigned int vector;
455
456         DPRINT_INFO(VMBUS, "+++++++ HV Driver version = %s +++++++",
457                     HV_DRV_VERSION);
458         DPRINT_INFO(VMBUS, "+++++++ Vmbus supported version = %d +++++++",
459                         VMBUS_REVISION_NUMBER);
460         DPRINT_INFO(VMBUS, "+++++++ Vmbus using SINT %d +++++++",
461                         VMBUS_MESSAGE_SINT);
462         DPRINT_DBG(VMBUS, "sizeof(vmbus_channel_packet_page_buffer)=%zd, "
463                         "sizeof(VMBUS_CHANNEL_PACKET_MULITPAGE_BUFFER)=%zd",
464                         sizeof(struct vmbus_channel_packet_page_buffer),
465                         sizeof(struct vmbus_channel_packet_multipage_buffer));
466
467         driver->name = gDriverName;
468         memcpy(&driver->deviceType, &gVmbusDeviceType, sizeof(struct hv_guid));
469
470         /* Setup dispatch table */
471         driver->OnDeviceAdd     = VmbusOnDeviceAdd;
472         driver->OnDeviceRemove  = VmbusOnDeviceRemove;
473         driver->OnCleanup       = VmbusOnCleanup;
474
475         /* Hypervisor initialization...setup hypercall page..etc */
476         ret = hv_init();
477         if (ret != 0) {
478                 DPRINT_ERR(VMBUS, "Unable to initialize the hypervisor - 0x%x",
479                                 ret);
480                 goto cleanup;
481         }
482
483         /* Sanity checks */
484         if (!driver->OnDeviceAdd) {
485                 DPRINT_ERR(VMBUS_DRV, "OnDeviceAdd() routine not set");
486                 ret = -1;
487                 goto cleanup;
488         }
489
490         vmbus_drv_ctx->bus.name = driver->name;
491
492         /* Initialize the bus context */
493         tasklet_init(&vmbus_drv_ctx->msg_dpc, vmbus_msg_dpc,
494                      (unsigned long)driver);
495         tasklet_init(&vmbus_drv_ctx->event_dpc, vmbus_event_dpc,
496                      (unsigned long)driver);
497
498         /* Now, register the bus driver with LDM */
499         ret = bus_register(&vmbus_drv_ctx->bus);
500         if (ret) {
501                 ret = -1;
502                 goto cleanup;
503         }
504
505         /* Get the interrupt resource */
506         ret = request_irq(vmbus_irq, vmbus_isr, IRQF_SAMPLE_RANDOM,
507                           driver->name, NULL);
508
509         if (ret != 0) {
510                 DPRINT_ERR(VMBUS_DRV, "ERROR - Unable to request IRQ %d",
511                            vmbus_irq);
512
513                 bus_unregister(&vmbus_drv_ctx->bus);
514
515                 ret = -1;
516                 goto cleanup;
517         }
518         vector = VMBUS_IRQ_VECTOR;
519
520         DPRINT_INFO(VMBUS_DRV, "irq 0x%x vector 0x%x", vmbus_irq, vector);
521
522         /* Call to bus driver to add the root device */
523         memset(dev_ctx, 0, sizeof(struct vm_device));
524
525         ret = driver->OnDeviceAdd(&dev_ctx->device_obj, &vector);
526         if (ret != 0) {
527                 DPRINT_ERR(VMBUS_DRV,
528                            "ERROR - Unable to add vmbus root device");
529
530                 free_irq(vmbus_irq, NULL);
531
532                 bus_unregister(&vmbus_drv_ctx->bus);
533
534                 ret = -1;
535                 goto cleanup;
536         }
537         /* strcpy(dev_ctx->device.bus_id, dev_ctx->device_obj.name); */
538         dev_set_name(&dev_ctx->device, "vmbus_0_0");
539         memcpy(&dev_ctx->class_id, &dev_ctx->device_obj.deviceType,
540                 sizeof(struct hv_guid));
541         memcpy(&dev_ctx->device_id, &dev_ctx->device_obj.deviceInstance,
542                 sizeof(struct hv_guid));
543
544         /* No need to bind a driver to the root device. */
545         dev_ctx->device.parent = NULL;
546         /* NULL; vmbus_remove() does not get invoked */
547         dev_ctx->device.bus = &vmbus_drv_ctx->bus;
548
549         /* Setup the device dispatch table */
550         dev_ctx->device.release = vmbus_bus_release;
551
552         /* Setup the bus as root device */
553         ret = device_register(&dev_ctx->device);
554         if (ret) {
555                 DPRINT_ERR(VMBUS_DRV,
556                            "ERROR - Unable to register vmbus root device");
557
558                 free_irq(vmbus_irq, NULL);
559                 bus_unregister(&vmbus_drv_ctx->bus);
560
561                 ret = -1;
562                 goto cleanup;
563         }
564
565         vmbus_request_offers();
566         wait_for_completion(&hv_channel_ready);
567
568 cleanup:
569         return ret;
570 }
571
572 /*
573  * vmbus_bus_exit - Terminate the vmbus driver.
574  *
575  * This routine is opposite of vmbus_bus_init()
576  */
577 static void vmbus_bus_exit(void)
578 {
579         struct hv_driver *driver = &g_vmbus_drv.drv_obj;
580         struct vmbus_driver_context *vmbus_drv_ctx = &g_vmbus_drv;
581
582         struct vm_device *dev_ctx = &g_vmbus_drv.device_ctx;
583
584         /* Remove the root device */
585         if (driver->OnDeviceRemove)
586                 driver->OnDeviceRemove(&dev_ctx->device_obj);
587
588         if (driver->OnCleanup)
589                 driver->OnCleanup(driver);
590
591         /* Unregister the root bus device */
592         device_unregister(&dev_ctx->device);
593
594         bus_unregister(&vmbus_drv_ctx->bus);
595
596         free_irq(vmbus_irq, NULL);
597
598         tasklet_kill(&vmbus_drv_ctx->msg_dpc);
599         tasklet_kill(&vmbus_drv_ctx->event_dpc);
600 }
601
602
603 /**
604  * vmbus_child_driver_register() - Register a vmbus's child driver
605  * @driver_ctx:        Pointer to driver structure you want to register
606  *
607  * @driver_ctx is of type &struct driver_context
608  *
609  * Registers the given driver with Linux through the 'driver_register()' call
610  * And sets up the hyper-v vmbus handling for this driver.
611  * It will return the state of the 'driver_register()' call.
612  *
613  * Mainly used by Hyper-V drivers.
614  */
615 int vmbus_child_driver_register(struct driver_context *driver_ctx)
616 {
617         int ret;
618
619         DPRINT_INFO(VMBUS_DRV, "child driver (%p) registering - name %s",
620                     driver_ctx, driver_ctx->driver.name);
621
622         /* The child driver on this vmbus */
623         driver_ctx->driver.bus = &g_vmbus_drv.bus;
624
625         ret = driver_register(&driver_ctx->driver);
626
627         vmbus_request_offers();
628
629         return ret;
630 }
631 EXPORT_SYMBOL(vmbus_child_driver_register);
632
633 /**
634  * vmbus_child_driver_unregister() - Unregister a vmbus's child driver
635  * @driver_ctx:        Pointer to driver structure you want to un-register
636  *
637  * @driver_ctx is of type &struct driver_context
638  *
639  * Un-register the given driver with Linux through the 'driver_unregister()'
640  * call. And ungegisters the driver from the Hyper-V vmbus handler.
641  *
642  * Mainly used by Hyper-V drivers.
643  */
644 void vmbus_child_driver_unregister(struct driver_context *driver_ctx)
645 {
646         DPRINT_INFO(VMBUS_DRV, "child driver (%p) unregistering - name %s",
647                     driver_ctx, driver_ctx->driver.name);
648
649         driver_unregister(&driver_ctx->driver);
650
651         driver_ctx->driver.bus = NULL;
652 }
653 EXPORT_SYMBOL(vmbus_child_driver_unregister);
654
655 /*
656  * vmbus_child_device_create - Creates and registers a new child device
657  * on the vmbus.
658  */
659 struct hv_device *vmbus_child_device_create(struct hv_guid *type,
660                                             struct hv_guid *instance,
661                                             struct vmbus_channel *channel)
662 {
663         struct vm_device *child_device_ctx;
664         struct hv_device *child_device_obj;
665
666         /* Allocate the new child device */
667         child_device_ctx = kzalloc(sizeof(struct vm_device), GFP_KERNEL);
668         if (!child_device_ctx) {
669                 DPRINT_ERR(VMBUS_DRV,
670                         "unable to allocate device_context for child device");
671                 return NULL;
672         }
673
674         DPRINT_DBG(VMBUS_DRV, "child device (%p) allocated - "
675                 "type {%02x%02x%02x%02x-%02x%02x-%02x%02x-"
676                 "%02x%02x%02x%02x%02x%02x%02x%02x},"
677                 "id {%02x%02x%02x%02x-%02x%02x-%02x%02x-"
678                 "%02x%02x%02x%02x%02x%02x%02x%02x}",
679                 &child_device_ctx->device,
680                 type->data[3], type->data[2], type->data[1], type->data[0],
681                 type->data[5], type->data[4], type->data[7], type->data[6],
682                 type->data[8], type->data[9], type->data[10], type->data[11],
683                 type->data[12], type->data[13], type->data[14], type->data[15],
684                 instance->data[3], instance->data[2],
685                 instance->data[1], instance->data[0],
686                 instance->data[5], instance->data[4],
687                 instance->data[7], instance->data[6],
688                 instance->data[8], instance->data[9],
689                 instance->data[10], instance->data[11],
690                 instance->data[12], instance->data[13],
691                 instance->data[14], instance->data[15]);
692
693         child_device_obj = &child_device_ctx->device_obj;
694         child_device_obj->channel = channel;
695         memcpy(&child_device_obj->deviceType, type, sizeof(struct hv_guid));
696         memcpy(&child_device_obj->deviceInstance, instance,
697                sizeof(struct hv_guid));
698
699         memcpy(&child_device_ctx->class_id, type, sizeof(struct hv_guid));
700         memcpy(&child_device_ctx->device_id, instance, sizeof(struct hv_guid));
701
702         return child_device_obj;
703 }
704
705 /*
706  * vmbus_child_device_register - Register the child device on the specified bus
707  */
708 int vmbus_child_device_register(struct hv_device *root_device_obj,
709                                 struct hv_device *child_device_obj)
710 {
711         int ret = 0;
712         struct vm_device *root_device_ctx =
713                                 to_vm_device(root_device_obj);
714         struct vm_device *child_device_ctx =
715                                 to_vm_device(child_device_obj);
716         static atomic_t device_num = ATOMIC_INIT(0);
717
718         DPRINT_DBG(VMBUS_DRV, "child device (%p) registering",
719                    child_device_ctx);
720
721         /* Set the device name. Otherwise, device_register() will fail. */
722         dev_set_name(&child_device_ctx->device, "vmbus_0_%d",
723                      atomic_inc_return(&device_num));
724
725         /* The new device belongs to this bus */
726         child_device_ctx->device.bus = &g_vmbus_drv.bus; /* device->dev.bus; */
727         child_device_ctx->device.parent = &root_device_ctx->device;
728         child_device_ctx->device.release = vmbus_device_release;
729
730         /*
731          * Register with the LDM. This will kick off the driver/device
732          * binding...which will eventually call vmbus_match() and vmbus_probe()
733          */
734         ret = device_register(&child_device_ctx->device);
735
736         /* vmbus_probe() error does not get propergate to device_register(). */
737         ret = child_device_ctx->probe_error;
738
739         if (ret)
740                 DPRINT_ERR(VMBUS_DRV, "unable to register child device (%p)",
741                            &child_device_ctx->device);
742         else
743                 DPRINT_INFO(VMBUS_DRV, "child device (%p) registered",
744                             &child_device_ctx->device);
745
746         return ret;
747 }
748
749 /*
750  * vmbus_child_device_unregister - Remove the specified child device
751  * from the vmbus.
752  */
753 void vmbus_child_device_unregister(struct hv_device *device_obj)
754 {
755         struct vm_device *device_ctx = to_vm_device(device_obj);
756
757         DPRINT_INFO(VMBUS_DRV, "unregistering child device (%p)",
758                     &device_ctx->device);
759
760         /*
761          * Kick off the process of unregistering the device.
762          * This will call vmbus_remove() and eventually vmbus_device_release()
763          */
764         device_unregister(&device_ctx->device);
765
766         DPRINT_INFO(VMBUS_DRV, "child device (%p) unregistered",
767                     &device_ctx->device);
768 }
769
770 /*
771  * vmbus_uevent - add uevent for our device
772  *
773  * This routine is invoked when a device is added or removed on the vmbus to
774  * generate a uevent to udev in the userspace. The udev will then look at its
775  * rule and the uevent generated here to load the appropriate driver
776  */
777 static int vmbus_uevent(struct device *device, struct kobj_uevent_env *env)
778 {
779         struct vm_device *device_ctx = device_to_vm_device(device);
780         int ret;
781
782         DPRINT_INFO(VMBUS_DRV, "generating uevent - VMBUS_DEVICE_CLASS_GUID={"
783                     "%02x%02x%02x%02x-%02x%02x-%02x%02x-"
784                     "%02x%02x%02x%02x%02x%02x%02x%02x}",
785                     device_ctx->class_id.data[3], device_ctx->class_id.data[2],
786                     device_ctx->class_id.data[1], device_ctx->class_id.data[0],
787                     device_ctx->class_id.data[5], device_ctx->class_id.data[4],
788                     device_ctx->class_id.data[7], device_ctx->class_id.data[6],
789                     device_ctx->class_id.data[8], device_ctx->class_id.data[9],
790                     device_ctx->class_id.data[10],
791                     device_ctx->class_id.data[11],
792                     device_ctx->class_id.data[12],
793                     device_ctx->class_id.data[13],
794                     device_ctx->class_id.data[14],
795                     device_ctx->class_id.data[15]);
796
797         ret = add_uevent_var(env, "VMBUS_DEVICE_CLASS_GUID={"
798                              "%02x%02x%02x%02x-%02x%02x-%02x%02x-"
799                              "%02x%02x%02x%02x%02x%02x%02x%02x}",
800                              device_ctx->class_id.data[3],
801                              device_ctx->class_id.data[2],
802                              device_ctx->class_id.data[1],
803                              device_ctx->class_id.data[0],
804                              device_ctx->class_id.data[5],
805                              device_ctx->class_id.data[4],
806                              device_ctx->class_id.data[7],
807                              device_ctx->class_id.data[6],
808                              device_ctx->class_id.data[8],
809                              device_ctx->class_id.data[9],
810                              device_ctx->class_id.data[10],
811                              device_ctx->class_id.data[11],
812                              device_ctx->class_id.data[12],
813                              device_ctx->class_id.data[13],
814                              device_ctx->class_id.data[14],
815                              device_ctx->class_id.data[15]);
816
817         if (ret)
818                 return ret;
819
820         ret = add_uevent_var(env, "VMBUS_DEVICE_DEVICE_GUID={"
821                              "%02x%02x%02x%02x-%02x%02x-%02x%02x-"
822                              "%02x%02x%02x%02x%02x%02x%02x%02x}",
823                              device_ctx->device_id.data[3],
824                              device_ctx->device_id.data[2],
825                              device_ctx->device_id.data[1],
826                              device_ctx->device_id.data[0],
827                              device_ctx->device_id.data[5],
828                              device_ctx->device_id.data[4],
829                              device_ctx->device_id.data[7],
830                              device_ctx->device_id.data[6],
831                              device_ctx->device_id.data[8],
832                              device_ctx->device_id.data[9],
833                              device_ctx->device_id.data[10],
834                              device_ctx->device_id.data[11],
835                              device_ctx->device_id.data[12],
836                              device_ctx->device_id.data[13],
837                              device_ctx->device_id.data[14],
838                              device_ctx->device_id.data[15]);
839         if (ret)
840                 return ret;
841
842         return 0;
843 }
844
845 /*
846  * vmbus_match - Attempt to match the specified device to the specified driver
847  */
848 static int vmbus_match(struct device *device, struct device_driver *driver)
849 {
850         int match = 0;
851         struct driver_context *driver_ctx = driver_to_driver_context(driver);
852         struct vm_device *device_ctx = device_to_vm_device(device);
853
854         /* We found our driver ? */
855         if (memcmp(&device_ctx->class_id, &driver_ctx->class_id,
856                    sizeof(struct hv_guid)) == 0) {
857                 /*
858                  * !! NOTE: The driver_ctx is not a vmbus_drv_ctx. We typecast
859                  * it here to access the struct hv_driver field
860                  */
861                 struct vmbus_driver_context *vmbus_drv_ctx =
862                         (struct vmbus_driver_context *)driver_ctx;
863
864                 device_ctx->device_obj.Driver = &vmbus_drv_ctx->drv_obj;
865                 DPRINT_INFO(VMBUS_DRV,
866                             "device object (%p) set to driver object (%p)",
867                             &device_ctx->device_obj,
868                             device_ctx->device_obj.Driver);
869
870                 match = 1;
871         }
872         return match;
873 }
874
875 /*
876  * vmbus_probe_failed_cb - Callback when a driver probe failed in vmbus_probe()
877  *
878  * We need a callback because we cannot invoked device_unregister() inside
879  * vmbus_probe() since vmbus_probe() may be invoked inside device_register()
880  * i.e. we cannot call device_unregister() inside device_register()
881  */
882 static void vmbus_probe_failed_cb(struct work_struct *context)
883 {
884         struct vm_device *device_ctx = (struct vm_device *)context;
885
886         /*
887          * Kick off the process of unregistering the device.
888          * This will call vmbus_remove() and eventually vmbus_device_release()
889          */
890         device_unregister(&device_ctx->device);
891
892         /* put_device(&device_ctx->device); */
893 }
894
895 /*
896  * vmbus_probe - Add the new vmbus's child device
897  */
898 static int vmbus_probe(struct device *child_device)
899 {
900         int ret = 0;
901         struct driver_context *driver_ctx =
902                         driver_to_driver_context(child_device->driver);
903         struct vm_device *device_ctx =
904                         device_to_vm_device(child_device);
905
906         /* Let the specific open-source driver handles the probe if it can */
907         if (driver_ctx->probe) {
908                 ret = device_ctx->probe_error = driver_ctx->probe(child_device);
909                 if (ret != 0) {
910                         DPRINT_ERR(VMBUS_DRV, "probe() failed for device %s "
911                                    "(%p) on driver %s (%d)...",
912                                    dev_name(child_device), child_device,
913                                    child_device->driver->name, ret);
914
915                         INIT_WORK(&device_ctx->probe_failed_work_item,
916                                   vmbus_probe_failed_cb);
917                         schedule_work(&device_ctx->probe_failed_work_item);
918                 }
919         } else {
920                 DPRINT_ERR(VMBUS_DRV, "probe() method not set for driver - %s",
921                            child_device->driver->name);
922                 ret = -1;
923         }
924         return ret;
925 }
926
927 /*
928  * vmbus_remove - Remove a vmbus device
929  */
930 static int vmbus_remove(struct device *child_device)
931 {
932         int ret;
933         struct driver_context *driver_ctx;
934
935         /* Special case root bus device */
936         if (child_device->parent == NULL) {
937                 /*
938                  * No-op since it is statically defined and handle in
939                  * vmbus_bus_exit()
940                  */
941                 return 0;
942         }
943
944         if (child_device->driver) {
945                 driver_ctx = driver_to_driver_context(child_device->driver);
946
947                 /*
948                  * Let the specific open-source driver handles the removal if
949                  * it can
950                  */
951                 if (driver_ctx->remove) {
952                         ret = driver_ctx->remove(child_device);
953                 } else {
954                         DPRINT_ERR(VMBUS_DRV,
955                                    "remove() method not set for driver - %s",
956                                    child_device->driver->name);
957                         ret = -1;
958                 }
959         }
960
961         return 0;
962 }
963
964 /*
965  * vmbus_shutdown - Shutdown a vmbus device
966  */
967 static void vmbus_shutdown(struct device *child_device)
968 {
969         struct driver_context *driver_ctx;
970
971         /* Special case root bus device */
972         if (child_device->parent == NULL) {
973                 /*
974                  * No-op since it is statically defined and handle in
975                  * vmbus_bus_exit()
976                  */
977                 return;
978         }
979
980         /* The device may not be attached yet */
981         if (!child_device->driver)
982                 return;
983
984         driver_ctx = driver_to_driver_context(child_device->driver);
985
986         /* Let the specific open-source driver handles the removal if it can */
987         if (driver_ctx->shutdown)
988                 driver_ctx->shutdown(child_device);
989
990         return;
991 }
992
993 /*
994  * vmbus_bus_release - Final callback release of the vmbus root device
995  */
996 static void vmbus_bus_release(struct device *device)
997 {
998         /* FIXME */
999         /* Empty release functions are a bug, or a major sign
1000          * of a problem design, this MUST BE FIXED! */
1001         dev_err(device, "%s needs to be fixed!\n", __func__);
1002         WARN_ON(1);
1003 }
1004
1005 /*
1006  * vmbus_device_release - Final callback release of the vmbus child device
1007  */
1008 static void vmbus_device_release(struct device *device)
1009 {
1010         struct vm_device *device_ctx = device_to_vm_device(device);
1011
1012         kfree(device_ctx);
1013
1014         /* !!DO NOT REFERENCE device_ctx anymore at this point!! */
1015 }
1016
1017 /*
1018  * vmbus_msg_dpc - Tasklet routine to handle hypervisor messages
1019  */
1020 static void vmbus_msg_dpc(unsigned long data)
1021 {
1022         struct hv_driver *driver = (struct hv_driver *)data;
1023
1024         /* Call to bus driver to handle interrupt */
1025         vmbus_on_msg_dpc(driver);
1026 }
1027
1028 /*
1029  * vmbus_event_dpc - Tasklet routine to handle hypervisor events
1030  */
1031 static void vmbus_event_dpc(unsigned long data)
1032 {
1033         /* Call to bus driver to handle interrupt */
1034         VmbusOnEvents();
1035 }
1036
1037 static irqreturn_t vmbus_isr(int irq, void *dev_id)
1038 {
1039         struct hv_driver *driver = &g_vmbus_drv.drv_obj;
1040         int ret;
1041
1042         /* Call to bus driver to handle interrupt */
1043         ret = vmbus_on_isr(driver);
1044
1045         /* Schedules a dpc if necessary */
1046         if (ret > 0) {
1047                 if (test_bit(0, (unsigned long *)&ret))
1048                         tasklet_schedule(&g_vmbus_drv.msg_dpc);
1049
1050                 if (test_bit(1, (unsigned long *)&ret))
1051                         tasklet_schedule(&g_vmbus_drv.event_dpc);
1052
1053                 return IRQ_HANDLED;
1054         } else {
1055                 return IRQ_NONE;
1056         }
1057 }
1058
1059 static struct dmi_system_id __initdata microsoft_hv_dmi_table[] = {
1060         {
1061                 .ident = "Hyper-V",
1062                 .matches = {
1063                         DMI_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
1064                         DMI_MATCH(DMI_PRODUCT_NAME, "Virtual Machine"),
1065                         DMI_MATCH(DMI_BOARD_NAME, "Virtual Machine"),
1066                 },
1067         },
1068         { },
1069 };
1070 MODULE_DEVICE_TABLE(dmi, microsoft_hv_dmi_table);
1071
1072 static int __init vmbus_init(void)
1073 {
1074         DPRINT_INFO(VMBUS_DRV,
1075                 "Vmbus initializing.... current log level 0x%x (%x,%x)",
1076                 vmbus_loglevel, HIWORD(vmbus_loglevel), LOWORD(vmbus_loglevel));
1077         /* Todo: it is used for loglevel, to be ported to new kernel. */
1078
1079         if (!dmi_check_system(microsoft_hv_dmi_table))
1080                 return -ENODEV;
1081
1082         return vmbus_bus_init();
1083 }
1084
1085 static void __exit vmbus_exit(void)
1086 {
1087         vmbus_bus_exit();
1088         /* Todo: it is used for loglevel, to be ported to new kernel. */
1089 }
1090
1091 /*
1092  * We use a PCI table to determine if we should autoload this driver  This is
1093  * needed by distro tools to determine if the hyperv drivers should be
1094  * installed and/or configured.  We don't do anything else with the table, but
1095  * it needs to be present.
1096  */
1097 static const struct pci_device_id microsoft_hv_pci_table[] = {
1098         { PCI_DEVICE(0x1414, 0x5353) }, /* VGA compatible controller */
1099         { 0 }
1100 };
1101 MODULE_DEVICE_TABLE(pci, microsoft_hv_pci_table);
1102
1103 MODULE_LICENSE("GPL");
1104 MODULE_VERSION(HV_DRV_VERSION);
1105 module_param(vmbus_irq, int, S_IRUGO);
1106 module_param(vmbus_loglevel, int, S_IRUGO);
1107
1108 module_init(vmbus_init);
1109 module_exit(vmbus_exit);