xref: /linux/include/linux/mdev.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
27b96953bSKirti Wankhede /*
37b96953bSKirti Wankhede  * Mediated device definition
47b96953bSKirti Wankhede  *
57b96953bSKirti Wankhede  * Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
67b96953bSKirti Wankhede  *     Author: Neo Jia <cjia@nvidia.com>
77b96953bSKirti Wankhede  *             Kirti Wankhede <kwankhede@nvidia.com>
87b96953bSKirti Wankhede  */
97b96953bSKirti Wankhede 
107b96953bSKirti Wankhede #ifndef MDEV_H
117b96953bSKirti Wankhede #define MDEV_H
127b96953bSKirti Wankhede 
13bdef2b78SChristoph Hellwig #include <linux/device.h>
14bdef2b78SChristoph Hellwig #include <linux/uuid.h>
15bdef2b78SChristoph Hellwig 
16417fd5bfSJason Gunthorpe struct mdev_type;
17417fd5bfSJason Gunthorpe 
182a3d15f2SJason Gunthorpe struct mdev_device {
192a3d15f2SJason Gunthorpe 	struct device dev;
202a3d15f2SJason Gunthorpe 	guid_t uuid;
212a3d15f2SJason Gunthorpe 	struct list_head next;
22417fd5bfSJason Gunthorpe 	struct mdev_type *type;
232a3d15f2SJason Gunthorpe 	bool active;
242a3d15f2SJason Gunthorpe };
252a3d15f2SJason Gunthorpe 
26da44c340SChristoph Hellwig struct mdev_type {
27da44c340SChristoph Hellwig 	/* set by the driver before calling mdev_register parent: */
28da44c340SChristoph Hellwig 	const char *sysfs_name;
290bc79069SChristoph Hellwig 	const char *pretty_name;
30da44c340SChristoph Hellwig 
31da44c340SChristoph Hellwig 	/* set by the core, can be used drivers */
32da44c340SChristoph Hellwig 	struct mdev_parent *parent;
33da44c340SChristoph Hellwig 
34da44c340SChristoph Hellwig 	/* internal only */
35da44c340SChristoph Hellwig 	struct kobject kobj;
36da44c340SChristoph Hellwig 	struct kobject *devices_kobj;
37da44c340SChristoph Hellwig };
38da44c340SChristoph Hellwig 
3989345d51SChristoph Hellwig /* embedded into the struct device that the mdev devices hang off */
4089345d51SChristoph Hellwig struct mdev_parent {
4189345d51SChristoph Hellwig 	struct device *dev;
4289345d51SChristoph Hellwig 	struct mdev_driver *mdev_driver;
4389345d51SChristoph Hellwig 	struct kset *mdev_types_kset;
4489345d51SChristoph Hellwig 	/* Synchronize device creation/removal with parent unregistration */
4589345d51SChristoph Hellwig 	struct rw_semaphore unreg_sem;
46da44c340SChristoph Hellwig 	struct mdev_type **types;
47da44c340SChristoph Hellwig 	unsigned int nr_types;
48*9c799c22SJason Gunthorpe 	atomic_t available_instances;
4989345d51SChristoph Hellwig };
5089345d51SChristoph Hellwig 
to_mdev_device(struct device * dev)512a3d15f2SJason Gunthorpe static inline struct mdev_device *to_mdev_device(struct device *dev)
522a3d15f2SJason Gunthorpe {
532a3d15f2SJason Gunthorpe 	return container_of(dev, struct mdev_device, dev);
542a3d15f2SJason Gunthorpe }
557b96953bSKirti Wankhede 
567b96953bSKirti Wankhede /**
577b96953bSKirti Wankhede  * struct mdev_driver - Mediated device driver
58290aac5dSJason Gunthorpe  * @device_api: string to return for the device_api sysfs
59*9c799c22SJason Gunthorpe  * @max_instances: maximum number of instances supported (optional)
607b96953bSKirti Wankhede  * @probe: called when new device created
617b96953bSKirti Wankhede  * @remove: called when device removed
62f2fbc72eSChristoph Hellwig  * @get_available: Return the max number of instances that can be created
63685a1537SChristoph Hellwig  * @show_description: Print a description of the mtype
647b96953bSKirti Wankhede  * @driver: device driver structure
657b96953bSKirti Wankhede  **/
667b96953bSKirti Wankhede struct mdev_driver {
67290aac5dSJason Gunthorpe 	const char *device_api;
68*9c799c22SJason Gunthorpe 	unsigned int max_instances;
692a3d15f2SJason Gunthorpe 	int (*probe)(struct mdev_device *dev);
702a3d15f2SJason Gunthorpe 	void (*remove)(struct mdev_device *dev);
71f2fbc72eSChristoph Hellwig 	unsigned int (*get_available)(struct mdev_type *mtype);
72685a1537SChristoph Hellwig 	ssize_t (*show_description)(struct mdev_type *mtype, char *buf);
737b96953bSKirti Wankhede 	struct device_driver driver;
747b96953bSKirti Wankhede };
757b96953bSKirti Wankhede 
7689345d51SChristoph Hellwig int mdev_register_parent(struct mdev_parent *parent, struct device *dev,
77da44c340SChristoph Hellwig 		struct mdev_driver *mdev_driver, struct mdev_type **types,
78da44c340SChristoph Hellwig 		unsigned int nr_types);
7989345d51SChristoph Hellwig void mdev_unregister_parent(struct mdev_parent *parent);
807b96953bSKirti Wankhede 
8191b9969dSJason Gunthorpe int mdev_register_driver(struct mdev_driver *drv);
8250732af3SParav Pandit void mdev_unregister_driver(struct mdev_driver *drv);
837b96953bSKirti Wankhede 
mdev_dev(struct mdev_device * mdev)842a3d15f2SJason Gunthorpe static inline struct device *mdev_dev(struct mdev_device *mdev)
852a3d15f2SJason Gunthorpe {
862a3d15f2SJason Gunthorpe 	return &mdev->dev;
872a3d15f2SJason Gunthorpe }
889372e6feSAlex Williamson 
897b96953bSKirti Wankhede #endif /* MDEV_H */
90