vfio: platform: probe to devices on the platform bus
Driver to bind to Linux platform devices, and callbacks to discover their resources to be used by the main VFIO PLATFORM code. Signed-off-by: Antonios Motakis <a.motakis@virtualopensystems.com> Signed-off-by: Baptiste Reynal <b.reynal@virtualopensystems.com> Reviewed-by: Eric Auger <eric.auger@linaro.org> Tested-by: Eric Auger <eric.auger@linaro.org> Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
This commit is contained in:
		
					parent
					
						
							
								de49fc0d99
							
						
					
				
			
			
				commit
				
					
						9df85aaa43
					
				
			
		
					 2 changed files with 104 additions and 0 deletions
				
			
		
							
								
								
									
										103
									
								
								drivers/vfio/platform/vfio_platform.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								drivers/vfio/platform/vfio_platform.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,103 @@ | ||||||
|  | /*
 | ||||||
|  |  * Copyright (C) 2013 - Virtual Open Systems | ||||||
|  |  * Author: Antonios Motakis <a.motakis@virtualopensystems.com> | ||||||
|  |  * | ||||||
|  |  * This program is free software; you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License, version 2, as | ||||||
|  |  * published by the Free Software Foundation. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <linux/module.h> | ||||||
|  | #include <linux/slab.h> | ||||||
|  | #include <linux/vfio.h> | ||||||
|  | #include <linux/platform_device.h> | ||||||
|  | 
 | ||||||
|  | #include "vfio_platform_private.h" | ||||||
|  | 
 | ||||||
|  | #define DRIVER_VERSION  "0.10" | ||||||
|  | #define DRIVER_AUTHOR   "Antonios Motakis <a.motakis@virtualopensystems.com>" | ||||||
|  | #define DRIVER_DESC     "VFIO for platform devices - User Level meta-driver" | ||||||
|  | 
 | ||||||
|  | /* probing devices from the linux platform bus */ | ||||||
|  | 
 | ||||||
|  | static struct resource *get_platform_resource(struct vfio_platform_device *vdev, | ||||||
|  | 					      int num) | ||||||
|  | { | ||||||
|  | 	struct platform_device *dev = (struct platform_device *) vdev->opaque; | ||||||
|  | 	int i; | ||||||
|  | 
 | ||||||
|  | 	for (i = 0; i < dev->num_resources; i++) { | ||||||
|  | 		struct resource *r = &dev->resource[i]; | ||||||
|  | 
 | ||||||
|  | 		if (resource_type(r) & (IORESOURCE_MEM|IORESOURCE_IO)) { | ||||||
|  | 			if (!num) | ||||||
|  | 				return r; | ||||||
|  | 
 | ||||||
|  | 			num--; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return NULL; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static int get_platform_irq(struct vfio_platform_device *vdev, int i) | ||||||
|  | { | ||||||
|  | 	struct platform_device *pdev = (struct platform_device *) vdev->opaque; | ||||||
|  | 
 | ||||||
|  | 	return platform_get_irq(pdev, i); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static int vfio_platform_probe(struct platform_device *pdev) | ||||||
|  | { | ||||||
|  | 	struct vfio_platform_device *vdev; | ||||||
|  | 	int ret; | ||||||
|  | 
 | ||||||
|  | 	vdev = kzalloc(sizeof(*vdev), GFP_KERNEL); | ||||||
|  | 	if (!vdev) | ||||||
|  | 		return -ENOMEM; | ||||||
|  | 
 | ||||||
|  | 	vdev->opaque = (void *) pdev; | ||||||
|  | 	vdev->name = pdev->name; | ||||||
|  | 	vdev->flags = VFIO_DEVICE_FLAGS_PLATFORM; | ||||||
|  | 	vdev->get_resource = get_platform_resource; | ||||||
|  | 	vdev->get_irq = get_platform_irq; | ||||||
|  | 
 | ||||||
|  | 	ret = vfio_platform_probe_common(vdev, &pdev->dev); | ||||||
|  | 	if (ret) | ||||||
|  | 		kfree(vdev); | ||||||
|  | 
 | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static int vfio_platform_remove(struct platform_device *pdev) | ||||||
|  | { | ||||||
|  | 	struct vfio_platform_device *vdev; | ||||||
|  | 
 | ||||||
|  | 	vdev = vfio_platform_remove_common(&pdev->dev); | ||||||
|  | 	if (vdev) { | ||||||
|  | 		kfree(vdev); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return -EINVAL; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static struct platform_driver vfio_platform_driver = { | ||||||
|  | 	.probe		= vfio_platform_probe, | ||||||
|  | 	.remove		= vfio_platform_remove, | ||||||
|  | 	.driver	= { | ||||||
|  | 		.name	= "vfio-platform", | ||||||
|  | 		.owner	= THIS_MODULE, | ||||||
|  | 	}, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | module_platform_driver(vfio_platform_driver); | ||||||
|  | 
 | ||||||
|  | MODULE_VERSION(DRIVER_VERSION); | ||||||
|  | MODULE_LICENSE("GPL v2"); | ||||||
|  | MODULE_AUTHOR(DRIVER_AUTHOR); | ||||||
|  | MODULE_DESCRIPTION(DRIVER_DESC); | ||||||
|  | @ -160,6 +160,7 @@ struct vfio_device_info { | ||||||
| 	__u32	flags; | 	__u32	flags; | ||||||
| #define VFIO_DEVICE_FLAGS_RESET	(1 << 0)	/* Device supports reset */ | #define VFIO_DEVICE_FLAGS_RESET	(1 << 0)	/* Device supports reset */ | ||||||
| #define VFIO_DEVICE_FLAGS_PCI	(1 << 1)	/* vfio-pci device */ | #define VFIO_DEVICE_FLAGS_PCI	(1 << 1)	/* vfio-pci device */ | ||||||
|  | #define VFIO_DEVICE_FLAGS_PLATFORM (1 << 2)	/* vfio-platform device */ | ||||||
| 	__u32	num_regions;	/* Max region index + 1 */ | 	__u32	num_regions;	/* Max region index + 1 */ | ||||||
| 	__u32	num_irqs;	/* Max IRQ index + 1 */ | 	__u32	num_irqs;	/* Max IRQ index + 1 */ | ||||||
| }; | }; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Antonios Motakis
				Antonios Motakis