| 1 |
|
| 2 | |
| 3 | * Header file for DFL driver and device API
|
| 4 | *
|
| 5 | * Copyright (C) 2020 Intel Corporation, Inc.
|
| 6 |
|
| 7 |
|
| 8 | #ifndef __LINUX_DFL_H
|
| 9 | #define __LINUX_DFL_H
|
| 10 |
|
| 11 | #include <linux/device.h>
|
| 12 | #include <linux/mod_devicetable.h>
|
| 13 |
|
| 14 | |
| 15 | * enum dfl_id_type - define the DFL FIU types
|
| 16 |
|
| 17 | enum dfl_id_type {
|
| 18 | FME_ID = 0,
|
| 19 | PORT_ID = 1,
|
| 20 | DFL_ID_MAX,
|
| 21 | };
|
| 22 |
|
| 23 | |
| 24 | * struct dfl_device - represent an dfl device on dfl bus
|
| 25 | *
|
| 26 | * @dev: generic device interface.
|
| 27 | * @id: id of the dfl device.
|
| 28 | * @type: type of DFL FIU of the device. See enum dfl_id_type.
|
| 29 | * @feature_id: feature identifier local to its DFL FIU type.
|
| 30 | * @revision: revision of this dfl device feature.
|
| 31 | * @mmio_res: mmio resource of this dfl device.
|
| 32 | * @irqs: list of Linux IRQ numbers of this dfl device.
|
| 33 | * @num_irqs: number of IRQs supported by this dfl device.
|
| 34 | * @cdev: pointer to DFL FPGA container device this dfl device belongs to.
|
| 35 | * @id_entry: matched id entry in dfl driver's id table.
|
| 36 | * @dfh_version: version of DFH for the device
|
| 37 | * @param_size: size of the block parameters in bytes
|
| 38 | * @params: pointer to block of parameters copied memory
|
| 39 |
|
| 40 | struct dfl_device {
|
| 41 | struct device dev;
|
| 42 | int id;
|
| 43 | u16 type;
|
| 44 | u16 feature_id;
|
| 45 | u8 revision;
|
| 46 | struct resource mmio_res;
|
| 47 | int *irqs;
|
| 48 | unsigned int num_irqs;
|
| 49 | struct dfl_fpga_cdev *cdev;
|
| 50 | const struct dfl_device_id *id_entry;
|
| 51 | u8 dfh_version;
|
| 52 | unsigned int param_size;
|
| 53 | void *params;
|
| 54 | };
|
| 55 |
|
| 56 | |
| 57 | * struct dfl_driver - represent an dfl device driver
|
| 58 | *
|
| 59 | * @drv: driver model structure.
|
| 60 | * @id_table: pointer to table of device IDs the driver is interested in.
|
| 61 | * { } member terminated.
|
| 62 | * @probe: mandatory callback for device binding.
|
| 63 | * @remove: callback for device unbinding.
|
| 64 |
|
| 65 | struct dfl_driver {
|
| 66 | struct device_driver drv;
|
| 67 | const struct dfl_device_id *id_table;
|
| 68 |
|
| 69 | int (*probe)(struct dfl_device *dfl_dev);
|
| 70 | void (*remove)(struct dfl_device *dfl_dev);
|
| 71 | };
|
| 72 |
|
| 73 | #define to_dfl_dev(d) container_of(d, struct dfl_device, dev)
|
| 74 | #define to_dfl_drv(d) container_of(d, struct dfl_driver, drv)
|
| 75 |
|
| 76 | |
| 77 | * use a macro to avoid include chaining to get THIS_MODULE.
|
| 78 |
|
| 79 | #define dfl_driver_register(drv) \
|
| 80 | __dfl_driver_register(drv, THIS_MODULE)
|
| 81 | int __dfl_driver_register(struct dfl_driver *dfl_drv, struct module *owner);
|
| 82 | void dfl_driver_unregister(struct dfl_driver *dfl_drv);
|
| 83 |
|
| 84 | |
| 85 | * module_dfl_driver() - Helper macro for drivers that don't do
|
| 86 | * anything special in module init/exit. This eliminates a lot of
|
| 87 | * boilerplate. Each module may only use this macro once, and
|
| 88 | * calling it replaces module_init() and module_exit().
|
| 89 |
|
| 90 | #define module_dfl_driver(__dfl_driver) \
|
| 91 | module_driver(__dfl_driver, dfl_driver_register, \
|
| 92 | dfl_driver_unregister)
|
| 93 |
|
| 94 | void *dfh_find_param(struct dfl_device *dfl_dev, int param_id, size_t *pcount);
|
| 95 | #endif
|