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 */ 55struct 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 */ 89struct 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 */ 108struct 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 120struct cosm_device * 121cosm_register_device(struct device *pdev, struct cosm_hw_ops *hw_ops); 122void cosm_unregister_device(struct cosm_device *dev); 123int cosm_register_driver(struct cosm_driver *drv); 124void cosm_unregister_driver(struct cosm_driver *drv); 125struct cosm_device *cosm_find_cdev_by_id(int id); 126 127static inline struct cosm_device *dev_to_cosm(struct device *dev) 128{ 129 return container_of(dev, struct cosm_device, dev); 130} 131 132static 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 */ 137