• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * kvm_virtio.c - virtio for kvm on s390
3  *
4  * Copyright IBM Corp. 2008
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 only)
8  * as published by the Free Software Foundation.
9  *
10  *    Author(s): Christian Borntraeger <borntraeger@de.ibm.com>
11  */
12 
13 #include <linux/kernel_stat.h>
14 #include <linux/init.h>
15 #include <linux/bootmem.h>
16 #include <linux/err.h>
17 #include <linux/virtio.h>
18 #include <linux/virtio_config.h>
19 #include <linux/slab.h>
20 #include <linux/virtio_console.h>
21 #include <linux/interrupt.h>
22 #include <linux/virtio_ring.h>
23 #include <linux/export.h>
24 #include <linux/pfn.h>
25 #include <asm/io.h>
26 #include <asm/kvm_para.h>
27 #include <asm/kvm_virtio.h>
28 #include <asm/setup.h>
29 #include <asm/irq.h>
30 
31 #define VIRTIO_SUBCODE_64 0x0D00
32 
33 /*
34  * The pointer to our (page) of device descriptions.
35  */
36 static void *kvm_devices;
37 static struct work_struct hotplug_work;
38 
39 struct kvm_device {
40 	struct virtio_device vdev;
41 	struct kvm_device_desc *desc;
42 };
43 
44 #define to_kvmdev(vd) container_of(vd, struct kvm_device, vdev)
45 
46 /*
47  * memory layout:
48  * - kvm_device_descriptor
49  *        struct kvm_device_desc
50  * - configuration
51  *        struct kvm_vqconfig
52  * - feature bits
53  * - config space
54  */
kvm_vq_config(const struct kvm_device_desc * desc)55 static struct kvm_vqconfig *kvm_vq_config(const struct kvm_device_desc *desc)
56 {
57 	return (struct kvm_vqconfig *)(desc + 1);
58 }
59 
kvm_vq_features(const struct kvm_device_desc * desc)60 static u8 *kvm_vq_features(const struct kvm_device_desc *desc)
61 {
62 	return (u8 *)(kvm_vq_config(desc) + desc->num_vq);
63 }
64 
kvm_vq_configspace(const struct kvm_device_desc * desc)65 static u8 *kvm_vq_configspace(const struct kvm_device_desc *desc)
66 {
67 	return kvm_vq_features(desc) + desc->feature_len * 2;
68 }
69 
70 /*
71  * The total size of the config page used by this device (incl. desc)
72  */
desc_size(const struct kvm_device_desc * desc)73 static unsigned desc_size(const struct kvm_device_desc *desc)
74 {
75 	return sizeof(*desc)
76 		+ desc->num_vq * sizeof(struct kvm_vqconfig)
77 		+ desc->feature_len * 2
78 		+ desc->config_len;
79 }
80 
81 /* This gets the device's feature bits. */
kvm_get_features(struct virtio_device * vdev)82 static u32 kvm_get_features(struct virtio_device *vdev)
83 {
84 	unsigned int i;
85 	u32 features = 0;
86 	struct kvm_device_desc *desc = to_kvmdev(vdev)->desc;
87 	u8 *in_features = kvm_vq_features(desc);
88 
89 	for (i = 0; i < min(desc->feature_len * 8, 32); i++)
90 		if (in_features[i / 8] & (1 << (i % 8)))
91 			features |= (1 << i);
92 	return features;
93 }
94 
kvm_finalize_features(struct virtio_device * vdev)95 static void kvm_finalize_features(struct virtio_device *vdev)
96 {
97 	unsigned int i, bits;
98 	struct kvm_device_desc *desc = to_kvmdev(vdev)->desc;
99 	/* Second half of bitmap is features we accept. */
100 	u8 *out_features = kvm_vq_features(desc) + desc->feature_len;
101 
102 	/* Give virtio_ring a chance to accept features. */
103 	vring_transport_features(vdev);
104 
105 	memset(out_features, 0, desc->feature_len);
106 	bits = min_t(unsigned, desc->feature_len, sizeof(vdev->features)) * 8;
107 	for (i = 0; i < bits; i++) {
108 		if (test_bit(i, vdev->features))
109 			out_features[i / 8] |= (1 << (i % 8));
110 	}
111 }
112 
113 /*
114  * Reading and writing elements in config space
115  */
kvm_get(struct virtio_device * vdev,unsigned int offset,void * buf,unsigned len)116 static void kvm_get(struct virtio_device *vdev, unsigned int offset,
117 		   void *buf, unsigned len)
118 {
119 	struct kvm_device_desc *desc = to_kvmdev(vdev)->desc;
120 
121 	BUG_ON(offset + len > desc->config_len);
122 	memcpy(buf, kvm_vq_configspace(desc) + offset, len);
123 }
124 
kvm_set(struct virtio_device * vdev,unsigned int offset,const void * buf,unsigned len)125 static void kvm_set(struct virtio_device *vdev, unsigned int offset,
126 		   const void *buf, unsigned len)
127 {
128 	struct kvm_device_desc *desc = to_kvmdev(vdev)->desc;
129 
130 	BUG_ON(offset + len > desc->config_len);
131 	memcpy(kvm_vq_configspace(desc) + offset, buf, len);
132 }
133 
134 /*
135  * The operations to get and set the status word just access
136  * the status field of the device descriptor. set_status will also
137  * make a hypercall to the host, to tell about status changes
138  */
kvm_get_status(struct virtio_device * vdev)139 static u8 kvm_get_status(struct virtio_device *vdev)
140 {
141 	return to_kvmdev(vdev)->desc->status;
142 }
143 
kvm_set_status(struct virtio_device * vdev,u8 status)144 static void kvm_set_status(struct virtio_device *vdev, u8 status)
145 {
146 	BUG_ON(!status);
147 	to_kvmdev(vdev)->desc->status = status;
148 	kvm_hypercall1(KVM_S390_VIRTIO_SET_STATUS,
149 		       (unsigned long) to_kvmdev(vdev)->desc);
150 }
151 
152 /*
153  * To reset the device, we use the KVM_VIRTIO_RESET hypercall, using the
154  * descriptor address. The Host will zero the status and all the
155  * features.
156  */
kvm_reset(struct virtio_device * vdev)157 static void kvm_reset(struct virtio_device *vdev)
158 {
159 	kvm_hypercall1(KVM_S390_VIRTIO_RESET,
160 		       (unsigned long) to_kvmdev(vdev)->desc);
161 }
162 
163 /*
164  * When the virtio_ring code wants to notify the Host, it calls us here and we
165  * make a hypercall.  We hand the address  of the virtqueue so the Host
166  * knows which virtqueue we're talking about.
167  */
kvm_notify(struct virtqueue * vq)168 static void kvm_notify(struct virtqueue *vq)
169 {
170 	struct kvm_vqconfig *config = vq->priv;
171 
172 	kvm_hypercall1(KVM_S390_VIRTIO_NOTIFY, config->address);
173 }
174 
175 /*
176  * This routine finds the first virtqueue described in the configuration of
177  * this device and sets it up.
178  */
kvm_find_vq(struct virtio_device * vdev,unsigned index,void (* callback)(struct virtqueue * vq),const char * name)179 static struct virtqueue *kvm_find_vq(struct virtio_device *vdev,
180 				     unsigned index,
181 				     void (*callback)(struct virtqueue *vq),
182 				     const char *name)
183 {
184 	struct kvm_device *kdev = to_kvmdev(vdev);
185 	struct kvm_vqconfig *config;
186 	struct virtqueue *vq;
187 	int err;
188 
189 	if (index >= kdev->desc->num_vq)
190 		return ERR_PTR(-ENOENT);
191 
192 	config = kvm_vq_config(kdev->desc)+index;
193 
194 	err = vmem_add_mapping(config->address,
195 			       vring_size(config->num,
196 					  KVM_S390_VIRTIO_RING_ALIGN));
197 	if (err)
198 		goto out;
199 
200 	vq = vring_new_virtqueue(config->num, KVM_S390_VIRTIO_RING_ALIGN,
201 				 vdev, true, (void *) config->address,
202 				 kvm_notify, callback, name);
203 	if (!vq) {
204 		err = -ENOMEM;
205 		goto unmap;
206 	}
207 
208 	/*
209 	 * register a callback token
210 	 * The host will sent this via the external interrupt parameter
211 	 */
212 	config->token = (u64) vq;
213 
214 	vq->priv = config;
215 	return vq;
216 unmap:
217 	vmem_remove_mapping(config->address,
218 			    vring_size(config->num,
219 				       KVM_S390_VIRTIO_RING_ALIGN));
220 out:
221 	return ERR_PTR(err);
222 }
223 
kvm_del_vq(struct virtqueue * vq)224 static void kvm_del_vq(struct virtqueue *vq)
225 {
226 	struct kvm_vqconfig *config = vq->priv;
227 
228 	vring_del_virtqueue(vq);
229 	vmem_remove_mapping(config->address,
230 			    vring_size(config->num,
231 				       KVM_S390_VIRTIO_RING_ALIGN));
232 }
233 
kvm_del_vqs(struct virtio_device * vdev)234 static void kvm_del_vqs(struct virtio_device *vdev)
235 {
236 	struct virtqueue *vq, *n;
237 
238 	list_for_each_entry_safe(vq, n, &vdev->vqs, list)
239 		kvm_del_vq(vq);
240 }
241 
kvm_find_vqs(struct virtio_device * vdev,unsigned nvqs,struct virtqueue * vqs[],vq_callback_t * callbacks[],const char * names[])242 static int kvm_find_vqs(struct virtio_device *vdev, unsigned nvqs,
243 			struct virtqueue *vqs[],
244 			vq_callback_t *callbacks[],
245 			const char *names[])
246 {
247 	struct kvm_device *kdev = to_kvmdev(vdev);
248 	int i;
249 
250 	/* We must have this many virtqueues. */
251 	if (nvqs > kdev->desc->num_vq)
252 		return -ENOENT;
253 
254 	for (i = 0; i < nvqs; ++i) {
255 		vqs[i] = kvm_find_vq(vdev, i, callbacks[i], names[i]);
256 		if (IS_ERR(vqs[i]))
257 			goto error;
258 	}
259 	return 0;
260 
261 error:
262 	kvm_del_vqs(vdev);
263 	return PTR_ERR(vqs[i]);
264 }
265 
kvm_bus_name(struct virtio_device * vdev)266 static const char *kvm_bus_name(struct virtio_device *vdev)
267 {
268 	return "";
269 }
270 
271 /*
272  * The config ops structure as defined by virtio config
273  */
274 static struct virtio_config_ops kvm_vq_configspace_ops = {
275 	.get_features = kvm_get_features,
276 	.finalize_features = kvm_finalize_features,
277 	.get = kvm_get,
278 	.set = kvm_set,
279 	.get_status = kvm_get_status,
280 	.set_status = kvm_set_status,
281 	.reset = kvm_reset,
282 	.find_vqs = kvm_find_vqs,
283 	.del_vqs = kvm_del_vqs,
284 	.bus_name = kvm_bus_name,
285 };
286 
287 /*
288  * The root device for the kvm virtio devices.
289  * This makes them appear as /sys/devices/kvm_s390/0,1,2 not /sys/devices/0,1,2.
290  */
291 static struct device *kvm_root;
292 
293 /*
294  * adds a new device and register it with virtio
295  * appropriate drivers are loaded by the device model
296  */
add_kvm_device(struct kvm_device_desc * d,unsigned int offset)297 static void add_kvm_device(struct kvm_device_desc *d, unsigned int offset)
298 {
299 	struct kvm_device *kdev;
300 
301 	kdev = kzalloc(sizeof(*kdev), GFP_KERNEL);
302 	if (!kdev) {
303 		printk(KERN_EMERG "Cannot allocate kvm dev %u type %u\n",
304 		       offset, d->type);
305 		return;
306 	}
307 
308 	kdev->vdev.dev.parent = kvm_root;
309 	kdev->vdev.id.device = d->type;
310 	kdev->vdev.config = &kvm_vq_configspace_ops;
311 	kdev->desc = d;
312 
313 	if (register_virtio_device(&kdev->vdev) != 0) {
314 		printk(KERN_ERR "Failed to register kvm device %u type %u\n",
315 		       offset, d->type);
316 		kfree(kdev);
317 	}
318 }
319 
320 /*
321  * scan_devices() simply iterates through the device page.
322  * The type 0 is reserved to mean "end of devices".
323  */
scan_devices(void)324 static void scan_devices(void)
325 {
326 	unsigned int i;
327 	struct kvm_device_desc *d;
328 
329 	for (i = 0; i < PAGE_SIZE; i += desc_size(d)) {
330 		d = kvm_devices + i;
331 
332 		if (d->type == 0)
333 			break;
334 
335 		add_kvm_device(d, i);
336 	}
337 }
338 
339 /*
340  * match for a kvm device with a specific desc pointer
341  */
match_desc(struct device * dev,void * data)342 static int match_desc(struct device *dev, void *data)
343 {
344 	struct virtio_device *vdev = dev_to_virtio(dev);
345 	struct kvm_device *kdev = to_kvmdev(vdev);
346 
347 	return kdev->desc == data;
348 }
349 
350 /*
351  * hotplug_device tries to find changes in the device page.
352  */
hotplug_devices(struct work_struct * dummy)353 static void hotplug_devices(struct work_struct *dummy)
354 {
355 	unsigned int i;
356 	struct kvm_device_desc *d;
357 	struct device *dev;
358 
359 	for (i = 0; i < PAGE_SIZE; i += desc_size(d)) {
360 		d = kvm_devices + i;
361 
362 		/* end of list */
363 		if (d->type == 0)
364 			break;
365 
366 		/* device already exists */
367 		dev = device_find_child(kvm_root, d, match_desc);
368 		if (dev) {
369 			/* XXX check for hotplug remove */
370 			put_device(dev);
371 			continue;
372 		}
373 
374 		/* new device */
375 		printk(KERN_INFO "Adding new virtio device %p\n", d);
376 		add_kvm_device(d, i);
377 	}
378 }
379 
380 /*
381  * we emulate the request_irq behaviour on top of s390 extints
382  */
kvm_extint_handler(struct ext_code ext_code,unsigned int param32,unsigned long param64)383 static void kvm_extint_handler(struct ext_code ext_code,
384 			       unsigned int param32, unsigned long param64)
385 {
386 	struct virtqueue *vq;
387 	u32 param;
388 
389 	if ((ext_code.subcode & 0xff00) != VIRTIO_SUBCODE_64)
390 		return;
391 	kstat_cpu(smp_processor_id()).irqs[EXTINT_VRT]++;
392 
393 	/* The LSB might be overloaded, we have to mask it */
394 	vq = (struct virtqueue *)(param64 & ~1UL);
395 
396 	/* We use ext_params to decide what this interrupt means */
397 	param = param32 & VIRTIO_PARAM_MASK;
398 
399 	switch (param) {
400 	case VIRTIO_PARAM_CONFIG_CHANGED:
401 	{
402 		struct virtio_driver *drv;
403 		drv = container_of(vq->vdev->dev.driver,
404 				   struct virtio_driver, driver);
405 		if (drv->config_changed)
406 			drv->config_changed(vq->vdev);
407 
408 		break;
409 	}
410 	case VIRTIO_PARAM_DEV_ADD:
411 		schedule_work(&hotplug_work);
412 		break;
413 	case VIRTIO_PARAM_VRING_INTERRUPT:
414 	default:
415 		vring_interrupt(0, vq);
416 		break;
417 	}
418 }
419 
420 /*
421  * For s390-virtio, we expect a page above main storage containing
422  * the virtio configuration. Try to actually load from this area
423  * in order to figure out if the host provides this page.
424  */
test_devices_support(unsigned long addr)425 static int __init test_devices_support(unsigned long addr)
426 {
427 	int ret = -EIO;
428 
429 	asm volatile(
430 		"0:	lura	0,%1\n"
431 		"1:	xgr	%0,%0\n"
432 		"2:\n"
433 		EX_TABLE(0b,2b)
434 		EX_TABLE(1b,2b)
435 		: "+d" (ret)
436 		: "a" (addr)
437 		: "0", "cc");
438 	return ret;
439 }
440 /*
441  * Init function for virtio
442  * devices are in a single page above top of "normal" mem
443  */
kvm_devices_init(void)444 static int __init kvm_devices_init(void)
445 {
446 	int rc;
447 
448 	if (!MACHINE_IS_KVM)
449 		return -ENODEV;
450 
451 	if (test_devices_support(real_memory_size) < 0)
452 		return -ENODEV;
453 
454 	rc = vmem_add_mapping(real_memory_size, PAGE_SIZE);
455 	if (rc)
456 		return rc;
457 
458 	kvm_devices = (void *) real_memory_size;
459 
460 	kvm_root = root_device_register("kvm_s390");
461 	if (IS_ERR(kvm_root)) {
462 		rc = PTR_ERR(kvm_root);
463 		printk(KERN_ERR "Could not register kvm_s390 root device");
464 		vmem_remove_mapping(real_memory_size, PAGE_SIZE);
465 		return rc;
466 	}
467 
468 	INIT_WORK(&hotplug_work, hotplug_devices);
469 
470 	service_subclass_irq_register();
471 	register_external_interrupt(0x2603, kvm_extint_handler);
472 
473 	scan_devices();
474 	return 0;
475 }
476 
477 /* code for early console output with virtio_console */
early_put_chars(u32 vtermno,const char * buf,int count)478 static __init int early_put_chars(u32 vtermno, const char *buf, int count)
479 {
480 	char scratch[17];
481 	unsigned int len = count;
482 
483 	if (len > sizeof(scratch) - 1)
484 		len = sizeof(scratch) - 1;
485 	scratch[len] = '\0';
486 	memcpy(scratch, buf, len);
487 	kvm_hypercall1(KVM_S390_VIRTIO_NOTIFY, __pa(scratch));
488 	return len;
489 }
490 
s390_virtio_console_init(void)491 static int __init s390_virtio_console_init(void)
492 {
493 	if (!MACHINE_IS_KVM)
494 		return -ENODEV;
495 	return virtio_cons_early_init(early_put_chars);
496 }
497 console_initcall(s390_virtio_console_init);
498 
499 
500 /*
501  * We do this after core stuff, but before the drivers.
502  */
503 postcore_initcall(kvm_devices_init);
504