8ac13175cb
A parent device might create different types of mediated devices. For example, a mediated device could be created by the parent device with full isolation and protection provided by the IOMMU. One usage case could be found on Intel platforms where a mediated device is an assignable subset of a PCI, the DMA requests on behalf of it are all tagged with a PASID. Since IOMMU supports PASID-granular translations (scalable mode in VT-d 3.0), this mediated device could be individually protected and isolated by an IOMMU. This patch adds a new member in the struct mdev_device to indicate that the mediated device represented by mdev could be isolated and protected by attaching a domain to a device represented by mdev->iommu_device. It also adds a helper to add or set the iommu device. * mdev_device->iommu_device - This, if set, indicates that the mediated device could be fully isolated and protected by IOMMU via attaching an iommu domain to this device. If empty, it indicates using vendor defined isolation, hence bypass IOMMU. * mdev_set/get_iommu_device(dev, iommu_device) - Set or get the iommu device which represents this mdev in IOMMU's device scope. Drivers don't need to set the iommu device if it uses vendor defined isolation. Cc: Ashok Raj <ashok.raj@intel.com> Cc: Jacob Pan <jacob.jun.pan@linux.intel.com> Cc: Kevin Tian <kevin.tian@intel.com> Cc: Liu Yi L <yi.l.liu@intel.com> Suggested-by: Kevin Tian <kevin.tian@intel.com> Suggested-by: Alex Williamson <alex.williamson@redhat.com> Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com> Reviewed-by: Jean-Philippe Brucker <jean-philippe.brucker@arm.com> Reviewed-by: Kirti Wankhede <kwankhede@nvidia.com> Acked-by: Alex Williamson <alex.williamson@redhat.com> Signed-off-by: Joerg Roedel <jroedel@suse.de>
67 lines
1.8 KiB
C
67 lines
1.8 KiB
C
/*
|
|
* Mediated device interal definitions
|
|
*
|
|
* Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
|
|
* Author: Neo Jia <cjia@nvidia.com>
|
|
* Kirti Wankhede <kwankhede@nvidia.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.
|
|
*/
|
|
|
|
#ifndef MDEV_PRIVATE_H
|
|
#define MDEV_PRIVATE_H
|
|
|
|
int mdev_bus_register(void);
|
|
void mdev_bus_unregister(void);
|
|
|
|
struct mdev_parent {
|
|
struct device *dev;
|
|
const struct mdev_parent_ops *ops;
|
|
struct kref ref;
|
|
struct list_head next;
|
|
struct kset *mdev_types_kset;
|
|
struct list_head type_list;
|
|
};
|
|
|
|
struct mdev_device {
|
|
struct device dev;
|
|
struct mdev_parent *parent;
|
|
guid_t uuid;
|
|
void *driver_data;
|
|
struct kref ref;
|
|
struct list_head next;
|
|
struct kobject *type_kobj;
|
|
struct device *iommu_device;
|
|
bool active;
|
|
};
|
|
|
|
#define to_mdev_device(dev) container_of(dev, struct mdev_device, dev)
|
|
#define dev_is_mdev(d) ((d)->bus == &mdev_bus_type)
|
|
|
|
struct mdev_type {
|
|
struct kobject kobj;
|
|
struct kobject *devices_kobj;
|
|
struct mdev_parent *parent;
|
|
struct list_head next;
|
|
struct attribute_group *group;
|
|
};
|
|
|
|
#define to_mdev_type_attr(_attr) \
|
|
container_of(_attr, struct mdev_type_attribute, attr)
|
|
#define to_mdev_type(_kobj) \
|
|
container_of(_kobj, struct mdev_type, kobj)
|
|
|
|
int parent_create_sysfs_files(struct mdev_parent *parent);
|
|
void parent_remove_sysfs_files(struct mdev_parent *parent);
|
|
|
|
int mdev_create_sysfs_files(struct device *dev, struct mdev_type *type);
|
|
void mdev_remove_sysfs_files(struct device *dev, struct mdev_type *type);
|
|
|
|
int mdev_device_create(struct kobject *kobj,
|
|
struct device *dev, const guid_t *uuid);
|
|
int mdev_device_remove(struct device *dev, bool force_remove);
|
|
|
|
#endif /* MDEV_PRIVATE_H */
|