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; | ||||
| #define VFIO_DEVICE_FLAGS_RESET	(1 << 0)	/* Device supports reset */ | ||||
| #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_irqs;	/* Max IRQ index + 1 */ | ||||
| }; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Antonios Motakis
				Antonios Motakis