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