17b96953bSKirti Wankhede /* 27b96953bSKirti Wankhede * Mediated device definition 37b96953bSKirti Wankhede * 47b96953bSKirti Wankhede * Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved. 57b96953bSKirti Wankhede * Author: Neo Jia <cjia@nvidia.com> 67b96953bSKirti Wankhede * Kirti Wankhede <kwankhede@nvidia.com> 77b96953bSKirti Wankhede * 87b96953bSKirti Wankhede * This program is free software; you can redistribute it and/or modify 97b96953bSKirti Wankhede * it under the terms of the GNU General Public License version 2 as 107b96953bSKirti Wankhede * published by the Free Software Foundation. 117b96953bSKirti Wankhede */ 127b96953bSKirti Wankhede 137b96953bSKirti Wankhede #ifndef MDEV_H 147b96953bSKirti Wankhede #define MDEV_H 157b96953bSKirti Wankhede 1699e3123eSAlex Williamson struct mdev_device; 177b96953bSKirti Wankhede 187b96953bSKirti Wankhede /** 1942930553SAlex Williamson * struct mdev_parent_ops - Structure to be registered for each parent device to 207b96953bSKirti Wankhede * register the device to mdev module. 217b96953bSKirti Wankhede * 227b96953bSKirti Wankhede * @owner: The module owner. 237b96953bSKirti Wankhede * @dev_attr_groups: Attributes of the parent device. 247b96953bSKirti Wankhede * @mdev_attr_groups: Attributes of the mediated device. 257b96953bSKirti Wankhede * @supported_type_groups: Attributes to define supported types. It is mandatory 267b96953bSKirti Wankhede * to provide supported types. 277b96953bSKirti Wankhede * @create: Called to allocate basic resources in parent device's 287b96953bSKirti Wankhede * driver for a particular mediated device. It is 297b96953bSKirti Wankhede * mandatory to provide create ops. 307b96953bSKirti Wankhede * @kobj: kobject of type for which 'create' is called. 317b96953bSKirti Wankhede * @mdev: mdev_device structure on of mediated device 327b96953bSKirti Wankhede * that is being created 337b96953bSKirti Wankhede * Returns integer: success (0) or error (< 0) 347b96953bSKirti Wankhede * @remove: Called to free resources in parent device's driver for a 357b96953bSKirti Wankhede * a mediated device. It is mandatory to provide 'remove' 367b96953bSKirti Wankhede * ops. 377b96953bSKirti Wankhede * @mdev: mdev_device device structure which is being 387b96953bSKirti Wankhede * destroyed 397b96953bSKirti Wankhede * Returns integer: success (0) or error (< 0) 407b96953bSKirti Wankhede * @open: Open mediated device. 417b96953bSKirti Wankhede * @mdev: mediated device. 427b96953bSKirti Wankhede * Returns integer: success (0) or error (< 0) 437b96953bSKirti Wankhede * @release: release mediated device 447b96953bSKirti Wankhede * @mdev: mediated device. 457b96953bSKirti Wankhede * @read: Read emulation callback 467b96953bSKirti Wankhede * @mdev: mediated device structure 477b96953bSKirti Wankhede * @buf: read buffer 487b96953bSKirti Wankhede * @count: number of bytes to read 497b96953bSKirti Wankhede * @ppos: address. 507b96953bSKirti Wankhede * Retuns number on bytes read on success or error. 517b96953bSKirti Wankhede * @write: Write emulation callback 527b96953bSKirti Wankhede * @mdev: mediated device structure 537b96953bSKirti Wankhede * @buf: write buffer 547b96953bSKirti Wankhede * @count: number of bytes to be written 557b96953bSKirti Wankhede * @ppos: address. 567b96953bSKirti Wankhede * Retuns number on bytes written on success or error. 577b96953bSKirti Wankhede * @ioctl: IOCTL callback 587b96953bSKirti Wankhede * @mdev: mediated device structure 597b96953bSKirti Wankhede * @cmd: ioctl command 607b96953bSKirti Wankhede * @arg: arguments to ioctl 617b96953bSKirti Wankhede * @mmap: mmap callback 627b96953bSKirti Wankhede * @mdev: mediated device structure 637b96953bSKirti Wankhede * @vma: vma structure 647b96953bSKirti Wankhede * Parent device that support mediated device should be registered with mdev 6542930553SAlex Williamson * module with mdev_parent_ops structure. 667b96953bSKirti Wankhede **/ 6742930553SAlex Williamson struct mdev_parent_ops { 687b96953bSKirti Wankhede struct module *owner; 697b96953bSKirti Wankhede const struct attribute_group **dev_attr_groups; 707b96953bSKirti Wankhede const struct attribute_group **mdev_attr_groups; 717b96953bSKirti Wankhede struct attribute_group **supported_type_groups; 727b96953bSKirti Wankhede 737b96953bSKirti Wankhede int (*create)(struct kobject *kobj, struct mdev_device *mdev); 747b96953bSKirti Wankhede int (*remove)(struct mdev_device *mdev); 757b96953bSKirti Wankhede int (*open)(struct mdev_device *mdev); 767b96953bSKirti Wankhede void (*release)(struct mdev_device *mdev); 777b96953bSKirti Wankhede ssize_t (*read)(struct mdev_device *mdev, char __user *buf, 787b96953bSKirti Wankhede size_t count, loff_t *ppos); 797b96953bSKirti Wankhede ssize_t (*write)(struct mdev_device *mdev, const char __user *buf, 807b96953bSKirti Wankhede size_t count, loff_t *ppos); 81*c6ef7fd4SPaul Gortmaker long (*ioctl)(struct mdev_device *mdev, unsigned int cmd, 827b96953bSKirti Wankhede unsigned long arg); 837b96953bSKirti Wankhede int (*mmap)(struct mdev_device *mdev, struct vm_area_struct *vma); 847b96953bSKirti Wankhede }; 857b96953bSKirti Wankhede 867b96953bSKirti Wankhede /* interface for exporting mdev supported type attributes */ 877b96953bSKirti Wankhede struct mdev_type_attribute { 887b96953bSKirti Wankhede struct attribute attr; 897b96953bSKirti Wankhede ssize_t (*show)(struct kobject *kobj, struct device *dev, char *buf); 907b96953bSKirti Wankhede ssize_t (*store)(struct kobject *kobj, struct device *dev, 917b96953bSKirti Wankhede const char *buf, size_t count); 927b96953bSKirti Wankhede }; 937b96953bSKirti Wankhede 947b96953bSKirti Wankhede #define MDEV_TYPE_ATTR(_name, _mode, _show, _store) \ 957b96953bSKirti Wankhede struct mdev_type_attribute mdev_type_attr_##_name = \ 967b96953bSKirti Wankhede __ATTR(_name, _mode, _show, _store) 977b96953bSKirti Wankhede #define MDEV_TYPE_ATTR_RW(_name) \ 987b96953bSKirti Wankhede struct mdev_type_attribute mdev_type_attr_##_name = __ATTR_RW(_name) 997b96953bSKirti Wankhede #define MDEV_TYPE_ATTR_RO(_name) \ 1007b96953bSKirti Wankhede struct mdev_type_attribute mdev_type_attr_##_name = __ATTR_RO(_name) 1017b96953bSKirti Wankhede #define MDEV_TYPE_ATTR_WO(_name) \ 1027b96953bSKirti Wankhede struct mdev_type_attribute mdev_type_attr_##_name = __ATTR_WO(_name) 1037b96953bSKirti Wankhede 1047b96953bSKirti Wankhede /** 1057b96953bSKirti Wankhede * struct mdev_driver - Mediated device driver 1067b96953bSKirti Wankhede * @name: driver name 1077b96953bSKirti Wankhede * @probe: called when new device created 1087b96953bSKirti Wankhede * @remove: called when device removed 1097b96953bSKirti Wankhede * @driver: device driver structure 1107b96953bSKirti Wankhede * 1117b96953bSKirti Wankhede **/ 1127b96953bSKirti Wankhede struct mdev_driver { 1137b96953bSKirti Wankhede const char *name; 1147b96953bSKirti Wankhede int (*probe)(struct device *dev); 1157b96953bSKirti Wankhede void (*remove)(struct device *dev); 1167b96953bSKirti Wankhede struct device_driver driver; 1177b96953bSKirti Wankhede }; 1187b96953bSKirti Wankhede 1197b96953bSKirti Wankhede #define to_mdev_driver(drv) container_of(drv, struct mdev_driver, driver) 1207b96953bSKirti Wankhede 12199e3123eSAlex Williamson extern void *mdev_get_drvdata(struct mdev_device *mdev); 12299e3123eSAlex Williamson extern void mdev_set_drvdata(struct mdev_device *mdev, void *data); 12399e3123eSAlex Williamson extern uuid_le mdev_uuid(struct mdev_device *mdev); 1247b96953bSKirti Wankhede 1257b96953bSKirti Wankhede extern struct bus_type mdev_bus_type; 1267b96953bSKirti Wankhede 1277b96953bSKirti Wankhede extern int mdev_register_device(struct device *dev, 12842930553SAlex Williamson const struct mdev_parent_ops *ops); 1297b96953bSKirti Wankhede extern void mdev_unregister_device(struct device *dev); 1307b96953bSKirti Wankhede 1317b96953bSKirti Wankhede extern int mdev_register_driver(struct mdev_driver *drv, struct module *owner); 1327b96953bSKirti Wankhede extern void mdev_unregister_driver(struct mdev_driver *drv); 1337b96953bSKirti Wankhede 1349372e6feSAlex Williamson extern struct device *mdev_parent_dev(struct mdev_device *mdev); 13599e3123eSAlex Williamson extern struct device *mdev_dev(struct mdev_device *mdev); 13699e3123eSAlex Williamson extern struct mdev_device *mdev_from_dev(struct device *dev); 1379372e6feSAlex Williamson 1387b96953bSKirti Wankhede #endif /* MDEV_H */ 139