2019-06-04 08:11:33 +00:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
2016-11-16 20:46:13 +00:00
|
|
|
/*
|
|
|
|
* Mediated device definition
|
|
|
|
*
|
|
|
|
* Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
|
|
|
|
* Author: Neo Jia <cjia@nvidia.com>
|
|
|
|
* Kirti Wankhede <kwankhede@nvidia.com>
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef MDEV_H
|
|
|
|
#define MDEV_H
|
|
|
|
|
2022-09-23 09:26:41 +00:00
|
|
|
#include <linux/device.h>
|
|
|
|
#include <linux/uuid.h>
|
|
|
|
|
2021-04-06 19:40:28 +00:00
|
|
|
struct mdev_type;
|
|
|
|
|
2021-04-06 19:40:26 +00:00
|
|
|
struct mdev_device {
|
|
|
|
struct device dev;
|
|
|
|
guid_t uuid;
|
|
|
|
struct list_head next;
|
2021-04-06 19:40:28 +00:00
|
|
|
struct mdev_type *type;
|
2021-04-06 19:40:26 +00:00
|
|
|
bool active;
|
|
|
|
};
|
|
|
|
|
2022-09-23 09:26:43 +00:00
|
|
|
struct mdev_type {
|
|
|
|
/* set by the driver before calling mdev_register parent: */
|
|
|
|
const char *sysfs_name;
|
|
|
|
|
|
|
|
/* set by the core, can be used drivers */
|
|
|
|
struct mdev_parent *parent;
|
|
|
|
|
|
|
|
/* internal only */
|
|
|
|
struct kobject kobj;
|
|
|
|
struct kobject *devices_kobj;
|
|
|
|
};
|
|
|
|
|
2022-09-23 09:26:42 +00:00
|
|
|
/* embedded into the struct device that the mdev devices hang off */
|
|
|
|
struct mdev_parent {
|
|
|
|
struct device *dev;
|
|
|
|
struct mdev_driver *mdev_driver;
|
|
|
|
struct kset *mdev_types_kset;
|
|
|
|
/* Synchronize device creation/removal with parent unregistration */
|
|
|
|
struct rw_semaphore unreg_sem;
|
2022-09-23 09:26:43 +00:00
|
|
|
struct mdev_type **types;
|
|
|
|
unsigned int nr_types;
|
2022-09-23 09:26:42 +00:00
|
|
|
};
|
|
|
|
|
2021-04-06 19:40:26 +00:00
|
|
|
static inline struct mdev_device *to_mdev_device(struct device *dev)
|
|
|
|
{
|
|
|
|
return container_of(dev, struct mdev_device, dev);
|
|
|
|
}
|
2016-11-16 20:46:13 +00:00
|
|
|
|
|
|
|
/* interface for exporting mdev supported type attributes */
|
|
|
|
struct mdev_type_attribute {
|
|
|
|
struct attribute attr;
|
vfio/mdev: Correct the function signatures for the mdev_type_attributes
The driver core standard is to pass in the properly typed object, the
properly typed attribute and the buffer data. It stems from the root
kobject method:
ssize_t (*show)(struct kobject *kobj, struct kobj_attribute *attr,..)
Each subclass of kobject should provide their own function with the same
signature but more specific types, eg struct device uses:
ssize_t (*show)(struct device *dev, struct device_attribute *attr,..)
In this case the existing signature is:
ssize_t (*show)(struct kobject *kobj, struct device *dev,..)
Where kobj is a 'struct mdev_type *' and dev is 'mdev_type->parent->dev'.
Change the mdev_type related sysfs attribute functions to:
ssize_t (*show)(struct mdev_type *mtype, struct mdev_type_attribute *attr,..)
In order to restore type safety and match the driver core standard
There are no current users of 'attr', but if it is ever needed it would be
hard to add in retroactively, so do it now.
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Message-Id: <18-v2-d36939638fc6+d54-vfio2_jgg@nvidia.com>
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
2021-04-06 19:40:41 +00:00
|
|
|
ssize_t (*show)(struct mdev_type *mtype,
|
|
|
|
struct mdev_type_attribute *attr, char *buf);
|
|
|
|
ssize_t (*store)(struct mdev_type *mtype,
|
|
|
|
struct mdev_type_attribute *attr, const char *buf,
|
|
|
|
size_t count);
|
2016-11-16 20:46:13 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#define MDEV_TYPE_ATTR_RO(_name) \
|
|
|
|
struct mdev_type_attribute mdev_type_attr_##_name = __ATTR_RO(_name)
|
|
|
|
#define MDEV_TYPE_ATTR_WO(_name) \
|
|
|
|
struct mdev_type_attribute mdev_type_attr_##_name = __ATTR_WO(_name)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* struct mdev_driver - Mediated device driver
|
2022-09-23 09:26:48 +00:00
|
|
|
* @device_api: string to return for the device_api sysfs
|
2016-11-16 20:46:13 +00:00
|
|
|
* @probe: called when new device created
|
|
|
|
* @remove: called when device removed
|
2022-09-23 09:26:43 +00:00
|
|
|
* @types_attrs: attributes to the type kobjects.
|
2016-11-16 20:46:13 +00:00
|
|
|
* @driver: device driver structure
|
|
|
|
**/
|
|
|
|
struct mdev_driver {
|
2022-09-23 09:26:48 +00:00
|
|
|
const char *device_api;
|
2021-04-06 19:40:26 +00:00
|
|
|
int (*probe)(struct mdev_device *dev);
|
|
|
|
void (*remove)(struct mdev_device *dev);
|
2022-09-23 09:26:43 +00:00
|
|
|
const struct attribute * const *types_attrs;
|
2016-11-16 20:46:13 +00:00
|
|
|
struct device_driver driver;
|
|
|
|
};
|
|
|
|
|
2022-09-23 09:26:42 +00:00
|
|
|
int mdev_register_parent(struct mdev_parent *parent, struct device *dev,
|
2022-09-23 09:26:43 +00:00
|
|
|
struct mdev_driver *mdev_driver, struct mdev_type **types,
|
|
|
|
unsigned int nr_types);
|
2022-09-23 09:26:42 +00:00
|
|
|
void mdev_unregister_parent(struct mdev_parent *parent);
|
2016-11-16 20:46:13 +00:00
|
|
|
|
2021-04-06 19:40:27 +00:00
|
|
|
int mdev_register_driver(struct mdev_driver *drv);
|
2019-04-30 22:49:30 +00:00
|
|
|
void mdev_unregister_driver(struct mdev_driver *drv);
|
2016-11-16 20:46:13 +00:00
|
|
|
|
2021-04-06 19:40:26 +00:00
|
|
|
static inline struct device *mdev_dev(struct mdev_device *mdev)
|
|
|
|
{
|
|
|
|
return &mdev->dev;
|
|
|
|
}
|
2016-12-30 15:13:41 +00:00
|
|
|
|
2016-11-16 20:46:13 +00:00
|
|
|
#endif /* MDEV_H */
|