Linux-libre 4.19.116-gnu
[librecmc/linux-libre.git] / drivers / misc / mic / bus / cosm_bus.h
1 /*
2  * Intel MIC Platform Software Stack (MPSS)
3  *
4  * Copyright(c) 2015 Intel Corporation.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License, version 2, as
8  * published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * General Public License for more details.
14  *
15  * The full GNU General Public License is included in this distribution in
16  * the file called "COPYING".
17  *
18  * Intel MIC COSM Bus Driver
19  */
20 #ifndef _COSM_BUS_H_
21 #define _COSM_BUS_H_
22
23 #include <linux/scif.h>
24 #include <linux/mic_common.h>
25 #include "../common/mic_dev.h"
26
27 /**
28  * cosm_device - representation of a cosm device
29  *
30  * @attr_group: Pointer to list of sysfs attribute groups.
31  * @sdev: Device for sysfs entries.
32  * @state: MIC state.
33  * @prev_state: MIC state previous to MIC_RESETTING
34  * @shutdown_status: MIC status reported by card for shutdown/crashes.
35  * @shutdown_status_int: Internal shutdown status maintained by the driver
36  * @cosm_mutex: Mutex for synchronizing access to data structures.
37  * @reset_trigger_work: Work for triggering reset requests.
38  * @scif_work: Work for handling per device SCIF connections
39  * @cmdline: Kernel command line.
40  * @firmware: Firmware file name.
41  * @ramdisk: Ramdisk file name.
42  * @bootmode: Boot mode i.e. "linux" or "elf" for flash updates.
43  * @log_buf_addr: Log buffer address for MIC.
44  * @log_buf_len: Log buffer length address for MIC.
45  * @state_sysfs: Sysfs dirent for notifying ring 3 about MIC state changes.
46  * @hw_ops: the hardware bus ops for this device.
47  * @dev: underlying device.
48  * @index: unique position on the cosm bus
49  * @dbg_dir: debug fs directory
50  * @newepd: new endpoint from scif accept to be assigned to this cdev
51  * @epd: SCIF endpoint for this cdev
52  * @heartbeat_watchdog_enable: if heartbeat watchdog is enabled for this cdev
53  * @sysfs_heartbeat_enable: sysfs setting for disabling heartbeat notification
54  */
55 struct cosm_device {
56         const struct attribute_group **attr_group;
57         struct device *sdev;
58         u8 state;
59         u8 prev_state;
60         u8 shutdown_status;
61         u8 shutdown_status_int;
62         struct mutex cosm_mutex;
63         struct work_struct reset_trigger_work;
64         struct work_struct scif_work;
65         char *cmdline;
66         char *firmware;
67         char *ramdisk;
68         char *bootmode;
69         void *log_buf_addr;
70         int *log_buf_len;
71         struct kernfs_node *state_sysfs;
72         struct cosm_hw_ops *hw_ops;
73         struct device dev;
74         int index;
75         struct dentry *dbg_dir;
76         scif_epd_t newepd;
77         scif_epd_t epd;
78         bool heartbeat_watchdog_enable;
79         bool sysfs_heartbeat_enable;
80 };
81
82 /**
83  * cosm_driver - operations for a cosm driver
84  *
85  * @driver: underlying device driver (populate name and owner).
86  * @probe: the function to call when a device is found.  Returns 0 or -errno.
87  * @remove: the function to call when a device is removed.
88  */
89 struct cosm_driver {
90         struct device_driver driver;
91         int (*probe)(struct cosm_device *dev);
92         void (*remove)(struct cosm_device *dev);
93 };
94
95 /**
96  * cosm_hw_ops - cosm bus ops
97  *
98  * @reset: trigger MIC reset
99  * @force_reset: force MIC reset
100  * @post_reset: inform MIC reset is complete
101  * @ready: is MIC ready for OS download
102  * @start: boot MIC
103  * @stop: prepare MIC for reset
104  * @family: return MIC HW family string
105  * @stepping: return MIC HW stepping string
106  * @aper: return MIC PCIe aperture
107  */
108 struct cosm_hw_ops {
109         void (*reset)(struct cosm_device *cdev);
110         void (*force_reset)(struct cosm_device *cdev);
111         void (*post_reset)(struct cosm_device *cdev, enum mic_states state);
112         bool (*ready)(struct cosm_device *cdev);
113         int (*start)(struct cosm_device *cdev, int id);
114         void (*stop)(struct cosm_device *cdev, bool force);
115         ssize_t (*family)(struct cosm_device *cdev, char *buf);
116         ssize_t (*stepping)(struct cosm_device *cdev, char *buf);
117         struct mic_mw *(*aper)(struct cosm_device *cdev);
118 };
119
120 struct cosm_device *
121 cosm_register_device(struct device *pdev, struct cosm_hw_ops *hw_ops);
122 void cosm_unregister_device(struct cosm_device *dev);
123 int cosm_register_driver(struct cosm_driver *drv);
124 void cosm_unregister_driver(struct cosm_driver *drv);
125 struct cosm_device *cosm_find_cdev_by_id(int id);
126
127 static inline struct cosm_device *dev_to_cosm(struct device *dev)
128 {
129         return container_of(dev, struct cosm_device, dev);
130 }
131
132 static inline struct cosm_driver *drv_to_cosm(struct device_driver *drv)
133 {
134         return container_of(drv, struct cosm_driver, driver);
135 }
136 #endif /* _COSM_BUS_H */