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