cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

vfio_platform.c (2224B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Copyright (C) 2013 - Virtual Open Systems
      4 * Author: Antonios Motakis <a.motakis@virtualopensystems.com>
      5 */
      6
      7#include <linux/module.h>
      8#include <linux/slab.h>
      9#include <linux/vfio.h>
     10#include <linux/platform_device.h>
     11
     12#include "vfio_platform_private.h"
     13
     14#define DRIVER_VERSION  "0.10"
     15#define DRIVER_AUTHOR   "Antonios Motakis <a.motakis@virtualopensystems.com>"
     16#define DRIVER_DESC     "VFIO for platform devices - User Level meta-driver"
     17
     18static bool reset_required = true;
     19module_param(reset_required, bool, 0444);
     20MODULE_PARM_DESC(reset_required, "override reset requirement (default: 1)");
     21
     22/* probing devices from the linux platform bus */
     23
     24static struct resource *get_platform_resource(struct vfio_platform_device *vdev,
     25					      int num)
     26{
     27	struct platform_device *dev = (struct platform_device *) vdev->opaque;
     28
     29	return platform_get_mem_or_io(dev, num);
     30}
     31
     32static int get_platform_irq(struct vfio_platform_device *vdev, int i)
     33{
     34	struct platform_device *pdev = (struct platform_device *) vdev->opaque;
     35
     36	return platform_get_irq_optional(pdev, i);
     37}
     38
     39static int vfio_platform_probe(struct platform_device *pdev)
     40{
     41	struct vfio_platform_device *vdev;
     42	int ret;
     43
     44	vdev = kzalloc(sizeof(*vdev), GFP_KERNEL);
     45	if (!vdev)
     46		return -ENOMEM;
     47
     48	vdev->opaque = (void *) pdev;
     49	vdev->name = pdev->name;
     50	vdev->flags = VFIO_DEVICE_FLAGS_PLATFORM;
     51	vdev->get_resource = get_platform_resource;
     52	vdev->get_irq = get_platform_irq;
     53	vdev->reset_required = reset_required;
     54
     55	ret = vfio_platform_probe_common(vdev, &pdev->dev);
     56	if (ret) {
     57		kfree(vdev);
     58		return ret;
     59	}
     60	dev_set_drvdata(&pdev->dev, vdev);
     61	return 0;
     62}
     63
     64static int vfio_platform_remove(struct platform_device *pdev)
     65{
     66	struct vfio_platform_device *vdev = dev_get_drvdata(&pdev->dev);
     67
     68	vfio_platform_remove_common(vdev);
     69	kfree(vdev);
     70	return 0;
     71}
     72
     73static struct platform_driver vfio_platform_driver = {
     74	.probe		= vfio_platform_probe,
     75	.remove		= vfio_platform_remove,
     76	.driver	= {
     77		.name	= "vfio-platform",
     78	},
     79	.driver_managed_dma = true,
     80};
     81
     82module_platform_driver(vfio_platform_driver);
     83
     84MODULE_VERSION(DRIVER_VERSION);
     85MODULE_LICENSE("GPL v2");
     86MODULE_AUTHOR(DRIVER_AUTHOR);
     87MODULE_DESCRIPTION(DRIVER_DESC);