mdev.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. /*
  2. * Mediated device definition
  3. *
  4. * Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
  5. * Author: Neo Jia <cjia@nvidia.com>
  6. * Kirti Wankhede <kwankhede@nvidia.com>
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License version 2 as
  10. * published by the Free Software Foundation.
  11. */
  12. #ifndef MDEV_H
  13. #define MDEV_H
  14. /* Mediated device */
  15. struct mdev_device {
  16. struct device dev;
  17. struct mdev_parent *parent;
  18. uuid_le uuid;
  19. void *driver_data;
  20. /* internal */
  21. struct kref ref;
  22. struct list_head next;
  23. struct kobject *type_kobj;
  24. };
  25. /**
  26. * struct mdev_parent_ops - Structure to be registered for each parent device to
  27. * register the device to mdev module.
  28. *
  29. * @owner: The module owner.
  30. * @dev_attr_groups: Attributes of the parent device.
  31. * @mdev_attr_groups: Attributes of the mediated device.
  32. * @supported_type_groups: Attributes to define supported types. It is mandatory
  33. * to provide supported types.
  34. * @create: Called to allocate basic resources in parent device's
  35. * driver for a particular mediated device. It is
  36. * mandatory to provide create ops.
  37. * @kobj: kobject of type for which 'create' is called.
  38. * @mdev: mdev_device structure on of mediated device
  39. * that is being created
  40. * Returns integer: success (0) or error (< 0)
  41. * @remove: Called to free resources in parent device's driver for a
  42. * a mediated device. It is mandatory to provide 'remove'
  43. * ops.
  44. * @mdev: mdev_device device structure which is being
  45. * destroyed
  46. * Returns integer: success (0) or error (< 0)
  47. * @open: Open mediated device.
  48. * @mdev: mediated device.
  49. * Returns integer: success (0) or error (< 0)
  50. * @release: release mediated device
  51. * @mdev: mediated device.
  52. * @read: Read emulation callback
  53. * @mdev: mediated device structure
  54. * @buf: read buffer
  55. * @count: number of bytes to read
  56. * @ppos: address.
  57. * Retuns number on bytes read on success or error.
  58. * @write: Write emulation callback
  59. * @mdev: mediated device structure
  60. * @buf: write buffer
  61. * @count: number of bytes to be written
  62. * @ppos: address.
  63. * Retuns number on bytes written on success or error.
  64. * @ioctl: IOCTL callback
  65. * @mdev: mediated device structure
  66. * @cmd: ioctl command
  67. * @arg: arguments to ioctl
  68. * @mmap: mmap callback
  69. * @mdev: mediated device structure
  70. * @vma: vma structure
  71. * Parent device that support mediated device should be registered with mdev
  72. * module with mdev_parent_ops structure.
  73. **/
  74. struct mdev_parent_ops {
  75. struct module *owner;
  76. const struct attribute_group **dev_attr_groups;
  77. const struct attribute_group **mdev_attr_groups;
  78. struct attribute_group **supported_type_groups;
  79. int (*create)(struct kobject *kobj, struct mdev_device *mdev);
  80. int (*remove)(struct mdev_device *mdev);
  81. int (*open)(struct mdev_device *mdev);
  82. void (*release)(struct mdev_device *mdev);
  83. ssize_t (*read)(struct mdev_device *mdev, char __user *buf,
  84. size_t count, loff_t *ppos);
  85. ssize_t (*write)(struct mdev_device *mdev, const char __user *buf,
  86. size_t count, loff_t *ppos);
  87. ssize_t (*ioctl)(struct mdev_device *mdev, unsigned int cmd,
  88. unsigned long arg);
  89. int (*mmap)(struct mdev_device *mdev, struct vm_area_struct *vma);
  90. };
  91. /* interface for exporting mdev supported type attributes */
  92. struct mdev_type_attribute {
  93. struct attribute attr;
  94. ssize_t (*show)(struct kobject *kobj, struct device *dev, char *buf);
  95. ssize_t (*store)(struct kobject *kobj, struct device *dev,
  96. const char *buf, size_t count);
  97. };
  98. #define MDEV_TYPE_ATTR(_name, _mode, _show, _store) \
  99. struct mdev_type_attribute mdev_type_attr_##_name = \
  100. __ATTR(_name, _mode, _show, _store)
  101. #define MDEV_TYPE_ATTR_RW(_name) \
  102. struct mdev_type_attribute mdev_type_attr_##_name = __ATTR_RW(_name)
  103. #define MDEV_TYPE_ATTR_RO(_name) \
  104. struct mdev_type_attribute mdev_type_attr_##_name = __ATTR_RO(_name)
  105. #define MDEV_TYPE_ATTR_WO(_name) \
  106. struct mdev_type_attribute mdev_type_attr_##_name = __ATTR_WO(_name)
  107. /**
  108. * struct mdev_driver - Mediated device driver
  109. * @name: driver name
  110. * @probe: called when new device created
  111. * @remove: called when device removed
  112. * @driver: device driver structure
  113. *
  114. **/
  115. struct mdev_driver {
  116. const char *name;
  117. int (*probe)(struct device *dev);
  118. void (*remove)(struct device *dev);
  119. struct device_driver driver;
  120. };
  121. #define to_mdev_driver(drv) container_of(drv, struct mdev_driver, driver)
  122. #define to_mdev_device(dev) container_of(dev, struct mdev_device, dev)
  123. static inline void *mdev_get_drvdata(struct mdev_device *mdev)
  124. {
  125. return mdev->driver_data;
  126. }
  127. static inline void mdev_set_drvdata(struct mdev_device *mdev, void *data)
  128. {
  129. mdev->driver_data = data;
  130. }
  131. extern struct bus_type mdev_bus_type;
  132. #define dev_is_mdev(d) ((d)->bus == &mdev_bus_type)
  133. extern int mdev_register_device(struct device *dev,
  134. const struct mdev_parent_ops *ops);
  135. extern void mdev_unregister_device(struct device *dev);
  136. extern int mdev_register_driver(struct mdev_driver *drv, struct module *owner);
  137. extern void mdev_unregister_driver(struct mdev_driver *drv);
  138. extern struct device *mdev_parent_dev(struct mdev_device *mdev);
  139. #endif /* MDEV_H */