linux/include/linux/vfio.h
<<
>>
Prefs
   1/*
   2 * VFIO API definition
   3 *
   4 * Copyright (C) 2012 Red Hat, Inc.  All rights reserved.
   5 *     Author: Alex Williamson <alex.williamson@redhat.com>
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License version 2 as
   9 * published by the Free Software Foundation.
  10 */
  11#ifndef VFIO_H
  12#define VFIO_H
  13
  14
  15#include <linux/iommu.h>
  16#include <linux/mm.h>
  17#include <uapi/linux/vfio.h>
  18
  19/**
  20 * struct vfio_device_ops - VFIO bus driver device callbacks
  21 *
  22 * @open: Called when userspace creates new file descriptor for device
  23 * @release: Called when userspace releases file descriptor for device
  24 * @read: Perform read(2) on device file descriptor
  25 * @write: Perform write(2) on device file descriptor
  26 * @ioctl: Perform ioctl(2) on device file descriptor, supporting VFIO_DEVICE_*
  27 *         operations documented below
  28 * @mmap: Perform mmap(2) on a region of the device file descriptor
  29 */
  30struct vfio_device_ops {
  31        char    *name;
  32        int     (*open)(void *device_data);
  33        void    (*release)(void *device_data);
  34        ssize_t (*read)(void *device_data, char __user *buf,
  35                        size_t count, loff_t *ppos);
  36        ssize_t (*write)(void *device_data, const char __user *buf,
  37                         size_t count, loff_t *size);
  38        long    (*ioctl)(void *device_data, unsigned int cmd,
  39                         unsigned long arg);
  40        int     (*mmap)(void *device_data, struct vm_area_struct *vma);
  41};
  42
  43extern int vfio_add_group_dev(struct device *dev,
  44                              const struct vfio_device_ops *ops,
  45                              void *device_data);
  46
  47extern void *vfio_del_group_dev(struct device *dev);
  48
  49/**
  50 * struct vfio_iommu_driver_ops - VFIO IOMMU driver callbacks
  51 */
  52struct vfio_iommu_driver_ops {
  53        char            *name;
  54        struct module   *owner;
  55        void            *(*open)(unsigned long arg);
  56        void            (*release)(void *iommu_data);
  57        ssize_t         (*read)(void *iommu_data, char __user *buf,
  58                                size_t count, loff_t *ppos);
  59        ssize_t         (*write)(void *iommu_data, const char __user *buf,
  60                                 size_t count, loff_t *size);
  61        long            (*ioctl)(void *iommu_data, unsigned int cmd,
  62                                 unsigned long arg);
  63        int             (*mmap)(void *iommu_data, struct vm_area_struct *vma);
  64        int             (*attach_group)(void *iommu_data,
  65                                        struct iommu_group *group);
  66        void            (*detach_group)(void *iommu_data,
  67                                        struct iommu_group *group);
  68
  69};
  70
  71extern int vfio_register_iommu_driver(const struct vfio_iommu_driver_ops *ops);
  72
  73extern void vfio_unregister_iommu_driver(
  74                                const struct vfio_iommu_driver_ops *ops);
  75
  76/**
  77 * offsetofend(TYPE, MEMBER)
  78 *
  79 * @TYPE: The type of the structure
  80 * @MEMBER: The member within the structure to get the end offset of
  81 *
  82 * Simple helper macro for dealing with variable sized structures passed
  83 * from user space.  This allows us to easily determine if the provided
  84 * structure is sized to include various fields.
  85 */
  86#define offsetofend(TYPE, MEMBER) ({                            \
  87        TYPE tmp;                                               \
  88        offsetof(TYPE, MEMBER) + sizeof(tmp.MEMBER); })         \
  89
  90#endif /* VFIO_H */
  91
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.