Merge tag 'perf-core-2023-04-27' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-block.git] / include / linux / mdev.h
CommitLineData
d2912cb1 1/* SPDX-License-Identifier: GPL-2.0-only */
7b96953b
KW
2/*
3 * Mediated device definition
4 *
5 * Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
6 * Author: Neo Jia <cjia@nvidia.com>
7 * Kirti Wankhede <kwankhede@nvidia.com>
7b96953b
KW
8 */
9
10#ifndef MDEV_H
11#define MDEV_H
12
bdef2b78
CH
13#include <linux/device.h>
14#include <linux/uuid.h>
15
417fd5bf
JG
16struct mdev_type;
17
2a3d15f2
JG
18struct mdev_device {
19 struct device dev;
2a3d15f2 20 guid_t uuid;
2a3d15f2 21 struct list_head next;
417fd5bf 22 struct mdev_type *type;
2a3d15f2
JG
23 bool active;
24};
25
da44c340
CH
26struct mdev_type {
27 /* set by the driver before calling mdev_register parent: */
28 const char *sysfs_name;
0bc79069 29 const char *pretty_name;
da44c340
CH
30
31 /* set by the core, can be used drivers */
32 struct mdev_parent *parent;
33
34 /* internal only */
35 struct kobject kobj;
36 struct kobject *devices_kobj;
37};
38
89345d51
CH
39/* embedded into the struct device that the mdev devices hang off */
40struct mdev_parent {
41 struct device *dev;
42 struct mdev_driver *mdev_driver;
43 struct kset *mdev_types_kset;
89345d51
CH
44 /* Synchronize device creation/removal with parent unregistration */
45 struct rw_semaphore unreg_sem;
da44c340
CH
46 struct mdev_type **types;
47 unsigned int nr_types;
9c799c22 48 atomic_t available_instances;
89345d51
CH
49};
50
2a3d15f2
JG
51static inline struct mdev_device *to_mdev_device(struct device *dev)
52{
53 return container_of(dev, struct mdev_device, dev);
54}
7b96953b 55
7b96953b
KW
56/**
57 * struct mdev_driver - Mediated device driver
290aac5d 58 * @device_api: string to return for the device_api sysfs
9c799c22 59 * @max_instances: maximum number of instances supported (optional)
7b96953b
KW
60 * @probe: called when new device created
61 * @remove: called when device removed
f2fbc72e 62 * @get_available: Return the max number of instances that can be created
685a1537 63 * @show_description: Print a description of the mtype
7b96953b 64 * @driver: device driver structure
7b96953b
KW
65 **/
66struct mdev_driver {
290aac5d 67 const char *device_api;
9c799c22 68 unsigned int max_instances;
2a3d15f2
JG
69 int (*probe)(struct mdev_device *dev);
70 void (*remove)(struct mdev_device *dev);
f2fbc72e 71 unsigned int (*get_available)(struct mdev_type *mtype);
685a1537 72 ssize_t (*show_description)(struct mdev_type *mtype, char *buf);
7b96953b
KW
73 struct device_driver driver;
74};
75
89345d51 76int mdev_register_parent(struct mdev_parent *parent, struct device *dev,
da44c340
CH
77 struct mdev_driver *mdev_driver, struct mdev_type **types,
78 unsigned int nr_types);
89345d51 79void mdev_unregister_parent(struct mdev_parent *parent);
7b96953b 80
91b9969d 81int mdev_register_driver(struct mdev_driver *drv);
50732af3 82void mdev_unregister_driver(struct mdev_driver *drv);
7b96953b 83
2a3d15f2
JG
84static inline struct device *mdev_dev(struct mdev_device *mdev)
85{
86 return &mdev->dev;
87}
9372e6fe 88
7b96953b 89#endif /* MDEV_H */