xref: /OK3568_Linux_fs/kernel/drivers/vfio/mdev/mdev_private.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Mediated device interal definitions
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
6*4882a593Smuzhiyun  *     Author: Neo Jia <cjia@nvidia.com>
7*4882a593Smuzhiyun  *             Kirti Wankhede <kwankhede@nvidia.com>
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #ifndef MDEV_PRIVATE_H
11*4882a593Smuzhiyun #define MDEV_PRIVATE_H
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun int  mdev_bus_register(void);
14*4882a593Smuzhiyun void mdev_bus_unregister(void);
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun struct mdev_parent {
17*4882a593Smuzhiyun 	struct device *dev;
18*4882a593Smuzhiyun 	const struct mdev_parent_ops *ops;
19*4882a593Smuzhiyun 	struct kref ref;
20*4882a593Smuzhiyun 	struct list_head next;
21*4882a593Smuzhiyun 	struct kset *mdev_types_kset;
22*4882a593Smuzhiyun 	struct list_head type_list;
23*4882a593Smuzhiyun 	/* Synchronize device creation/removal with parent unregistration */
24*4882a593Smuzhiyun 	struct rw_semaphore unreg_sem;
25*4882a593Smuzhiyun };
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun struct mdev_device {
28*4882a593Smuzhiyun 	struct device dev;
29*4882a593Smuzhiyun 	struct mdev_parent *parent;
30*4882a593Smuzhiyun 	guid_t uuid;
31*4882a593Smuzhiyun 	void *driver_data;
32*4882a593Smuzhiyun 	struct list_head next;
33*4882a593Smuzhiyun 	struct kobject *type_kobj;
34*4882a593Smuzhiyun 	struct device *iommu_device;
35*4882a593Smuzhiyun 	bool active;
36*4882a593Smuzhiyun };
37*4882a593Smuzhiyun 
to_mdev_device(struct device * dev)38*4882a593Smuzhiyun static inline struct mdev_device *to_mdev_device(struct device *dev)
39*4882a593Smuzhiyun {
40*4882a593Smuzhiyun 	return container_of(dev, struct mdev_device, dev);
41*4882a593Smuzhiyun }
42*4882a593Smuzhiyun #define dev_is_mdev(d)		((d)->bus == &mdev_bus_type)
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun struct mdev_type {
45*4882a593Smuzhiyun 	struct kobject kobj;
46*4882a593Smuzhiyun 	struct kobject *devices_kobj;
47*4882a593Smuzhiyun 	struct mdev_parent *parent;
48*4882a593Smuzhiyun 	struct list_head next;
49*4882a593Smuzhiyun 	struct attribute_group *group;
50*4882a593Smuzhiyun };
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun #define to_mdev_type_attr(_attr)	\
53*4882a593Smuzhiyun 	container_of(_attr, struct mdev_type_attribute, attr)
54*4882a593Smuzhiyun #define to_mdev_type(_kobj)		\
55*4882a593Smuzhiyun 	container_of(_kobj, struct mdev_type, kobj)
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun int  parent_create_sysfs_files(struct mdev_parent *parent);
58*4882a593Smuzhiyun void parent_remove_sysfs_files(struct mdev_parent *parent);
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun int  mdev_create_sysfs_files(struct device *dev, struct mdev_type *type);
61*4882a593Smuzhiyun void mdev_remove_sysfs_files(struct device *dev, struct mdev_type *type);
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun int  mdev_device_create(struct kobject *kobj,
64*4882a593Smuzhiyun 			struct device *dev, const guid_t *uuid);
65*4882a593Smuzhiyun int  mdev_device_remove(struct device *dev);
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun #endif /* MDEV_PRIVATE_H */
68