linux/drivers/vfio/platform/vfio_platform.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2013 - Virtual Open Systems
   3 * Author: Antonios Motakis <a.motakis@virtualopensystems.com>
   4 *
   5 * This program is free software; you can redistribute it and/or modify
   6 * it under the terms of the GNU General Public License, version 2, as
   7 * published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope that it will be useful,
  10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12 * GNU General Public License for more details.
  13 */
  14
  15#include <linux/module.h>
  16#include <linux/slab.h>
  17#include <linux/vfio.h>
  18#include <linux/platform_device.h>
  19
  20#include "vfio_platform_private.h"
  21
  22#define DRIVER_VERSION  "0.10"
  23#define DRIVER_AUTHOR   "Antonios Motakis <a.motakis@virtualopensystems.com>"
  24#define DRIVER_DESC     "VFIO for platform devices - User Level meta-driver"
  25
  26/* probing devices from the linux platform bus */
  27
  28static struct resource *get_platform_resource(struct vfio_platform_device *vdev,
  29                                              int num)
  30{
  31        struct platform_device *dev = (struct platform_device *) vdev->opaque;
  32        int i;
  33
  34        for (i = 0; i < dev->num_resources; i++) {
  35                struct resource *r = &dev->resource[i];
  36
  37                if (resource_type(r) & (IORESOURCE_MEM|IORESOURCE_IO)) {
  38                        if (!num)
  39                                return r;
  40
  41                        num--;
  42                }
  43        }
  44        return NULL;
  45}
  46
  47static int get_platform_irq(struct vfio_platform_device *vdev, int i)
  48{
  49        struct platform_device *pdev = (struct platform_device *) vdev->opaque;
  50
  51        return platform_get_irq(pdev, i);
  52}
  53
  54static int vfio_platform_probe(struct platform_device *pdev)
  55{
  56        struct vfio_platform_device *vdev;
  57        int ret;
  58
  59        vdev = kzalloc(sizeof(*vdev), GFP_KERNEL);
  60        if (!vdev)
  61                return -ENOMEM;
  62
  63        vdev->opaque = (void *) pdev;
  64        vdev->name = pdev->name;
  65        vdev->flags = VFIO_DEVICE_FLAGS_PLATFORM;
  66        vdev->get_resource = get_platform_resource;
  67        vdev->get_irq = get_platform_irq;
  68        vdev->parent_module = THIS_MODULE;
  69
  70        ret = vfio_platform_probe_common(vdev, &pdev->dev);
  71        if (ret)
  72                kfree(vdev);
  73
  74        return ret;
  75}
  76
  77static int vfio_platform_remove(struct platform_device *pdev)
  78{
  79        struct vfio_platform_device *vdev;
  80
  81        vdev = vfio_platform_remove_common(&pdev->dev);
  82        if (vdev) {
  83                kfree(vdev);
  84                return 0;
  85        }
  86
  87        return -EINVAL;
  88}
  89
  90static struct platform_driver vfio_platform_driver = {
  91        .probe          = vfio_platform_probe,
  92        .remove         = vfio_platform_remove,
  93        .driver = {
  94                .name   = "vfio-platform",
  95        },
  96};
  97
  98module_platform_driver(vfio_platform_driver);
  99
 100MODULE_VERSION(DRIVER_VERSION);
 101MODULE_LICENSE("GPL v2");
 102MODULE_AUTHOR(DRIVER_AUTHOR);
 103MODULE_DESCRIPTION(DRIVER_DESC);
 104