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 Gunthorpestatic 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 Gunthorpestatic 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